From 83042634cdc0e8c36b5d66ddfd95db1669850124 Mon Sep 17 00:00:00 2001 From: Jakub Sadowski Date: Fri, 8 Jan 2021 16:31:36 +0100 Subject: [PATCH 01/19] init --- sdks/go/build.gradle | 2 +- sdks/go/container/build.gradle | 2 + sdks/go/pkg/beam/core/graph/coder/map_test.go | 11 +- sdks/go/pkg/beam/core/graph/coder/row.go | 337 +- .../pkg/beam/core/graph/coder/row_decoder.go | 308 + .../pkg/beam/core/graph/coder/row_encoder.go | 271 + sdks/go/pkg/beam/core/graph/coder/row_test.go | 488 +- .../core/graph/coder/testutil/testutil.go | 154 + .../graph/coder/testutil/testutil_test.go | 201 + sdks/go/pkg/beam/core/metrics/metrics.go | 39 + sdks/go/pkg/beam/core/runtime/graphx/xlang.go | 9 +- .../beam/core/runtime/metricsx/metricsx.go | 38 +- sdks/go/pkg/beam/pipeline.go | 1 + sdks/go/pkg/beam/runners/dataflow/dataflow.go | 5 +- .../runners/dataflow/dataflowlib/execute.go | 57 +- .../beam/runners/dataflow/dataflowlib/job.go | 8 + .../runners/dataflow/dataflowlib/metrics.go | 124 + .../dataflow/dataflowlib/metrics_test.go | 133 + .../runners/universal/runnerlib/compile.go | 13 +- .../runners/universal/runnerlib/execute.go | 21 +- .../pkg/beam/runners/universal/universal.go | 1 + sdks/go/pkg/beam/testing/ptest/ptest.go | 21 + sdks/go/test/build.gradle | 94 +- .../test/integration/{ => driver}/driver.go | 0 sdks/go/test/integration/integration.go | 147 + .../test/integration/primitives/cogbk_test.go | 16 +- .../integration/primitives/flatten_test.go | 11 +- .../test/integration/primitives/pardo_test.go | 16 +- .../integration/synthetic/synthetic_test.go | 75 + .../integration/wordcount/wordcount_test.go | 6 + sdks/go/test/integration/xlang/xlang_test.go | 260 + sdks/go/test/load/build.gradle | 4 + sdks/go/test/load/cogbk/cogbk.go | 106 + sdks/go/test/load/combine/combine.go | 87 + .../go/test/load/group_by_key/group_by_key.go | 89 + sdks/go/test/load/sideinput/sideinput.go | 100 + sdks/go/test/run_integration_tests.sh | 2 +- sdks/go/test/run_validatesrunner_tests.sh | 291 + sdks/java/build-tools/beam-linkage-check.sh | 80 +- .../src/main/resources/beam/checkstyle.xml | 17 + .../src/main/resources/beam/suppressions.xml | 4 + sdks/java/container/common.gradle | 2 + sdks/java/core/build.gradle | 1 - .../beam/sdk/annotations/Experimental.java | 7 - .../java/org/apache/beam/sdk/io/AvroIO.java | 45 +- .../java/org/apache/beam/sdk/io/FileIO.java | 5 +- .../java/org/apache/beam/sdk/io/Read.java | 97 +- .../java/org/apache/beam/sdk/io/TextIO.java | 5 +- .../schemas/FieldValueTypeInformation.java | 53 +- .../apache/beam/sdk/schemas/RowMessages.java | 132 + .../beam/sdk/schemas/utils/AvroUtils.java | 4 +- .../org/apache/beam/sdk/state/Timers.java | 2 +- .../beam/sdk/testing/CoderProperties.java | 2 +- .../beam/sdk/testing/CombineFnTester.java | 2 +- .../org/apache/beam/sdk/testing/PAssert.java | 2 +- .../beam/sdk/testing/SourceTestUtils.java | 2 +- .../apache/beam/sdk/testing/TestPipeline.java | 45 + .../beam/sdk/testing/WindowFnTestUtils.java | 2 +- .../sdk/transforms/ApproximateUnique.java | 20 +- .../beam/sdk/transforms/Deduplicate.java | 3 - .../org/apache/beam/sdk/transforms/DoFn.java | 13 - .../beam/sdk/transforms/PeriodicSequence.java | 3 - .../org/apache/beam/sdk/transforms/Watch.java | 3 - .../splittabledofn/ByteKeyRangeTracker.java | 3 - .../GrowableOffsetRangeTracker.java | 3 - .../splittabledofn/HasDefaultTracker.java | 4 - .../HasDefaultWatermarkEstimator.java | 3 - .../ManualWatermarkEstimator.java | 3 - .../splittabledofn/OffsetRangeTracker.java | 3 - .../splittabledofn/RestrictionTracker.java | 3 - .../splittabledofn/SplitResult.java | 3 - .../TimestampObservingWatermarkEstimator.java | 3 - .../splittabledofn/WatermarkEstimator.java | 3 - .../splittabledofn/WatermarkEstimators.java | 3 - .../splittabledofn/package-info.java | 3 - .../org/apache/beam/sdk/sdk.properties | 3 - .../org/apache/beam/sdk/PipelineTest.java | 2 +- .../apache/beam/sdk/coders/AvroCoderTest.java | 2 +- .../beam/sdk/coders/BigDecimalCoderTest.java | 2 +- .../sdk/coders/BigEndianIntegerCoderTest.java | 2 +- .../sdk/coders/BigEndianLongCoderTest.java | 2 +- .../beam/sdk/coders/BigIntegerCoderTest.java | 2 +- .../beam/sdk/coders/BitSetCoderTest.java | 2 +- .../beam/sdk/coders/ByteArrayCoderTest.java | 2 +- .../apache/beam/sdk/coders/ByteCoderTest.java | 2 +- .../org/apache/beam/sdk/coders/CoderTest.java | 2 +- .../beam/sdk/coders/CollectionCoderTest.java | 2 +- .../beam/sdk/coders/DefaultCoderTest.java | 2 +- .../beam/sdk/coders/DelegateCoderTest.java | 2 +- .../beam/sdk/coders/DoubleCoderTest.java | 2 +- .../beam/sdk/coders/DurationCoderTest.java | 2 +- .../beam/sdk/coders/FloatCoderTest.java | 2 +- .../beam/sdk/coders/InstantCoderTest.java | 2 +- .../beam/sdk/coders/IterableCoderTest.java | 2 +- .../apache/beam/sdk/coders/KvCoderTest.java | 2 +- .../apache/beam/sdk/coders/ListCoderTest.java | 2 +- .../apache/beam/sdk/coders/MapCoderTest.java | 2 +- .../beam/sdk/coders/NullableCoderTest.java | 2 +- .../coders/PCollectionCustomCoderTest.java | 2 +- .../sdk/coders/SerializableCoderTest.java | 2 +- .../apache/beam/sdk/coders/SetCoderTest.java | 2 +- .../sdk/coders/StringDelegateCoderTest.java | 2 +- .../beam/sdk/coders/StringUtf8CoderTest.java | 2 +- .../beam/sdk/coders/StructuredCoderTest.java | 11 +- .../sdk/coders/TextualIntegerCoderTest.java | 2 +- .../beam/sdk/coders/VarIntCoderTest.java | 2 +- .../beam/sdk/coders/VarLongCoderTest.java | 2 +- .../apache/beam/sdk/coders/VoidCoderTest.java | 2 +- .../org/apache/beam/sdk/io/AvroIOTest.java | 2 +- .../apache/beam/sdk/io/AvroSourceTest.java | 2 +- .../BoundedReadFromUnboundedSourceTest.java | 2 +- .../beam/sdk/io/CompressedSourceTest.java | 2 +- .../beam/sdk/io/CountingSourceTest.java | 2 +- .../apache/beam/sdk/io/FileBasedSinkTest.java | 2 +- .../beam/sdk/io/FileBasedSourceTest.java | 2 +- .../apache/beam/sdk/io/FileSystemsTest.java | 2 +- .../sdk/io/LocalFileSystemRegistrarTest.java | 2 +- .../beam/sdk/io/LocalFileSystemTest.java | 2 +- .../java/org/apache/beam/sdk/io/ReadTest.java | 130 + .../apache/beam/sdk/io/TextIOReadTest.java | 2 +- .../apache/beam/sdk/io/TextIOWriteTest.java | 2 +- .../apache/beam/sdk/io/WriteFilesTest.java | 2 +- .../ByteKeyRangeEstimateFractionTest.java | 2 +- .../range/ByteKeyRangeInterpolateKeyTest.java | 2 +- .../beam/sdk/io/range/ByteKeyRangeTest.java | 2 +- .../apache/beam/sdk/io/range/ByteKeyTest.java | 2 +- .../apache/beam/sdk/metrics/MetricsTest.java | 2 +- .../options/PipelineOptionsFactoryTest.java | 2 +- .../options/ProxyInvocationHandlerTest.java | 2 +- .../beam/sdk/runners/PipelineRunnerTest.java | 2 +- .../sdk/runners/TransformHierarchyTest.java | 2 +- .../beam/sdk/runners/TransformTreeTest.java | 2 +- .../beam/sdk/schemas/AutoValueSchemaTest.java | 4 +- .../beam/sdk/schemas/JavaBeanSchemaTest.java | 38 +- .../beam/sdk/schemas/JavaFieldSchemaTest.java | 6 +- .../beam/sdk/schemas/SchemaCoderTest.java | 2 +- .../schemas/transforms/CastValidatorTest.java | 2 +- .../sdk/schemas/transforms/CoGroupTest.java | 2 +- .../sdk/schemas/transforms/GroupTest.java | 2 +- .../sdk/schemas/utils/JavaBeanUtilsTest.java | 26 +- .../beam/sdk/schemas/utils/POJOUtilsTest.java | 6 +- .../sdk/schemas/utils/SchemaZipFoldTest.java | 2 +- .../beam/sdk/schemas/utils/TestJavaBeans.java | 17 + .../beam/sdk/state/StateContextsTest.java | 2 +- .../beam/sdk/testing/CoderPropertiesTest.java | 2 +- .../beam/sdk/testing/CombineFnTesterTest.java | 2 +- .../apache/beam/sdk/testing/PAssertTest.java | 2 +- .../beam/sdk/testing/PaneExtractorsTest.java | 2 +- .../sdk/testing/SerializableMatchersTest.java | 2 +- .../beam/sdk/testing/StaticWindowsTest.java | 2 +- .../beam/sdk/testing/TestPipelineTest.java | 2 +- .../beam/sdk/testing/WindowSupplierTest.java | 2 +- .../beam/sdk/transforms/CombineFnsTest.java | 2 +- .../beam/sdk/transforms/CombineTest.java | 2 +- .../beam/sdk/transforms/CreateTest.java | 2 +- .../beam/sdk/transforms/DistinctTest.java | 2 +- .../apache/beam/sdk/transforms/DoFnTest.java | 2 +- .../beam/sdk/transforms/DoFnTesterTest.java | 2 +- .../beam/sdk/transforms/FlattenTest.java | 2 +- .../beam/sdk/transforms/GroupByKeyTest.java | 2 +- .../beam/sdk/transforms/PTransformTest.java | 2 +- .../apache/beam/sdk/transforms/ParDoTest.java | 2 +- .../apache/beam/sdk/transforms/ReifyTest.java | 2 +- .../sdk/transforms/ReifyTimestampsTest.java | 2 +- .../beam/sdk/transforms/ReshuffleTest.java | 2 +- .../sdk/transforms/SimpleFunctionTest.java | 2 +- .../beam/sdk/transforms/WithFailuresTest.java | 2 +- .../display/DisplayDataEvaluatorTest.java | 2 +- .../display/DisplayDataMatchersTest.java | 2 +- .../transforms/display/DisplayDataTest.java | 2 +- .../sdk/transforms/join/CoGbkResultTest.java | 2 +- .../sdk/transforms/join/CoGroupByKeyTest.java | 2 +- .../sdk/transforms/join/UnionCoderTest.java | 2 +- .../transforms/reflect/DoFnInvokersTest.java | 2 +- .../reflect/DoFnSignaturesTest.java | 2 +- .../reflect/OnTimerInvokersTest.java | 2 +- .../windowing/FixedWindowsTest.java | 2 +- .../windowing/IntervalWindowTest.java | 2 +- .../transforms/windowing/RepeatedlyTest.java | 2 +- .../transforms/windowing/SessionsTest.java | 2 +- .../windowing/SlidingWindowsTest.java | 2 +- .../sdk/transforms/windowing/WindowTest.java | 2 +- .../apache/beam/sdk/util/ApiSurfaceTest.java | 2 +- ...fferedElementCountingOutputStreamTest.java | 2 +- .../beam/sdk/util/FluentBackoffTest.java | 2 +- .../apache/beam/sdk/util/HistogramTest.java | 2 +- .../apache/beam/sdk/util/MoreFuturesTest.java | 2 +- .../apache/beam/sdk/util/ReleaseInfoTest.java | 2 +- .../beam/sdk/util/UserCodeExceptionTest.java | 2 +- .../org/apache/beam/sdk/util/VarIntTest.java | 2 +- .../beam/sdk/util/WindowedValueTest.java | 2 +- .../apache/beam/sdk/util/ZipFilesTest.java | 2 +- .../sdk/util/common/ReflectHelpersTest.java | 2 +- .../org/apache/beam/sdk/values/KVTest.java | 2 +- .../beam/sdk/values/PCollectionListTest.java | 2 +- .../beam/sdk/values/PCollectionTupleTest.java | 2 +- .../apache/beam/sdk/values/TupleTagTest.java | 2 +- .../beam/sdk/values/TypeDescriptorsTest.java | 2 +- .../beam/sdk/values/TypedPValueTest.java | 2 +- .../sdk/expansion/service/ExternalTest.java | 2 +- .../extensions/gcp/util/GceMetadataUtil.java | 4 +- .../storage/GcsFileSystemRegistrarTest.java | 2 +- .../gcp/storage/GcsFileSystemTest.java | 2 +- .../sdk/extensions/gcp/util/GcsUtilTest.java | 2 +- ...cyRecordingHttpRequestInitializerTest.java | 2 +- .../util/RetryHttpRequestInitializerTest.java | 2 +- .../gcp/util/gcsfs/GcsPathTest.java | 2 +- sdks/java/extensions/ml/build.gradle | 33 +- .../protobuf/ProtoMessageSchema.java | 68 +- .../protobuf/ByteStringCoderTest.java | 2 +- .../extensions/protobuf/ProtobufUtilTest.java | 2 +- ...xternalSchemaIOTransformRegistrarTest.java | 4 +- .../sketching/TDigestQuantilesTest.java | 2 +- .../sorter/ExternalSorterBenchmark.java | 6 +- .../sdk/extensions/sorter/SortValuesTest.java | 2 +- sdks/java/extensions/sql/build.gradle | 16 +- .../datacatalog/DataCatalogTableProvider.java | 61 +- .../provider/datacatalog/SchemaUtils.java | 93 + .../provider/datacatalog/SchemaUtilsTest.java | 157 + .../extensions/sql/jdbc/BeamSqlLineIT.java | 2 +- .../extensions/sql/jdbc/BeamSqlLineTest.java | 2 +- .../sql/impl/ScalarFnReflector.java | 73 + .../sql/impl/ScalarFunctionImpl.java | 47 +- .../provider/bigtable/BigtableFilter.java | 136 + .../meta/provider/bigtable/BigtableTable.java | 236 + .../bigtable/BigtableTableProvider.java | 85 + .../meta/provider/bigtable/package-info.java} | 10 +- .../provider/kafka/BeamKafkaThriftTable.java | 138 + .../provider/kafka/KafkaTableProvider.java | 56 +- .../sql/BeamSqlDslSqlStdOperatorsTest.java | 2 +- .../extensions/sql/impl/JdbcDriverTest.java | 2 +- .../sql/impl/ScalarFnReflectorTest.java | 141 + .../bigtable/BigtableClientWrapper.java | 115 + .../provider/bigtable/BigtableFilterTest.java | 114 + .../BigtableTableCreationFailuresTest.java | 145 + .../bigtable/BigtableTableFlatTest.java | 193 + .../provider/bigtable/BigtableTableIT.java | 200 + .../bigtable/BigtableTableTestUtils.java | 237 + .../bigtable/BigtableTableWithRowsTest.java | 138 + .../kafka/BeamKafkaTableProtoTest.java | 2 +- .../kafka/BeamKafkaTableThriftTest.java | 124 + .../provider/kafka/KafkaTableProviderIT.java | 214 +- .../kafka/KafkaTableProviderProtoIT.java | 53 - .../kafka/KafkaTableProviderTest.java | 55 +- .../kafka/thrift/ItThriftMessage.java | 612 + .../kafka/thrift/SimpleThriftMessage.java | 509 + .../kafka/thrift/TestThriftMessage.java | 881 + .../meta/provider/pubsub/PubsubAvroIT.java | 102 - .../meta/provider/pubsub/PubsubJsonIT.java | 76 - .../pubsub/PubsubTableProviderIT.java | 273 +- .../provider/text/TextTableProviderTest.java | 2 +- .../sql/meta/store/InMemoryMetaStoreTest.java | 2 +- .../sql/src/test/thrift/kafka/messages.thrift | 46 + sdks/java/extensions/sql/udf/build.gradle | 30 + .../sdk/extensions/sql/udf/AggregateFn.java | 71 + .../beam/sdk/extensions/sql/udf/ScalarFn.java | 53 + .../sdk/extensions/sql/udf/UdfProvider.java} | 30 +- .../sdk/extensions/sql/udf/package-info.java | 26 + .../extensions/sql/zetasql/SqlAnalyzer.java | 6 + .../sql/zetasql/ZetaSQLPlannerImpl.java | 5 +- .../translation/ConversionContext.java | 2 +- .../translation/ExpressionConverter.java | 11 +- .../sql/zetasql/translation/SqlOperators.java | 76 +- .../translation/UserFunctionDefinitions.java | 30 +- .../ZetaSqlScalarFunctionImpl.java | 86 + .../zetasketch/ApproximateCountDistinct.java | 288 + .../ApproximateCountDistinctTest.java | 342 + .../fn/data/BeamFnDataInboundObserver.java | 35 +- .../sdk/fn/data/DecodingFnDataReceiver.java | 46 + .../apache/beam/sdk/fn/IdGeneratorsTest.java | 2 +- .../fn/channel/SocketAddressFactoryTest.java | 2 +- .../data/BeamFnDataGrpcMultiplexerTest.java | 2 +- ...izeBasedBufferingOutboundObserverTest.java | 2 +- ...ompletableFutureInboundDataClientTest.java | 2 +- .../sdk/fn/data/RemoteGrpcPortReadTest.java | 2 +- .../sdk/fn/data/RemoteGrpcPortWriteTest.java | 2 +- .../RestrictionTrackersTest.java | 2 +- .../sdk/fn/stream/AdvancingPhaserTest.java | 2 +- .../beam/sdk/fn/stream/DataStreamsTest.java | 2 +- .../stream/OutboundObserverFactoryTest.java | 2 +- .../beam/sdk/fn/test/TestStreamsTest.java | 2 +- .../beam/fn/harness/ToStringFnRunner.java | 66 + .../harness/control/ProcessBundleHandler.java | 87 +- .../fn/harness/data/BeamFnDataClient.java | 14 +- .../fn/harness/data/BeamFnDataGrpcClient.java | 10 +- .../data/QueueingBeamFnDataClient.java | 11 +- .../fn/harness/AssignWindowsRunnerTest.java | 2 +- .../fn/harness/BeamFnDataReadRunnerTest.java | 2 +- .../fn/harness/BeamFnDataWriteRunnerTest.java | 2 +- .../beam/fn/harness/CombineRunnersTest.java | 2 +- .../beam/fn/harness/FlattenRunnerTest.java | 2 +- .../beam/fn/harness/FnApiDoFnRunnerTest.java | 2 +- .../beam/fn/harness/MapFnRunnersTest.java | 2 +- .../harness/PrecombineGroupingTableTest.java | 2 +- .../beam/fn/harness/ToStringFnRunnerTest.java | 72 + .../fn/harness/WindowMergingFnRunnerTest.java | 2 +- .../control/BeamFnControlClientTest.java | 2 +- .../control/BundleSplitListenerTest.java | 2 +- .../control/ProcessBundleHandlerTest.java | 2 +- .../data/BeamFnDataGrpcClientTest.java | 2 +- .../data/BeamFnDataInboundObserverTest.java | 13 +- .../data/PCollectionConsumerRegistryTest.java | 2 +- .../data/QueueingBeamFnDataClientTest.java | 2 +- .../logging/BeamFnLoggingClientTest.java | 2 +- .../state/BeamFnStateGrpcClientCacheTest.java | 2 +- .../HarnessStreamObserverFactoriesTest.java | 2 +- .../beam/sdk/io/aws/dynamodb/DynamoDBIO.java | 40 +- .../beam/sdk/io/aws/coders/AwsCodersTest.java | 2 +- .../sdk/io/aws/dynamodb/DynamoDBIOTest.java | 68 +- .../io/aws/dynamodb/DynamoDBIOTestHelper.java | 2 +- .../sdk/io/aws/options/AwsModuleTest.java | 2 +- .../beam/sdk/io/aws/s3/S3FileSystemTest.java | 2 +- .../io/aws/sns/PublishResultCodersTest.java | 2 +- .../java/io/amazon-web-services2/build.gradle | 2 +- .../dynamodb/BasicDynamoDbClientProvider.java | 32 +- .../beam/sdk/io/aws2/dynamodb/DynamoDBIO.java | 40 +- .../beam/sdk/io/aws2/options/AwsOptions.java | 4 +- .../io/aws2/options/AwsSerializableUtils.java | 50 + .../aws2/sns/BasicSnsAsyncClientProvider.java | 32 +- .../io/aws2/sns/BasicSnsClientProvider.java | 34 +- .../io/aws2/sqs/BasicSqsClientProvider.java | 34 +- .../BasicDynamoDbClientProviderTest.java | 51 + .../sdk/io/aws2/dynamodb/DynamoDBIOTest.java | 85 +- .../sdk/io/aws2/options/AwsModuleTest.java | 2 +- .../options/AwsSerializableUtilsTest.java | 70 + .../sns/BasicSnsAsyncClientProviderTest.java | 51 + .../aws2/sns/BasicSnsClientProviderTest.java | 51 + .../aws2/sqs/BasicSqsClientProviderTest.java | 51 + .../AzureBlobStoreFileSystemTest.java | 2 +- .../sdk/io/cassandra/CassandraIOTest.java | 2 +- .../ContextualTextIOTest.java | 2 +- .../ElasticsearchIOTestCommon.java | 2 +- .../beam/sdk/io/gcp/bigquery/BigQueryIO.java | 12 +- .../bigquery/BigQueryStorageStreamSource.java | 6 + .../bigtable/BeamRowToBigtableMutation.java | 123 + .../sdk/io/gcp/bigtable/BigtableConfig.java | 15 + .../beam/sdk/io/gcp/bigtable/BigtableIO.java | 22 + .../io/gcp/bigtable/BigtableRowToBeamRow.java | 176 + .../bigtable/BigtableRowToBeamRowFlat.java | 108 + .../gcp/bigtable/BigtableRowToBeamRowFn.java | 46 + .../sdk/io/gcp/bigtable/CellValueParser.java | 106 + .../beam/sdk/io/gcp/bigtable/RowUtils.java} | 28 +- .../beam/sdk/io/gcp/healthcare/DicomIO.java | 199 + .../beam/sdk/io/gcp/healthcare/FhirIO.java | 232 + .../gcp/healthcare/HealthcareApiClient.java | 29 + .../healthcare/HttpHealthcareApiClient.java | 253 + .../io/gcp/healthcare/JsonArrayCoder.java} | 34 +- .../sdk/io/gcp/healthcare/WebPathParser.java | 63 + .../sdk/io/gcp/pubsub/RowToPubsubMessage.java | 28 +- .../beam/sdk/io/gcp/pubsub/TestPubsub.java | 17 +- .../sdk/io/gcp/pubsub/TestPubsubSignal.java | 150 +- .../io/gcp/pubsublite/CloudPubsubChecks.java | 21 +- ...inalizer.java => InitialOffsetReader.java} | 12 +- .../pubsublite/InitialOffsetReaderImpl.java | 54 + .../LimitingTopicBacklogReader.java | 81 + .../io/gcp/pubsublite/OffsetByteProgress.java | 33 + .../pubsublite/OffsetByteRangeTracker.java | 172 + .../gcp/pubsublite/OffsetCheckpointMark.java | 78 - .../PerSubscriptionPartitionSdf.java | 110 + .../sdk/io/gcp/pubsublite/PublisherCache.java | 10 +- .../io/gcp/pubsublite/PublisherOptions.java | 47 +- .../io/gcp/pubsublite/PublisherOrError.java | 6 +- .../sdk/io/gcp/pubsublite/Publishers.java | 56 + .../sdk/io/gcp/pubsublite/PubsubLiteIO.java | 14 +- .../sdk/io/gcp/pubsublite/PubsubLiteSink.java | 18 +- .../pubsublite/PubsubLiteUnboundedReader.java | 333 - .../pubsublite/PubsubLiteUnboundedSource.java | 140 - .../SerializableSubscriberFactory.java | 33 + .../gcp/pubsublite/SerializableSupplier.java | 5 +- .../io/gcp/pubsublite/SubscribeTransform.java | 124 + .../io/gcp/pubsublite/SubscriberOptions.java | 157 +- .../gcp/pubsublite/SubscriptionPartition.java | 35 + .../SubscriptionPartitionCoder.java | 66 + .../SubscriptionPartitionProcessor.java | 32 + ...SubscriptionPartitionProcessorFactory.java | 33 + .../SubscriptionPartitionProcessorImpl.java | 152 + .../io/gcp/pubsublite/TopicBacklogReader.java | 34 +- .../pubsublite/TopicBacklogReaderImpl.java | 80 +- .../TopicBacklogReaderSettings.java | 50 +- .../pubsublite/TranslatingPullSubscriber.java | 48 - .../beam/sdk/io/gcp/pubsublite/UuidCoder.java | 7 +- .../pubsublite/UuidDeduplicationOptions.java | 15 +- .../sdk/io/gcp/spanner/SpannerAccessor.java | 22 +- .../sdk/io/gcp/testing/BigtableUtils.java | 49 + .../cloud/spanner/FakeBatchTransactionId.java | 1 + .../beam/sdk/io/gcp/GcpApiSurfaceTest.java | 3 +- .../io/gcp/bigquery/BigQueryIOReadTest.java | 2 +- .../bigquery/BigQueryIOStorageReadTest.java | 13 +- .../io/gcp/bigquery/BigQueryIOWriteTest.java | 11 +- .../bigquery/BigQueryServicesImplTest.java | 2 +- .../io/gcp/bigquery/BigQueryUtilsTest.java | 2 +- .../gcp/bigquery/TableRowJsonCoderTest.java | 2 +- .../BeamRowToBigtableMutationTest.java | 89 + .../io/gcp/bigtable/BigtableConfigTest.java | 2 +- .../sdk/io/gcp/bigtable/BigtableIOTest.java | 2 +- .../BigtableRowToBeamRowFlatTest.java | 65 + .../bigtable/BigtableRowToBeamRowTest.java | 92 + .../io/gcp/bigtable/BigtableTestUtils.java | 147 + .../sdk/io/gcp/bigtable/BigtableWriteIT.java | 2 +- .../io/gcp/bigtable/CellValueParserTest.java | 288 + .../gcp/datastore/AdaptiveThrottlerTest.java | 2 +- .../sdk/io/gcp/datastore/DatastoreV1Test.java | 2 +- .../datastore/EntityToRowRowToEntityTest.java | 6 +- .../sdk/io/gcp/healthcare/DicomIOReadIT.java | 93 + .../sdk/io/gcp/healthcare/DicomIOTest.java | 60 + .../sdk/io/gcp/healthcare/FhirIOSearchIT.java | 156 + .../sdk/io/gcp/healthcare/FhirIOTest.java | 21 + .../io/gcp/healthcare/WebPathParserTest.java | 48 + .../beam/sdk/io/gcp/pubsub/PubsubIOTest.java | 2 +- .../PubsubMessagePayloadOnlyCoderTest.java | 2 +- ...geWithAttributesAndMessageIdCoderTest.java | 2 +- .../PubsubMessageWithAttributesCoderTest.java | 2 +- .../PubsubMessageWithMessageIdCoderTest.java | 2 +- .../gcp/pubsub/PubsubUnboundedSourceTest.java | 2 +- .../OffsetByteRangeTrackerTest.java | 158 + .../pubsublite/OffsetCheckpointMarkTest.java | 81 - .../PerSubscriptionPartitionSdfTest.java | 189 + .../io/gcp/pubsublite/PubsubLiteSinkTest.java | 47 +- .../PubsubLiteUnboundedReaderTest.java | 330 - ...ubscriptionPartitionProcessorImplTest.java | 227 + .../TopicBacklogReaderImplTest.java | 140 +- .../UuidDeduplicationTransformTest.java | 13 +- .../spanner/MutationSizeEstimatorTest.java | 2 +- .../io/gcp/spanner/ReadSpannerSchemaTest.java | 2 +- .../io/gcp/spanner/SpannerIOWriteTest.java | 2 +- .../sdk/io/gcp/spanner/SpannerWriteIT.java | 2 +- .../sdk/io/gcp/spanner/StructUtilsTest.java | 2 +- .../test/resources/DICOM/testDicomFile.dcm | Bin 0 -> 10366 bytes .../io/hadoop/SerializableConfiguration.java | 11 + .../hadoop/SerializableConfigurationTest.java | 9 + .../beam/sdk/io/hadoop/WritableCoderTest.java | 2 +- .../sdk/io/hdfs/HadoopFileSystemOptions.java | 9 +- .../io/hdfs/HadoopFileSystemModuleTest.java | 2 +- .../HadoopFileSystemOptionsRegistrarTest.java | 2 +- .../io/hdfs/HadoopFileSystemOptionsTest.java | 22 +- .../sdk/io/hdfs/HadoopFileSystemTest.java | 2 +- .../sdk/io/hadoop/format/HadoopFormatIO.java | 85 +- .../format/HadoopFormatIOCassandraTest.java | 6 +- .../hadoop/format/HadoopFormatIOReadTest.java | 162 +- .../org/apache/beam/sdk/io/hbase/HBaseIO.java | 1 - .../apache/beam/sdk/io/hbase/HBaseIOTest.java | 2 +- .../beam/sdk/io/hcatalog/HCatalogIOTest.java | 2 +- .../apache/beam/sdk/io/jdbc/JdbcIOTest.java | 2 +- .../org/apache/beam/sdk/io/jms/JmsIOTest.java | 2 +- sdks/java/io/kafka/build.gradle | 90 +- ...omTimestampPolicyWithLimitedDelayTest.java | 2 +- .../apache/beam/sdk/io/kafka/KafkaIOIT.java | 69 +- .../apache/beam/sdk/io/kafka/KafkaIOTest.java | 8 +- .../beam/sdk/io/kinesis/KinesisIOIT.java | 2 +- .../org/apache/beam/sdk/io/kudu/KuduIOIT.java | 4 +- .../parquet/GenericRecordReadConverter.java | 64 - .../apache/beam/sdk/io/parquet/ParquetIO.java | 472 +- .../io/parquet/ParquetSchemaIOProvider.java | 11 +- .../io/parquet/GenericRecordToRowTest.java | 79 - .../beam/sdk/io/parquet/ParquetIOTest.java | 132 +- .../beam/sdk/io/snowflake/KeyPairUtils.java | 4 +- .../snowflake/crosslanguage/ReadBuilder.java | 4 +- .../services/SnowflakeBatchServiceImpl.java | 4 +- .../FakeSnowflakeStreamingServiceImpl.java | 4 +- .../beam/sdk/io/snowflake/test/TestUtils.java | 6 +- .../sdk/io/solr/JavaBinCodecCoderTest.java | 2 +- .../apache/beam/sdk/io/solr/SolrIOTest.java | 4 +- sdks/java/io/thrift/build.gradle | 10 +- .../beam/sdk/io/thrift/ThriftCoder.java | 9 +- .../beam/sdk/io/thrift/ThriftSchema.java | 408 + .../beam/sdk/io/thrift/TestThriftEnum.java | 54 + .../sdk/io/thrift/TestThriftInnerStruct.java | 526 + .../beam/sdk/io/thrift/TestThriftStruct.java | 760 +- .../beam/sdk/io/thrift/TestThriftUnion.java | 401 + .../beam/sdk/io/thrift/ThriftIOTest.java | 38 +- .../beam/sdk/io/thrift/ThriftSchemaTest.java | 251 + .../test/resources/thrift/thrift_test.thrift | 35 +- .../beam/sdk/io/tika/ParseResultTest.java | 2 +- .../apache/beam/sdk/io/tika/TikaIOTest.java | 2 +- .../org/apache/beam/sdk/io/xml/XmlSource.java | 22 +- .../apache/beam/sdk/io/xml/JAXBCoderTest.java | 2 +- .../org/apache/beam/sdk/io/xml/XmlIOTest.java | 11 +- .../apache/beam/sdk/io/xml/XmlSourceTest.java | 44 +- .../maven-archetypes/examples/build.gradle | 2 +- sdks/java/testing/jpms-tests/build.gradle | 2 +- .../org/apache/beam/sdk/nexmark/Monitor.java | 13 +- .../beam/sdk/nexmark/NexmarkLauncher.java | 50 +- .../beam/sdk/nexmark/NexmarkOptions.java | 14 + .../sdk/nexmark/queries/NexmarkQuery.java | 3 - .../nexmark/queries/NexmarkQueryModel.java | 4 +- .../beam/sdk/nexmark/queries/Query10.java | 8 +- .../beam/sdk/nexmark/queries/Query3.java | 191 +- .../beam/sdk/nexmark/queries/Query5.java | 133 +- .../sdk/nexmark/NexmarkConfigurationTest.java | 2 +- .../beam/sdk/nexmark/PerfsToBigQueryTest.java | 2 +- .../queries/BoundedSideInputJoinTest.java | 2 +- .../queries/SessionSideInputJoinTest.java | 2 +- .../sql/SqlBoundedSideInputJoinTest.java | 2 +- sdks/python/apache_beam/coders/coders.py | 85 +- .../apache_beam/coders/coders_test_common.py | 18 +- sdks/python/apache_beam/coders/typecoders.py | 3 - sdks/python/apache_beam/dataframe/frames.py | 26 +- .../apache_beam/dataframe/frames_test.py | 78 +- sdks/python/apache_beam/dataframe/io.py | 312 +- sdks/python/apache_beam/dataframe/io_test.py | 127 + .../apache_beam/examples/kafkataxi/README.md | 4 +- .../apache_beam/examples/snippets/snippets.py | 10 +- .../examples/snippets/snippets_test.py | 10 +- sdks/python/apache_beam/examples/sql_taxi.py | 3 +- sdks/python/apache_beam/io/concat_source.py | 9 +- .../apache_beam/io/concat_source_test.py | 8 + .../flink_streaming_impulse_source_test.py | 3 +- sdks/python/apache_beam/io/gcp/bigquery.py | 273 +- .../apache_beam/io/gcp/bigquery_file_loads.py | 21 +- .../io/gcp/bigquery_read_internal.py | 289 + .../io/gcp/bigquery_read_it_test.py | 103 + .../apache_beam/io/gcp/bigquery_test.py | 16 +- .../apache_beam/io/gcp/bigquery_tools.py | 26 +- sdks/python/apache_beam/io/gcp/bigtableio.py | 7 +- sdks/python/apache_beam/io/gcp/pubsub.py | 122 +- sdks/python/apache_beam/io/gcp/pubsub_test.py | 126 +- sdks/python/apache_beam/io/iobase.py | 20 +- sdks/python/apache_beam/io/mongodbio.py | 29 +- sdks/python/apache_beam/io/mongodbio_test.py | 41 + .../apache_beam/io/restriction_trackers.py | 19 +- sdks/python/apache_beam/metrics/cells.pxd | 2 + sdks/python/apache_beam/metrics/cells.py | 15 +- sdks/python/apache_beam/metrics/cells_test.py | 25 + sdks/python/apache_beam/metrics/execution.pxd | 1 + sdks/python/apache_beam/metrics/execution.py | 9 +- .../apache_beam/options/pipeline_options.py | 35 +- .../apache_beam/options/value_provider.py | 71 +- .../options/value_provider_test.py | 40 + sdks/python/apache_beam/pipeline.py | 163 +- .../apache_beam/portability/common_urns.py | 1 + sdks/python/apache_beam/runners/common.pxd | 1 + sdks/python/apache_beam/runners/common.py | 41 +- .../runners/dataflow/dataflow_runner.py | 184 +- .../runners/dataflow/dataflow_runner_test.py | 62 + .../runners/dataflow/internal/names.py | 9 +- .../runners/dataflow/ptransform_overrides.py | 45 + .../runners/direct/direct_runner.py | 4 +- .../runners/direct/direct_userstate.py | 35 +- .../runners/direct/transform_evaluator.py | 8 +- .../python/apache_beam/runners/direct/util.py | 18 +- .../runners/direct/watermark_manager.py | 10 +- .../7a35f487b2a5f3a9b9852a8659eeb4bd.png | Bin 700548 -> 703677 bytes .../apache_beam/runners/pipeline_context.py | 2 - .../runners/portability/flink_runner_test.py | 5 +- .../fn_api_runner/fn_runner_test.py | 139 +- .../portability/fn_api_runner/translations.py | 89 +- .../fn_api_runner/translations_test.py | 49 +- .../fn_api_runner/worker_handlers.py | 9 +- .../runners/portability/job_server.py | 11 +- .../runners/portability/job_server_test.py | 84 + .../runners/portability/portable_runner.py | 85 +- .../portability/sdk_container_builder.py | 23 +- .../runners/portability/spark_runner_test.py | 11 +- sdks/python/apache_beam/runners/runner.py | 24 +- .../runners/worker/bundle_processor.py | 58 +- .../apache_beam/runners/worker/operations.py | 6 +- .../runners/worker/sdk_worker_test.py | 2 + sdks/python/apache_beam/transforms/core.py | 177 +- .../apache_beam/transforms/environments.py | 26 +- .../python/apache_beam/transforms/external.py | 24 +- .../apache_beam/transforms/ptransform.py | 46 +- sdks/python/apache_beam/transforms/trigger.py | 39 +- .../apache_beam/transforms/trigger_test.py | 10 +- .../apache_beam/transforms/userstate.py | 55 +- .../apache_beam/transforms/userstate_test.py | 216 +- sdks/python/apache_beam/transforms/util.py | 123 +- .../apache_beam/transforms/util_test.py | 65 + .../typehints/native_type_compatibility.py | 7 - .../apache_beam/typehints/sharded_key_type.py | 92 + .../typehints/sharded_key_type_test.py | 89 + sdks/python/apache_beam/utils/shared.py | 2 +- sdks/python/apache_beam/version.py | 2 +- sdks/python/build-requirements.txt | 3 + sdks/python/container/common.gradle | 2 + sdks/python/setup.py | 6 +- sdks/python/test-suites/dataflow/build.gradle | 24 + sdks/python/test-suites/gradle.properties | 5 + .../python/test-suites/portable/common.gradle | 84 +- website/.gitignore | 23 - website/www/node_modules/.bin/autoprefixer | 22 + website/www/node_modules/.bin/browserslist | 145 + website/www/node_modules/.bin/cross-env | 5 + website/www/node_modules/.bin/cross-env-shell | 5 + website/www/node_modules/.bin/esparse | 139 + website/www/node_modules/.bin/esvalidate | 236 + website/www/node_modules/.bin/js-yaml | 132 + website/www/node_modules/.bin/node-which | 52 + website/www/node_modules/.bin/postcss | 3 + website/www/node_modules/.yarn-integrity | 156 + .../node_modules/@nodelib/fs.scandir/LICENSE | 21 + .../@nodelib/fs.scandir/README.md | 171 + .../@nodelib/fs.scandir/package.json | 35 + .../www/node_modules/@nodelib/fs.stat/LICENSE | 21 + .../node_modules/@nodelib/fs.stat/README.md | 126 + .../@nodelib/fs.stat/package.json | 29 + .../www/node_modules/@nodelib/fs.walk/LICENSE | 21 + .../node_modules/@nodelib/fs.walk/README.md | 215 + .../@nodelib/fs.walk/package.json | 35 + .../node_modules/@types/color-name/LICENSE | 21 + .../node_modules/@types/color-name/README.md | 16 + .../node_modules/@types/color-name/index.d.ts | 161 + .../@types/color-name/package.json | 23 + .../www/node_modules/ansi-regex/index.d.ts | 37 + website/www/node_modules/ansi-regex/index.js | 10 + website/www/node_modules/ansi-regex/license | 9 + .../www/node_modules/ansi-regex/package.json | 55 + website/www/node_modules/ansi-regex/readme.md | 78 + .../www/node_modules/ansi-styles/index.d.ts | 197 + website/www/node_modules/ansi-styles/index.js | 163 + website/www/node_modules/ansi-styles/license | 9 + .../www/node_modules/ansi-styles/package.json | 57 + .../www/node_modules/ansi-styles/readme.md | 158 + website/www/node_modules/anymatch/LICENSE | 15 + website/www/node_modules/anymatch/README.md | 87 + website/www/node_modules/anymatch/index.d.ts | 19 + website/www/node_modules/anymatch/index.js | 102 + .../www/node_modules/anymatch/package.json | 48 + .../www/node_modules/argparse/CHANGELOG.md | 185 + website/www/node_modules/argparse/LICENSE | 21 + website/www/node_modules/argparse/README.md | 257 + website/www/node_modules/argparse/index.js | 3 + .../www/node_modules/argparse/lib/action.js | 146 + .../argparse/lib/action/append.js | 53 + .../argparse/lib/action/append/constant.js | 47 + .../node_modules/argparse/lib/action/count.js | 40 + .../node_modules/argparse/lib/action/help.js | 47 + .../node_modules/argparse/lib/action/store.js | 50 + .../argparse/lib/action/store/constant.js | 43 + .../argparse/lib/action/store/false.js | 27 + .../argparse/lib/action/store/true.js | 26 + .../argparse/lib/action/subparsers.js | 149 + .../argparse/lib/action/version.js | 47 + .../argparse/lib/action_container.js | 482 + .../www/node_modules/argparse/lib/argparse.js | 14 + .../argparse/lib/argument/error.js | 50 + .../argparse/lib/argument/exclusive.js | 54 + .../argparse/lib/argument/group.js | 75 + .../argparse/lib/argument_parser.js | 1161 + .../www/node_modules/argparse/lib/const.js | 21 + .../argparse/lib/help/added_formatters.js | 87 + .../argparse/lib/help/formatter.js | 795 + .../node_modules/argparse/lib/namespace.js | 76 + .../www/node_modules/argparse/lib/utils.js | 57 + .../www/node_modules/argparse/package.json | 34 + .../www/node_modules/array-union/index.d.ts | 25 + website/www/node_modules/array-union/index.js | 5 + website/www/node_modules/array-union/license | 9 + .../www/node_modules/array-union/package.json | 38 + .../www/node_modules/array-union/readme.md | 34 + .../www/node_modules/at-least-node/LICENSE | 6 + .../www/node_modules/at-least-node/README.md | 25 + .../www/node_modules/at-least-node/index.js | 5 + .../node_modules/at-least-node/package.json | 32 + .../node_modules/autoprefixer/CHANGELOG.md | 962 + website/www/node_modules/autoprefixer/LICENSE | 20 + .../www/node_modules/autoprefixer/README.md | 1112 + .../autoprefixer/data/prefixes.js | 706 + .../node_modules/autoprefixer/lib/at-rule.js | 74 + .../autoprefixer/lib/autoprefixer.js | 153 + .../node_modules/autoprefixer/lib/brackets.js | 64 + .../node_modules/autoprefixer/lib/browsers.js | 97 + .../autoprefixer/lib/declaration.js | 255 + .../autoprefixer/lib/hacks/align-content.js | 91 + .../autoprefixer/lib/hacks/align-items.js | 88 + .../autoprefixer/lib/hacks/align-self.js | 96 + .../autoprefixer/lib/hacks/animation.js | 47 + .../autoprefixer/lib/hacks/appearance.js | 51 + .../autoprefixer/lib/hacks/backdrop-filter.js | 47 + .../autoprefixer/lib/hacks/background-clip.js | 53 + .../autoprefixer/lib/hacks/background-size.js | 50 + .../autoprefixer/lib/hacks/block-logical.js | 60 + .../autoprefixer/lib/hacks/border-image.js | 45 + .../autoprefixer/lib/hacks/border-radius.js | 74 + .../autoprefixer/lib/hacks/break-props.js | 88 + .../autoprefixer/lib/hacks/color-adjust.js | 52 + .../autoprefixer/lib/hacks/cross-fade.js | 66 + .../autoprefixer/lib/hacks/display-flex.js | 106 + .../autoprefixer/lib/hacks/display-grid.js | 53 + .../autoprefixer/lib/hacks/filter-value.js | 43 + .../autoprefixer/lib/hacks/filter.js | 45 + .../autoprefixer/lib/hacks/flex-basis.js | 84 + .../autoprefixer/lib/hacks/flex-direction.js | 120 + .../autoprefixer/lib/hacks/flex-flow.js | 93 + .../autoprefixer/lib/hacks/flex-grow.js | 69 + .../autoprefixer/lib/hacks/flex-shrink.js | 84 + .../autoprefixer/lib/hacks/flex-spec.js | 22 + .../autoprefixer/lib/hacks/flex-wrap.js | 52 + .../autoprefixer/lib/hacks/flex.js | 97 + .../autoprefixer/lib/hacks/fullscreen.js | 52 + .../autoprefixer/lib/hacks/gradient.js | 529 + .../autoprefixer/lib/hacks/grid-area.js | 64 + .../lib/hacks/grid-column-align.js | 60 + .../autoprefixer/lib/hacks/grid-end.js | 74 + .../autoprefixer/lib/hacks/grid-row-align.js | 60 + .../autoprefixer/lib/hacks/grid-row-column.js | 64 + .../lib/hacks/grid-rows-columns.js | 161 + .../autoprefixer/lib/hacks/grid-start.js | 67 + .../lib/hacks/grid-template-areas.js | 113 + .../autoprefixer/lib/hacks/grid-template.js | 102 + .../autoprefixer/lib/hacks/grid-utils.js | 1123 + .../autoprefixer/lib/hacks/image-rendering.js | 83 + .../autoprefixer/lib/hacks/image-set.js | 50 + .../autoprefixer/lib/hacks/inline-logical.js | 52 + .../autoprefixer/lib/hacks/intrinsic.js | 86 + .../autoprefixer/lib/hacks/justify-content.js | 97 + .../autoprefixer/lib/hacks/mask-border.js | 58 + .../autoprefixer/lib/hacks/mask-composite.js | 116 + .../autoprefixer/lib/hacks/order.js | 84 + .../lib/hacks/overscroll-behavior.js | 66 + .../autoprefixer/lib/hacks/pixelated.js | 70 + .../autoprefixer/lib/hacks/place-self.js | 67 + .../autoprefixer/lib/hacks/placeholder.js | 68 + .../lib/hacks/text-decoration-skip-ink.js | 50 + .../autoprefixer/lib/hacks/text-decoration.js | 48 + .../lib/hacks/text-emphasis-position.js | 45 + .../autoprefixer/lib/hacks/transform-decl.js | 117 + .../autoprefixer/lib/hacks/user-select.js | 48 + .../autoprefixer/lib/hacks/writing-mode.js | 71 + .../www/node_modules/autoprefixer/lib/info.js | 149 + .../autoprefixer/lib/old-selector.js | 88 + .../autoprefixer/lib/old-value.js | 30 + .../node_modules/autoprefixer/lib/prefixer.js | 167 + .../node_modules/autoprefixer/lib/prefixes.js | 470 + .../autoprefixer/lib/processor.js | 699 + .../autoprefixer/lib/resolution.js | 137 + .../node_modules/autoprefixer/lib/selector.js | 210 + .../node_modules/autoprefixer/lib/supports.js | 346 + .../autoprefixer/lib/transition.js | 411 + .../node_modules/autoprefixer/lib/utils.js | 103 + .../node_modules/autoprefixer/lib/value.js | 176 + .../node_modules/.bin/browserslist | 145 + .../node_modules/autoprefixer/package.json | 31 + .../binary-extensions/binary-extensions.json | 252 + .../binary-extensions.json.d.ts | 3 + .../node_modules/binary-extensions/index.d.ts | 14 + .../node_modules/binary-extensions/index.js | 1 + .../node_modules/binary-extensions/license | 9 + .../binary-extensions/package.json | 38 + .../node_modules/binary-extensions/readme.md | 33 + website/www/node_modules/braces/CHANGELOG.md | 184 + website/www/node_modules/braces/LICENSE | 21 + website/www/node_modules/braces/README.md | 593 + website/www/node_modules/braces/index.js | 170 + .../www/node_modules/braces/lib/compile.js | 57 + .../www/node_modules/braces/lib/constants.js | 57 + website/www/node_modules/braces/lib/expand.js | 113 + website/www/node_modules/braces/lib/parse.js | 333 + .../www/node_modules/braces/lib/stringify.js | 32 + website/www/node_modules/braces/lib/utils.js | 112 + website/www/node_modules/braces/package.json | 77 + .../node_modules/browserslist/CHANGELOG.md | 459 + website/www/node_modules/browserslist/LICENSE | 20 + .../www/node_modules/browserslist/README.md | 640 + .../www/node_modules/browserslist/browser.js | 41 + website/www/node_modules/browserslist/cli.js | 145 + .../www/node_modules/browserslist/error.js | 12 + .../www/node_modules/browserslist/index.js | 1159 + website/www/node_modules/browserslist/node.js | 361 + .../node_modules/browserslist/package.json | 28 + .../node_modules/browserslist/update-db.js | 134 + .../www/node_modules/caller-callsite/index.js | 18 + .../www/node_modules/caller-callsite/license | 21 + .../node_modules/caller-callsite/package.json | 44 + .../node_modules/caller-callsite/readme.md | 41 + website/www/node_modules/caller-path/index.js | 4 + website/www/node_modules/caller-path/license | 21 + .../www/node_modules/caller-path/package.json | 45 + .../www/node_modules/caller-path/readme.md | 34 + website/www/node_modules/callsites/index.js | 8 + website/www/node_modules/callsites/license | 21 + .../www/node_modules/callsites/package.json | 40 + website/www/node_modules/callsites/readme.md | 46 + website/www/node_modules/camelcase/index.d.ts | 63 + website/www/node_modules/camelcase/index.js | 76 + website/www/node_modules/camelcase/license | 9 + .../www/node_modules/camelcase/package.json | 43 + website/www/node_modules/camelcase/readme.md | 99 + .../node_modules/caniuse-lite/CHANGELOG.md | 360 + website/www/node_modules/caniuse-lite/LICENSE | 395 + .../www/node_modules/caniuse-lite/README.md | 103 + .../node_modules/caniuse-lite/data/agents.js | 1 + .../caniuse-lite/data/browserVersions.js | 1 + .../caniuse-lite/data/browsers.js | 1 + .../caniuse-lite/data/features.js | 1 + .../caniuse-lite/data/features/aac.js | 1 + .../data/features/abortcontroller.js | 1 + .../caniuse-lite/data/features/ac3-ec3.js | 1 + .../data/features/accelerometer.js | 1 + .../data/features/addeventlistener.js | 1 + .../data/features/alternate-stylesheet.js | 1 + .../data/features/ambient-light.js | 1 + .../caniuse-lite/data/features/apng.js | 1 + .../data/features/array-find-index.js | 1 + .../caniuse-lite/data/features/array-find.js | 1 + .../caniuse-lite/data/features/array-flat.js | 1 + .../data/features/array-includes.js | 1 + .../data/features/arrow-functions.js | 1 + .../caniuse-lite/data/features/asmjs.js | 1 + .../data/features/async-clipboard.js | 1 + .../data/features/async-functions.js | 1 + .../async-iterations-and-generators.js | 1 + .../caniuse-lite/data/features/atob-btoa.js | 1 + .../caniuse-lite/data/features/audio-api.js | 1 + .../caniuse-lite/data/features/audio.js | 1 + .../caniuse-lite/data/features/audiotracks.js | 1 + .../caniuse-lite/data/features/autofocus.js | 1 + .../caniuse-lite/data/features/aux-click.js | 1 + .../caniuse-lite/data/features/auxclick.js | 1 + .../caniuse-lite/data/features/av1.js | 1 + .../caniuse-lite/data/features/avif.js | 1 + .../data/features/background-attachment.js | 1 + .../data/features/background-clip-text.js | 1 + .../data/features/background-img-opts.js | 1 + .../data/features/background-position-x-y.js | 1 + .../features/background-repeat-round-space.js | 1 + .../data/features/background-sync.js | 1 + .../data/features/battery-status.js | 1 + .../caniuse-lite/data/features/beacon.js | 1 + .../data/features/beforeafterprint.js | 1 + .../caniuse-lite/data/features/bigint.js | 1 + .../caniuse-lite/data/features/blobbuilder.js | 1 + .../caniuse-lite/data/features/bloburls.js | 1 + .../data/features/border-image.js | 1 + .../data/features/border-radius.js | 1 + .../data/features/broadcastchannel.js | 1 + .../caniuse-lite/data/features/brotli.js | 1 + .../caniuse-lite/data/features/calc.js | 1 + .../data/features/canvas-blending.js | 1 + .../caniuse-lite/data/features/canvas-text.js | 1 + .../caniuse-lite/data/features/canvas.js | 1 + .../caniuse-lite/data/features/ch-unit.js | 1 + .../data/features/chacha20-poly1305.js | 1 + .../data/features/channel-messaging.js | 1 + .../data/features/childnode-remove.js | 1 + .../caniuse-lite/data/features/classlist.js | 1 + .../data/features/clear-site-data-header.js | 1 + .../client-hints-dpr-width-viewport.js | 1 + .../caniuse-lite/data/features/clipboard.js | 1 + .../data/features/comparedocumentposition.js | 1 + .../data/features/console-basic.js | 1 + .../data/features/console-time.js | 1 + .../caniuse-lite/data/features/const.js | 1 + .../data/features/constraint-validation.js | 1 + .../data/features/contenteditable.js | 1 + .../data/features/contentsecuritypolicy.js | 1 + .../data/features/contentsecuritypolicy2.js | 1 + .../caniuse-lite/data/features/cors.js | 1 + .../data/features/createimagebitmap.js | 1 + .../data/features/credential-management.js | 1 + .../data/features/cryptography.js | 1 + .../caniuse-lite/data/features/css-all.js | 1 + .../data/features/css-animation.js | 1 + .../data/features/css-any-link.js | 1 + .../data/features/css-appearance.js | 1 + .../data/features/css-apply-rule.js | 1 + .../data/features/css-at-counter-style.js | 1 + .../data/features/css-backdrop-filter.js | 1 + .../data/features/css-background-offsets.js | 1 + .../data/features/css-backgroundblendmode.js | 1 + .../data/features/css-boxdecorationbreak.js | 1 + .../data/features/css-boxshadow.js | 1 + .../caniuse-lite/data/features/css-canvas.js | 1 + .../data/features/css-caret-color.js | 1 + .../data/features/css-case-insensitive.js | 1 + .../data/features/css-clip-path.js | 1 + .../data/features/css-color-adjust.js | 1 + .../data/features/css-conic-gradients.js | 1 + .../data/features/css-containment.js | 1 + .../data/features/css-counters.js | 1 + .../data/features/css-crisp-edges.js | 1 + .../data/features/css-cross-fade.js | 1 + .../data/features/css-default-pseudo.js | 1 + .../data/features/css-descendant-gtgt.js | 1 + .../data/features/css-deviceadaptation.js | 1 + .../data/features/css-dir-pseudo.js | 1 + .../data/features/css-display-contents.js | 1 + .../data/features/css-element-function.js | 1 + .../data/features/css-env-function.js | 1 + .../data/features/css-exclusions.js | 1 + .../data/features/css-featurequeries.js | 1 + .../data/features/css-filter-function.js | 1 + .../caniuse-lite/data/features/css-filters.js | 1 + .../data/features/css-first-letter.js | 1 + .../data/features/css-first-line.js | 1 + .../caniuse-lite/data/features/css-fixed.js | 1 + .../data/features/css-focus-ring.js | 1 + .../data/features/css-focus-visible.js | 1 + .../data/features/css-focus-within.js | 1 + .../features/css-font-rendering-controls.js | 1 + .../data/features/css-font-stretch.js | 1 + .../data/features/css-gencontent.js | 1 + .../data/features/css-gradients.js | 1 + .../caniuse-lite/data/features/css-grid.js | 1 + .../data/features/css-hanging-punctuation.js | 1 + .../caniuse-lite/data/features/css-has.js | 1 + .../data/features/css-hyphenate.js | 1 + .../caniuse-lite/data/features/css-hyphens.js | 1 + .../data/features/css-image-orientation.js | 1 + .../data/features/css-image-set.js | 1 + .../data/features/css-in-out-of-range.js | 1 + .../data/features/css-indeterminate-pseudo.js | 1 + .../data/features/css-initial-letter.js | 1 + .../data/features/css-initial-value.js | 1 + .../data/features/css-letter-spacing.js | 1 + .../data/features/css-line-clamp.js | 1 + .../data/features/css-logical-props.js | 1 + .../data/features/css-marker-pseudo.js | 1 + .../caniuse-lite/data/features/css-masks.js | 1 + .../data/features/css-matches-pseudo.js | 1 + .../data/features/css-math-functions.js | 1 + .../data/features/css-media-interaction.js | 1 + .../data/features/css-media-resolution.js | 1 + .../data/features/css-media-scripting.js | 1 + .../data/features/css-mediaqueries.js | 1 + .../data/features/css-mixblendmode.js | 1 + .../data/features/css-motion-paths.js | 1 + .../data/features/css-namespaces.js | 1 + .../data/features/css-not-sel-list.js | 1 + .../data/features/css-nth-child-of.js | 1 + .../caniuse-lite/data/features/css-opacity.js | 1 + .../data/features/css-optional-pseudo.js | 1 + .../data/features/css-overflow-anchor.js | 1 + .../data/features/css-overflow.js | 1 + .../data/features/css-overscroll-behavior.js | 1 + .../data/features/css-page-break.js | 1 + .../data/features/css-paged-media.js | 1 + .../data/features/css-paint-api.js | 1 + .../data/features/css-placeholder-shown.js | 1 + .../data/features/css-placeholder.js | 1 + .../data/features/css-read-only-write.js | 1 + .../data/features/css-rebeccapurple.js | 1 + .../data/features/css-reflections.js | 1 + .../caniuse-lite/data/features/css-regions.js | 1 + .../data/features/css-repeating-gradients.js | 1 + .../caniuse-lite/data/features/css-resize.js | 1 + .../data/features/css-revert-value.js | 1 + .../data/features/css-rrggbbaa.js | 1 + .../data/features/css-scroll-behavior.js | 1 + .../data/features/css-scrollbar.js | 1 + .../caniuse-lite/data/features/css-sel2.js | 1 + .../caniuse-lite/data/features/css-sel3.js | 1 + .../data/features/css-selection.js | 1 + .../caniuse-lite/data/features/css-shapes.js | 1 + .../data/features/css-snappoints.js | 1 + .../caniuse-lite/data/features/css-sticky.js | 1 + .../caniuse-lite/data/features/css-subgrid.js | 1 + .../data/features/css-supports-api.js | 1 + .../caniuse-lite/data/features/css-table.js | 1 + .../data/features/css-text-align-last.js | 1 + .../data/features/css-text-indent.js | 1 + .../data/features/css-text-justify.js | 1 + .../data/features/css-text-orientation.js | 1 + .../data/features/css-text-spacing.js | 1 + .../data/features/css-textshadow.js | 1 + .../data/features/css-touch-action-2.js | 1 + .../data/features/css-touch-action.js | 1 + .../data/features/css-transitions.js | 1 + .../data/features/css-unicode-bidi.js | 1 + .../data/features/css-unset-value.js | 1 + .../data/features/css-variables.js | 1 + .../data/features/css-widows-orphans.js | 1 + .../data/features/css-writing-mode.js | 1 + .../caniuse-lite/data/features/css-zoom.js | 1 + .../caniuse-lite/data/features/css3-attr.js | 1 + .../data/features/css3-boxsizing.js | 1 + .../caniuse-lite/data/features/css3-colors.js | 1 + .../data/features/css3-cursors-grab.js | 1 + .../data/features/css3-cursors-newer.js | 1 + .../data/features/css3-cursors.js | 1 + .../data/features/css3-tabsize.js | 1 + .../data/features/currentcolor.js | 1 + .../data/features/custom-elements.js | 1 + .../data/features/custom-elementsv1.js | 1 + .../caniuse-lite/data/features/customevent.js | 1 + .../caniuse-lite/data/features/datalist.js | 1 + .../caniuse-lite/data/features/dataset.js | 1 + .../caniuse-lite/data/features/datauri.js | 1 + .../data/features/date-tolocaledatestring.js | 1 + .../caniuse-lite/data/features/details.js | 1 + .../data/features/deviceorientation.js | 1 + .../data/features/devicepixelratio.js | 1 + .../caniuse-lite/data/features/dialog.js | 1 + .../data/features/dispatchevent.js | 1 + .../caniuse-lite/data/features/dnssec.js | 1 + .../data/features/do-not-track.js | 1 + .../data/features/document-currentscript.js | 1 + .../data/features/document-evaluate-xpath.js | 1 + .../data/features/document-execcommand.js | 1 + .../features/document-scrollingelement.js | 1 + .../data/features/documenthead.js | 1 + .../data/features/dom-manip-convenience.js | 1 + .../caniuse-lite/data/features/dom-range.js | 1 + .../data/features/domcontentloaded.js | 1 + .../features/domfocusin-domfocusout-events.js | 1 + .../caniuse-lite/data/features/dommatrix.js | 1 + .../caniuse-lite/data/features/download.js | 1 + .../caniuse-lite/data/features/dragndrop.js | 1 + .../data/features/element-closest.js | 1 + .../data/features/element-from-point.js | 1 + .../data/features/element-scroll-methods.js | 1 + .../caniuse-lite/data/features/eme.js | 1 + .../caniuse-lite/data/features/eot.js | 1 + .../caniuse-lite/data/features/es5.js | 1 + .../caniuse-lite/data/features/es6-class.js | 1 + .../data/features/es6-generators.js | 1 + .../features/es6-module-dynamic-import.js | 1 + .../data/features/es6-module-nomodule.js | 1 + .../caniuse-lite/data/features/es6-module.js | 1 + .../caniuse-lite/data/features/es6-number.js | 1 + .../data/features/es6-string-includes.js | 1 + .../caniuse-lite/data/features/es6.js | 1 + .../caniuse-lite/data/features/eventsource.js | 1 + .../data/features/extended-system-fonts.js | 1 + .../data/features/feature-policy.js | 1 + .../caniuse-lite/data/features/fetch.js | 1 + .../data/features/fieldset-disabled.js | 1 + .../caniuse-lite/data/features/fileapi.js | 1 + .../caniuse-lite/data/features/filereader.js | 1 + .../data/features/filereadersync.js | 1 + .../caniuse-lite/data/features/filesystem.js | 1 + .../caniuse-lite/data/features/flac.js | 1 + .../caniuse-lite/data/features/flexbox-gap.js | 1 + .../caniuse-lite/data/features/flexbox.js | 1 + .../caniuse-lite/data/features/flow-root.js | 1 + .../data/features/focusin-focusout-events.js | 1 + .../features/focusoptions-preventscroll.js | 1 + .../data/features/font-family-system-ui.js | 1 + .../data/features/font-feature.js | 1 + .../data/features/font-kerning.js | 1 + .../data/features/font-loading.js | 1 + .../data/features/font-size-adjust.js | 1 + .../caniuse-lite/data/features/font-smooth.js | 1 + .../data/features/font-unicode-range.js | 1 + .../data/features/font-variant-alternates.js | 1 + .../data/features/font-variant-east-asian.js | 1 + .../data/features/font-variant-numeric.js | 1 + .../caniuse-lite/data/features/fontface.js | 1 + .../data/features/form-attribute.js | 1 + .../data/features/form-submit-attributes.js | 1 + .../data/features/form-validation.js | 1 + .../caniuse-lite/data/features/forms.js | 1 + .../caniuse-lite/data/features/fullscreen.js | 1 + .../caniuse-lite/data/features/gamepad.js | 1 + .../caniuse-lite/data/features/geolocation.js | 1 + .../data/features/getboundingclientrect.js | 1 + .../data/features/getcomputedstyle.js | 1 + .../data/features/getelementsbyclassname.js | 1 + .../data/features/getrandomvalues.js | 1 + .../caniuse-lite/data/features/gyroscope.js | 1 + .../data/features/hardwareconcurrency.js | 1 + .../caniuse-lite/data/features/hashchange.js | 1 + .../caniuse-lite/data/features/heif.js | 1 + .../caniuse-lite/data/features/hevc.js | 1 + .../caniuse-lite/data/features/hidden.js | 1 + .../data/features/high-resolution-time.js | 1 + .../caniuse-lite/data/features/history.js | 1 + .../data/features/html-media-capture.js | 1 + .../data/features/html5semantic.js | 1 + .../data/features/http-live-streaming.js | 1 + .../caniuse-lite/data/features/http2.js | 1 + .../caniuse-lite/data/features/http3.js | 1 + .../data/features/iframe-sandbox.js | 1 + .../data/features/iframe-seamless.js | 1 + .../data/features/iframe-srcdoc.js | 1 + .../data/features/imagecapture.js | 1 + .../caniuse-lite/data/features/ime.js | 1 + .../img-naturalwidth-naturalheight.js | 1 + .../caniuse-lite/data/features/imports.js | 1 + .../data/features/indeterminate-checkbox.js | 1 + .../caniuse-lite/data/features/indexeddb.js | 1 + .../caniuse-lite/data/features/indexeddb2.js | 1 + .../data/features/inline-block.js | 1 + .../caniuse-lite/data/features/innertext.js | 1 + .../data/features/input-autocomplete-onoff.js | 1 + .../caniuse-lite/data/features/input-color.js | 1 + .../data/features/input-datetime.js | 1 + .../data/features/input-email-tel-url.js | 1 + .../caniuse-lite/data/features/input-event.js | 1 + .../data/features/input-file-accept.js | 1 + .../data/features/input-file-directory.js | 1 + .../data/features/input-file-multiple.js | 1 + .../data/features/input-inputmode.js | 1 + .../data/features/input-minlength.js | 1 + .../data/features/input-number.js | 1 + .../data/features/input-pattern.js | 1 + .../data/features/input-placeholder.js | 1 + .../caniuse-lite/data/features/input-range.js | 1 + .../data/features/input-search.js | 1 + .../data/features/input-selection.js | 1 + .../data/features/insert-adjacent.js | 1 + .../data/features/insertadjacenthtml.js | 1 + .../internationalization-plural-rul.js | 1 + .../data/features/internationalization.js | 1 + .../data/features/intersectionobserver-v2.js | 1 + .../data/features/intersectionobserver.js | 1 + .../data/features/intl-pluralrules.js | 1 + .../data/features/intrinsic-width.js | 1 + .../caniuse-lite/data/features/jpeg2000.js | 1 + .../caniuse-lite/data/features/jpegxr.js | 1 + .../data/features/js-regexp-lookbehind.js | 1 + .../caniuse-lite/data/features/json.js | 1 + .../features/justify-content-space-evenly.js | 1 + .../data/features/kerning-pairs-ligatures.js | 1 + .../data/features/keyboardevent-charcode.js | 1 + .../data/features/keyboardevent-code.js | 1 + .../keyboardevent-getmodifierstate.js | 1 + .../data/features/keyboardevent-key.js | 1 + .../data/features/keyboardevent-location.js | 1 + .../data/features/keyboardevent-which.js | 1 + .../caniuse-lite/data/features/lazyload.js | 1 + .../caniuse-lite/data/features/let.js | 1 + .../data/features/link-icon-png.js | 1 + .../data/features/link-icon-svg.js | 1 + .../data/features/link-rel-dns-prefetch.js | 1 + .../data/features/link-rel-modulepreload.js | 1 + .../data/features/link-rel-preconnect.js | 1 + .../data/features/link-rel-prefetch.js | 1 + .../data/features/link-rel-preload.js | 1 + .../data/features/link-rel-prerender.js | 1 + .../data/features/loading-lazy-attr.js | 1 + .../data/features/localecompare.js | 1 + .../data/features/magnetometer.js | 1 + .../data/features/matchesselector.js | 1 + .../caniuse-lite/data/features/matchmedia.js | 1 + .../caniuse-lite/data/features/mathml.js | 1 + .../caniuse-lite/data/features/maxlength.js | 1 + .../data/features/media-attribute.js | 1 + .../data/features/media-fragments.js | 1 + .../data/features/media-session-api.js | 1 + .../data/features/mediacapture-fromelement.js | 1 + .../data/features/mediarecorder.js | 1 + .../caniuse-lite/data/features/mediasource.js | 1 + .../caniuse-lite/data/features/menu.js | 1 + .../data/features/meta-theme-color.js | 1 + .../caniuse-lite/data/features/meter.js | 1 + .../caniuse-lite/data/features/midi.js | 1 + .../caniuse-lite/data/features/minmaxwh.js | 1 + .../caniuse-lite/data/features/mp3.js | 1 + .../caniuse-lite/data/features/mpeg-dash.js | 1 + .../caniuse-lite/data/features/mpeg4.js | 1 + .../data/features/multibackgrounds.js | 1 + .../caniuse-lite/data/features/multicolumn.js | 1 + .../data/features/mutation-events.js | 1 + .../data/features/mutationobserver.js | 1 + .../data/features/namevalue-storage.js | 1 + .../data/features/native-filesystem-api.js | 1 + .../caniuse-lite/data/features/nav-timing.js | 1 + .../data/features/navigator-language.js | 1 + .../caniuse-lite/data/features/netinfo.js | 1 + .../data/features/node-contains.js | 1 + .../data/features/node-parentelement.js | 1 + .../data/features/notifications.js | 1 + .../data/features/object-entries.js | 1 + .../caniuse-lite/data/features/object-fit.js | 1 + .../data/features/object-observe.js | 1 + .../data/features/object-values.js | 1 + .../caniuse-lite/data/features/objectrtc.js | 1 + .../data/features/offline-apps.js | 1 + .../data/features/offscreencanvas.js | 1 + .../caniuse-lite/data/features/ogg-vorbis.js | 1 + .../caniuse-lite/data/features/ogv.js | 1 + .../caniuse-lite/data/features/ol-reversed.js | 1 + .../data/features/once-event-listener.js | 1 + .../data/features/online-status.js | 1 + .../caniuse-lite/data/features/opus.js | 1 + .../data/features/orientation-sensor.js | 1 + .../caniuse-lite/data/features/outline.js | 1 + .../data/features/pad-start-end.js | 1 + .../data/features/page-transition-events.js | 1 + .../data/features/pagevisibility.js | 1 + .../data/features/passive-event-listener.js | 1 + .../data/features/passwordrules.js | 1 + .../caniuse-lite/data/features/path2d.js | 1 + .../data/features/payment-request.js | 1 + .../data/features/permissions-api.js | 1 + .../data/features/picture-in-picture.js | 1 + .../caniuse-lite/data/features/picture.js | 1 + .../caniuse-lite/data/features/ping.js | 1 + .../caniuse-lite/data/features/png-alpha.js | 1 + .../data/features/pointer-events.js | 1 + .../caniuse-lite/data/features/pointer.js | 1 + .../caniuse-lite/data/features/pointerlock.js | 1 + .../data/features/prefers-color-scheme.js | 1 + .../data/features/prefers-reduced-motion.js | 1 + .../data/features/private-class-fields.js | 1 + .../features/private-methods-and-accessors.js | 1 + .../caniuse-lite/data/features/progress.js | 1 + .../data/features/promise-finally.js | 1 + .../caniuse-lite/data/features/promises.js | 1 + .../caniuse-lite/data/features/proximity.js | 1 + .../caniuse-lite/data/features/proxy.js | 1 + .../data/features/public-class-fields.js | 1 + .../data/features/publickeypinning.js | 1 + .../caniuse-lite/data/features/push-api.js | 1 + .../data/features/queryselector.js | 1 + .../data/features/readonly-attr.js | 1 + .../data/features/referrer-policy.js | 1 + .../data/features/registerprotocolhandler.js | 1 + .../data/features/rel-noopener.js | 1 + .../data/features/rel-noreferrer.js | 1 + .../caniuse-lite/data/features/rellist.js | 1 + .../caniuse-lite/data/features/rem.js | 1 + .../caniuse-lite/data/features/replace-all.js | 1 + .../data/features/requestanimationframe.js | 1 + .../data/features/requestidlecallback.js | 1 + .../data/features/resizeobserver.js | 1 + .../data/features/resource-timing.js | 1 + .../data/features/rest-parameters.js | 1 + .../data/features/rtcpeerconnection.js | 1 + .../caniuse-lite/data/features/ruby.js | 1 + .../caniuse-lite/data/features/run-in.js | 1 + .../features/same-site-cookie-attribute.js | 1 + .../data/features/screen-orientation.js | 1 + .../data/features/script-async.js | 1 + .../data/features/script-defer.js | 1 + .../data/features/scrollintoview.js | 1 + .../data/features/scrollintoviewifneeded.js | 1 + .../caniuse-lite/data/features/sdch.js | 1 + .../data/features/selection-api.js | 1 + .../data/features/server-timing.js | 1 + .../data/features/serviceworkers.js | 1 + .../data/features/setimmediate.js | 1 + .../caniuse-lite/data/features/sha-2.js | 1 + .../caniuse-lite/data/features/shadowdom.js | 1 + .../caniuse-lite/data/features/shadowdomv1.js | 1 + .../data/features/sharedarraybuffer.js | 1 + .../data/features/sharedworkers.js | 1 + .../caniuse-lite/data/features/sni.js | 1 + .../caniuse-lite/data/features/spdy.js | 1 + .../data/features/speech-recognition.js | 1 + .../data/features/speech-synthesis.js | 1 + .../data/features/spellcheck-attribute.js | 1 + .../caniuse-lite/data/features/sql-storage.js | 1 + .../caniuse-lite/data/features/srcset.js | 1 + .../data/features/stopimmediatepropagation.js | 1 + .../caniuse-lite/data/features/stream.js | 1 + .../caniuse-lite/data/features/streams.js | 1 + .../data/features/stricttransportsecurity.js | 1 + .../data/features/style-scoped.js | 1 + .../data/features/subresource-integrity.js | 1 + .../caniuse-lite/data/features/svg-css.js | 1 + .../caniuse-lite/data/features/svg-filters.js | 1 + .../caniuse-lite/data/features/svg-fonts.js | 1 + .../data/features/svg-fragment.js | 1 + .../caniuse-lite/data/features/svg-html.js | 1 + .../caniuse-lite/data/features/svg-html5.js | 1 + .../caniuse-lite/data/features/svg-img.js | 1 + .../caniuse-lite/data/features/svg-smil.js | 1 + .../caniuse-lite/data/features/svg.js | 1 + .../caniuse-lite/data/features/sxg.js | 1 + .../caniuse-lite/data/features/symbols.js | 1 + .../data/features/tabindex-attr.js | 1 + .../data/features/template-literals.js | 1 + .../caniuse-lite/data/features/template.js | 1 + .../caniuse-lite/data/features/testfeat.js | 1 + .../data/features/text-decoration.js | 1 + .../data/features/text-emphasis.js | 1 + .../data/features/text-overflow.js | 1 + .../data/features/text-size-adjust.js | 1 + .../caniuse-lite/data/features/text-stroke.js | 1 + .../data/features/text-underline-offset.js | 1 + .../caniuse-lite/data/features/textcontent.js | 1 + .../caniuse-lite/data/features/textencoder.js | 1 + .../caniuse-lite/data/features/tls1-1.js | 1 + .../caniuse-lite/data/features/tls1-2.js | 1 + .../caniuse-lite/data/features/tls1-3.js | 1 + .../data/features/token-binding.js | 1 + .../caniuse-lite/data/features/touch.js | 1 + .../data/features/transforms2d.js | 1 + .../data/features/transforms3d.js | 1 + .../data/features/trusted-types.js | 1 + .../caniuse-lite/data/features/ttf.js | 1 + .../caniuse-lite/data/features/typedarrays.js | 1 + .../caniuse-lite/data/features/u2f.js | 1 + .../data/features/unhandledrejection.js | 1 + .../data/features/upgradeinsecurerequests.js | 1 + .../features/url-scroll-to-text-fragment.js | 1 + .../caniuse-lite/data/features/url.js | 1 + .../data/features/urlsearchparams.js | 1 + .../caniuse-lite/data/features/use-strict.js | 1 + .../data/features/user-select-none.js | 1 + .../caniuse-lite/data/features/user-timing.js | 1 + .../data/features/variable-fonts.js | 1 + .../caniuse-lite/data/features/vibration.js | 1 + .../caniuse-lite/data/features/video.js | 1 + .../caniuse-lite/data/features/videotracks.js | 1 + .../data/features/viewport-units.js | 1 + .../caniuse-lite/data/features/wai-aria.js | 1 + .../caniuse-lite/data/features/wasm.js | 1 + .../caniuse-lite/data/features/wav.js | 1 + .../caniuse-lite/data/features/wbr-element.js | 1 + .../data/features/web-animation.js | 1 + .../data/features/web-app-manifest.js | 1 + .../data/features/web-bluetooth.js | 1 + .../caniuse-lite/data/features/web-share.js | 1 + .../caniuse-lite/data/features/webauthn.js | 1 + .../caniuse-lite/data/features/webgl.js | 1 + .../caniuse-lite/data/features/webgl2.js | 1 + .../caniuse-lite/data/features/webgpu.js | 1 + .../caniuse-lite/data/features/webhid.js | 1 + .../caniuse-lite/data/features/webm.js | 1 + .../caniuse-lite/data/features/webp.js | 1 + .../caniuse-lite/data/features/websockets.js | 1 + .../caniuse-lite/data/features/webusb.js | 1 + .../caniuse-lite/data/features/webvr.js | 1 + .../caniuse-lite/data/features/webvtt.js | 1 + .../caniuse-lite/data/features/webworkers.js | 1 + .../caniuse-lite/data/features/webxr.js | 1 + .../caniuse-lite/data/features/will-change.js | 1 + .../caniuse-lite/data/features/woff.js | 1 + .../caniuse-lite/data/features/woff2.js | 1 + .../caniuse-lite/data/features/word-break.js | 1 + .../caniuse-lite/data/features/wordwrap.js | 1 + .../data/features/x-doc-messaging.js | 1 + .../data/features/x-frame-options.js | 1 + .../caniuse-lite/data/features/xhr2.js | 1 + .../caniuse-lite/data/features/xhtml.js | 1 + .../caniuse-lite/data/features/xhtmlsmil.js | 1 + .../data/features/xml-serializer.js | 1 + .../caniuse-lite/data/regions/AD.js | 1 + .../caniuse-lite/data/regions/AE.js | 1 + .../caniuse-lite/data/regions/AF.js | 1 + .../caniuse-lite/data/regions/AG.js | 1 + .../caniuse-lite/data/regions/AI.js | 1 + .../caniuse-lite/data/regions/AL.js | 1 + .../caniuse-lite/data/regions/AM.js | 1 + .../caniuse-lite/data/regions/AN.js | 1 + .../caniuse-lite/data/regions/AO.js | 1 + .../caniuse-lite/data/regions/AR.js | 1 + .../caniuse-lite/data/regions/AS.js | 1 + .../caniuse-lite/data/regions/AT.js | 1 + .../caniuse-lite/data/regions/AU.js | 1 + .../caniuse-lite/data/regions/AW.js | 1 + .../caniuse-lite/data/regions/AX.js | 1 + .../caniuse-lite/data/regions/AZ.js | 1 + .../caniuse-lite/data/regions/BA.js | 1 + .../caniuse-lite/data/regions/BB.js | 1 + .../caniuse-lite/data/regions/BD.js | 1 + .../caniuse-lite/data/regions/BE.js | 1 + .../caniuse-lite/data/regions/BF.js | 1 + .../caniuse-lite/data/regions/BG.js | 1 + .../caniuse-lite/data/regions/BH.js | 1 + .../caniuse-lite/data/regions/BI.js | 1 + .../caniuse-lite/data/regions/BJ.js | 1 + .../caniuse-lite/data/regions/BM.js | 1 + .../caniuse-lite/data/regions/BN.js | 1 + .../caniuse-lite/data/regions/BO.js | 1 + .../caniuse-lite/data/regions/BR.js | 1 + .../caniuse-lite/data/regions/BS.js | 1 + .../caniuse-lite/data/regions/BT.js | 1 + .../caniuse-lite/data/regions/BW.js | 1 + .../caniuse-lite/data/regions/BY.js | 1 + .../caniuse-lite/data/regions/BZ.js | 1 + .../caniuse-lite/data/regions/CA.js | 1 + .../caniuse-lite/data/regions/CD.js | 1 + .../caniuse-lite/data/regions/CF.js | 1 + .../caniuse-lite/data/regions/CG.js | 1 + .../caniuse-lite/data/regions/CH.js | 1 + .../caniuse-lite/data/regions/CI.js | 1 + .../caniuse-lite/data/regions/CK.js | 1 + .../caniuse-lite/data/regions/CL.js | 1 + .../caniuse-lite/data/regions/CM.js | 1 + .../caniuse-lite/data/regions/CN.js | 1 + .../caniuse-lite/data/regions/CO.js | 1 + .../caniuse-lite/data/regions/CR.js | 1 + .../caniuse-lite/data/regions/CU.js | 1 + .../caniuse-lite/data/regions/CV.js | 1 + .../caniuse-lite/data/regions/CX.js | 1 + .../caniuse-lite/data/regions/CY.js | 1 + .../caniuse-lite/data/regions/CZ.js | 1 + .../caniuse-lite/data/regions/DE.js | 1 + .../caniuse-lite/data/regions/DJ.js | 1 + .../caniuse-lite/data/regions/DK.js | 1 + .../caniuse-lite/data/regions/DM.js | 1 + .../caniuse-lite/data/regions/DO.js | 1 + .../caniuse-lite/data/regions/DZ.js | 1 + .../caniuse-lite/data/regions/EC.js | 1 + .../caniuse-lite/data/regions/EE.js | 1 + .../caniuse-lite/data/regions/EG.js | 1 + .../caniuse-lite/data/regions/ER.js | 1 + .../caniuse-lite/data/regions/ES.js | 1 + .../caniuse-lite/data/regions/ET.js | 1 + .../caniuse-lite/data/regions/FI.js | 1 + .../caniuse-lite/data/regions/FJ.js | 1 + .../caniuse-lite/data/regions/FK.js | 1 + .../caniuse-lite/data/regions/FM.js | 1 + .../caniuse-lite/data/regions/FO.js | 1 + .../caniuse-lite/data/regions/FR.js | 1 + .../caniuse-lite/data/regions/GA.js | 1 + .../caniuse-lite/data/regions/GB.js | 1 + .../caniuse-lite/data/regions/GD.js | 1 + .../caniuse-lite/data/regions/GE.js | 1 + .../caniuse-lite/data/regions/GF.js | 1 + .../caniuse-lite/data/regions/GG.js | 1 + .../caniuse-lite/data/regions/GH.js | 1 + .../caniuse-lite/data/regions/GI.js | 1 + .../caniuse-lite/data/regions/GL.js | 1 + .../caniuse-lite/data/regions/GM.js | 1 + .../caniuse-lite/data/regions/GN.js | 1 + .../caniuse-lite/data/regions/GP.js | 1 + .../caniuse-lite/data/regions/GQ.js | 1 + .../caniuse-lite/data/regions/GR.js | 1 + .../caniuse-lite/data/regions/GT.js | 1 + .../caniuse-lite/data/regions/GU.js | 1 + .../caniuse-lite/data/regions/GW.js | 1 + .../caniuse-lite/data/regions/GY.js | 1 + .../caniuse-lite/data/regions/HK.js | 1 + .../caniuse-lite/data/regions/HN.js | 1 + .../caniuse-lite/data/regions/HR.js | 1 + .../caniuse-lite/data/regions/HT.js | 1 + .../caniuse-lite/data/regions/HU.js | 1 + .../caniuse-lite/data/regions/ID.js | 1 + .../caniuse-lite/data/regions/IE.js | 1 + .../caniuse-lite/data/regions/IL.js | 1 + .../caniuse-lite/data/regions/IM.js | 1 + .../caniuse-lite/data/regions/IN.js | 1 + .../caniuse-lite/data/regions/IQ.js | 1 + .../caniuse-lite/data/regions/IR.js | 1 + .../caniuse-lite/data/regions/IS.js | 1 + .../caniuse-lite/data/regions/IT.js | 1 + .../caniuse-lite/data/regions/JE.js | 1 + .../caniuse-lite/data/regions/JM.js | 1 + .../caniuse-lite/data/regions/JO.js | 1 + .../caniuse-lite/data/regions/JP.js | 1 + .../caniuse-lite/data/regions/KE.js | 1 + .../caniuse-lite/data/regions/KG.js | 1 + .../caniuse-lite/data/regions/KH.js | 1 + .../caniuse-lite/data/regions/KI.js | 1 + .../caniuse-lite/data/regions/KM.js | 1 + .../caniuse-lite/data/regions/KN.js | 1 + .../caniuse-lite/data/regions/KP.js | 1 + .../caniuse-lite/data/regions/KR.js | 1 + .../caniuse-lite/data/regions/KW.js | 1 + .../caniuse-lite/data/regions/KY.js | 1 + .../caniuse-lite/data/regions/KZ.js | 1 + .../caniuse-lite/data/regions/LA.js | 1 + .../caniuse-lite/data/regions/LB.js | 1 + .../caniuse-lite/data/regions/LC.js | 1 + .../caniuse-lite/data/regions/LI.js | 1 + .../caniuse-lite/data/regions/LK.js | 1 + .../caniuse-lite/data/regions/LR.js | 1 + .../caniuse-lite/data/regions/LS.js | 1 + .../caniuse-lite/data/regions/LT.js | 1 + .../caniuse-lite/data/regions/LU.js | 1 + .../caniuse-lite/data/regions/LV.js | 1 + .../caniuse-lite/data/regions/LY.js | 1 + .../caniuse-lite/data/regions/MA.js | 1 + .../caniuse-lite/data/regions/MC.js | 1 + .../caniuse-lite/data/regions/MD.js | 1 + .../caniuse-lite/data/regions/ME.js | 1 + .../caniuse-lite/data/regions/MG.js | 1 + .../caniuse-lite/data/regions/MH.js | 1 + .../caniuse-lite/data/regions/MK.js | 1 + .../caniuse-lite/data/regions/ML.js | 1 + .../caniuse-lite/data/regions/MM.js | 1 + .../caniuse-lite/data/regions/MN.js | 1 + .../caniuse-lite/data/regions/MO.js | 1 + .../caniuse-lite/data/regions/MP.js | 1 + .../caniuse-lite/data/regions/MQ.js | 1 + .../caniuse-lite/data/regions/MR.js | 1 + .../caniuse-lite/data/regions/MS.js | 1 + .../caniuse-lite/data/regions/MT.js | 1 + .../caniuse-lite/data/regions/MU.js | 1 + .../caniuse-lite/data/regions/MV.js | 1 + .../caniuse-lite/data/regions/MW.js | 1 + .../caniuse-lite/data/regions/MX.js | 1 + .../caniuse-lite/data/regions/MY.js | 1 + .../caniuse-lite/data/regions/MZ.js | 1 + .../caniuse-lite/data/regions/NA.js | 1 + .../caniuse-lite/data/regions/NC.js | 1 + .../caniuse-lite/data/regions/NE.js | 1 + .../caniuse-lite/data/regions/NF.js | 1 + .../caniuse-lite/data/regions/NG.js | 1 + .../caniuse-lite/data/regions/NI.js | 1 + .../caniuse-lite/data/regions/NL.js | 1 + .../caniuse-lite/data/regions/NO.js | 1 + .../caniuse-lite/data/regions/NP.js | 1 + .../caniuse-lite/data/regions/NR.js | 1 + .../caniuse-lite/data/regions/NU.js | 1 + .../caniuse-lite/data/regions/NZ.js | 1 + .../caniuse-lite/data/regions/OM.js | 1 + .../caniuse-lite/data/regions/PA.js | 1 + .../caniuse-lite/data/regions/PE.js | 1 + .../caniuse-lite/data/regions/PF.js | 1 + .../caniuse-lite/data/regions/PG.js | 1 + .../caniuse-lite/data/regions/PH.js | 1 + .../caniuse-lite/data/regions/PK.js | 1 + .../caniuse-lite/data/regions/PL.js | 1 + .../caniuse-lite/data/regions/PM.js | 1 + .../caniuse-lite/data/regions/PN.js | 1 + .../caniuse-lite/data/regions/PR.js | 1 + .../caniuse-lite/data/regions/PS.js | 1 + .../caniuse-lite/data/regions/PT.js | 1 + .../caniuse-lite/data/regions/PW.js | 1 + .../caniuse-lite/data/regions/PY.js | 1 + .../caniuse-lite/data/regions/QA.js | 1 + .../caniuse-lite/data/regions/RE.js | 1 + .../caniuse-lite/data/regions/RO.js | 1 + .../caniuse-lite/data/regions/RS.js | 1 + .../caniuse-lite/data/regions/RU.js | 1 + .../caniuse-lite/data/regions/RW.js | 1 + .../caniuse-lite/data/regions/SA.js | 1 + .../caniuse-lite/data/regions/SB.js | 1 + .../caniuse-lite/data/regions/SC.js | 1 + .../caniuse-lite/data/regions/SD.js | 1 + .../caniuse-lite/data/regions/SE.js | 1 + .../caniuse-lite/data/regions/SG.js | 1 + .../caniuse-lite/data/regions/SH.js | 1 + .../caniuse-lite/data/regions/SI.js | 1 + .../caniuse-lite/data/regions/SK.js | 1 + .../caniuse-lite/data/regions/SL.js | 1 + .../caniuse-lite/data/regions/SM.js | 1 + .../caniuse-lite/data/regions/SN.js | 1 + .../caniuse-lite/data/regions/SO.js | 1 + .../caniuse-lite/data/regions/SR.js | 1 + .../caniuse-lite/data/regions/ST.js | 1 + .../caniuse-lite/data/regions/SV.js | 1 + .../caniuse-lite/data/regions/SY.js | 1 + .../caniuse-lite/data/regions/SZ.js | 1 + .../caniuse-lite/data/regions/TC.js | 1 + .../caniuse-lite/data/regions/TD.js | 1 + .../caniuse-lite/data/regions/TG.js | 1 + .../caniuse-lite/data/regions/TH.js | 1 + .../caniuse-lite/data/regions/TJ.js | 1 + .../caniuse-lite/data/regions/TK.js | 1 + .../caniuse-lite/data/regions/TL.js | 1 + .../caniuse-lite/data/regions/TM.js | 1 + .../caniuse-lite/data/regions/TN.js | 1 + .../caniuse-lite/data/regions/TO.js | 1 + .../caniuse-lite/data/regions/TR.js | 1 + .../caniuse-lite/data/regions/TT.js | 1 + .../caniuse-lite/data/regions/TV.js | 1 + .../caniuse-lite/data/regions/TW.js | 1 + .../caniuse-lite/data/regions/TZ.js | 1 + .../caniuse-lite/data/regions/UA.js | 1 + .../caniuse-lite/data/regions/UG.js | 1 + .../caniuse-lite/data/regions/US.js | 1 + .../caniuse-lite/data/regions/UY.js | 1 + .../caniuse-lite/data/regions/UZ.js | 1 + .../caniuse-lite/data/regions/VA.js | 1 + .../caniuse-lite/data/regions/VC.js | 1 + .../caniuse-lite/data/regions/VE.js | 1 + .../caniuse-lite/data/regions/VG.js | 1 + .../caniuse-lite/data/regions/VI.js | 1 + .../caniuse-lite/data/regions/VN.js | 1 + .../caniuse-lite/data/regions/VU.js | 1 + .../caniuse-lite/data/regions/WF.js | 1 + .../caniuse-lite/data/regions/WS.js | 1 + .../caniuse-lite/data/regions/YE.js | 1 + .../caniuse-lite/data/regions/YT.js | 1 + .../caniuse-lite/data/regions/ZA.js | 1 + .../caniuse-lite/data/regions/ZM.js | 1 + .../caniuse-lite/data/regions/ZW.js | 1 + .../caniuse-lite/data/regions/alt-af.js | 1 + .../caniuse-lite/data/regions/alt-an.js | 1 + .../caniuse-lite/data/regions/alt-as.js | 1 + .../caniuse-lite/data/regions/alt-eu.js | 1 + .../caniuse-lite/data/regions/alt-na.js | 1 + .../caniuse-lite/data/regions/alt-oc.js | 1 + .../caniuse-lite/data/regions/alt-sa.js | 1 + .../caniuse-lite/data/regions/alt-ww.js | 1 + .../node_modules/caniuse-lite/package.json | 27 + website/www/node_modules/chalk/index.js | 228 + website/www/node_modules/chalk/index.js.flow | 93 + website/www/node_modules/chalk/license | 9 + .../chalk/node_modules/ansi-styles/index.js | 165 + .../chalk/node_modules/ansi-styles/license | 9 + .../node_modules/ansi-styles/package.json | 56 + .../chalk/node_modules/ansi-styles/readme.md | 147 + .../node_modules/color-convert/CHANGELOG.md | 54 + .../chalk/node_modules/color-convert/LICENSE | 21 + .../node_modules/color-convert/README.md | 68 + .../node_modules/color-convert/conversions.js | 868 + .../chalk/node_modules/color-convert/index.js | 78 + .../node_modules/color-convert/package.json | 46 + .../chalk/node_modules/color-convert/route.js | 97 + .../node_modules/color-name/.eslintrc.json | 43 + .../chalk/node_modules/color-name/.npmignore | 107 + .../chalk/node_modules/color-name/LICENSE | 8 + .../chalk/node_modules/color-name/README.md | 11 + .../chalk/node_modules/color-name/index.js | 152 + .../node_modules/color-name/package.json | 25 + .../chalk/node_modules/color-name/test.js | 7 + website/www/node_modules/chalk/package.json | 71 + website/www/node_modules/chalk/readme.md | 314 + website/www/node_modules/chalk/templates.js | 128 + .../www/node_modules/chalk/types/index.d.ts | 97 + website/www/node_modules/chokidar/LICENSE | 21 + website/www/node_modules/chokidar/README.md | 300 + website/www/node_modules/chokidar/index.js | 940 + .../node_modules/chokidar/lib/constants.js | 61 + .../chokidar/lib/fsevents-handler.js | 526 + .../chokidar/lib/nodefs-handler.js | 637 + .../www/node_modules/chokidar/package.json | 128 + .../node_modules/chokidar/types/index.d.ts | 187 + website/www/node_modules/cliui/CHANGELOG.md | 76 + website/www/node_modules/cliui/LICENSE.txt | 14 + website/www/node_modules/cliui/README.md | 115 + website/www/node_modules/cliui/index.js | 354 + website/www/node_modules/cliui/package.json | 65 + .../node_modules/color-convert/CHANGELOG.md | 54 + .../www/node_modules/color-convert/LICENSE | 21 + .../www/node_modules/color-convert/README.md | 68 + .../node_modules/color-convert/conversions.js | 839 + .../www/node_modules/color-convert/index.js | 81 + .../node_modules/color-convert/package.json | 48 + .../www/node_modules/color-convert/route.js | 97 + website/www/node_modules/color-name/LICENSE | 8 + website/www/node_modules/color-name/README.md | 11 + website/www/node_modules/color-name/index.js | 152 + .../www/node_modules/color-name/package.json | 28 + .../www/node_modules/cosmiconfig/CHANGELOG.md | 151 + website/www/node_modules/cosmiconfig/LICENSE | 22 + .../www/node_modules/cosmiconfig/README.md | 537 + .../cosmiconfig/node_modules/.bin/js-yaml | 132 + .../www/node_modules/cosmiconfig/package.json | 114 + .../www/node_modules/cross-env/CHANGELOG.md | 5 + website/www/node_modules/cross-env/LICENSE | 20 + website/www/node_modules/cross-env/README.md | 259 + .../www/node_modules/cross-env/package.json | 59 + .../www/node_modules/cross-env/src/command.js | 32 + .../www/node_modules/cross-env/src/index.js | 95 + .../node_modules/cross-env/src/is-windows.js | 2 + .../node_modules/cross-env/src/variable.js | 69 + .../www/node_modules/cross-spawn/CHANGELOG.md | 116 + website/www/node_modules/cross-spawn/LICENSE | 21 + .../www/node_modules/cross-spawn/README.md | 96 + website/www/node_modules/cross-spawn/index.js | 39 + .../node_modules/cross-spawn/lib/enoent.js | 59 + .../www/node_modules/cross-spawn/lib/parse.js | 91 + .../cross-spawn/lib/util/escape.js | 45 + .../cross-spawn/lib/util/readShebang.js | 23 + .../cross-spawn/lib/util/resolveCommand.js | 51 + .../cross-spawn/node_modules/.bin/node-which | 52 + .../www/node_modules/cross-spawn/package.json | 77 + website/www/node_modules/decamelize/index.js | 13 + website/www/node_modules/decamelize/license | 21 + .../www/node_modules/decamelize/package.json | 38 + website/www/node_modules/decamelize/readme.md | 48 + .../dependency-graph/CHANGELOG.md | 73 + .../www/node_modules/dependency-graph/LICENSE | 19 + .../node_modules/dependency-graph/README.md | 74 + .../dependency-graph/lib/dep_graph.js | 327 + .../dependency-graph/lib/index.d.ts | 93 + .../dependency-graph/package.json | 31 + .../dependency-graph/specs/dep_graph_spec.js | 493 + website/www/node_modules/dir-glob/index.js | 75 + website/www/node_modules/dir-glob/license | 9 + .../www/node_modules/dir-glob/package.json | 38 + website/www/node_modules/dir-glob/readme.md | 76 + .../electron-to-chromium/CHANGELOG.md | 14 + .../node_modules/electron-to-chromium/LICENSE | 5 + .../electron-to-chromium/README.md | 180 + .../electron-to-chromium/chromium-versions.js | 30 + .../full-chromium-versions.js | 877 + .../electron-to-chromium/full-versions.js | 625 + .../electron-to-chromium/index.js | 36 + .../electron-to-chromium/package.json | 38 + .../electron-to-chromium/versions.js | 46 + .../node_modules/emoji-regex/LICENSE-MIT.txt | 20 + .../www/node_modules/emoji-regex/README.md | 73 + .../node_modules/emoji-regex/es2015/index.js | 6 + .../node_modules/emoji-regex/es2015/text.js | 6 + .../www/node_modules/emoji-regex/index.d.ts | 23 + website/www/node_modules/emoji-regex/index.js | 6 + .../www/node_modules/emoji-regex/package.json | 50 + website/www/node_modules/emoji-regex/text.js | 6 + website/www/node_modules/error-ex/LICENSE | 21 + website/www/node_modules/error-ex/README.md | 144 + website/www/node_modules/error-ex/index.js | 141 + .../www/node_modules/error-ex/package.json | 46 + .../escape-string-regexp/index.js | 11 + .../node_modules/escape-string-regexp/license | 21 + .../escape-string-regexp/package.json | 41 + .../escape-string-regexp/readme.md | 27 + website/www/node_modules/esprima/ChangeLog | 235 + website/www/node_modules/esprima/LICENSE.BSD | 21 + website/www/node_modules/esprima/README.md | 46 + website/www/node_modules/esprima/package.json | 112 + website/www/node_modules/fast-glob/LICENSE | 21 + website/www/node_modules/fast-glob/README.md | 793 + .../www/node_modules/fast-glob/package.json | 85 + .../fastq/.github/workflows/ci.yml | 50 + website/www/node_modules/fastq/LICENSE | 13 + website/www/node_modules/fastq/README.md | 200 + website/www/node_modules/fastq/bench.js | 58 + website/www/node_modules/fastq/example.js | 12 + website/www/node_modules/fastq/index.d.ts | 24 + website/www/node_modules/fastq/package.json | 47 + website/www/node_modules/fastq/queue.js | 186 + .../www/node_modules/fastq/test/example.ts | 37 + website/www/node_modules/fastq/test/test.js | 538 + .../www/node_modules/fastq/test/tsconfig.json | 11 + website/www/node_modules/fill-range/LICENSE | 21 + website/www/node_modules/fill-range/README.md | 237 + website/www/node_modules/fill-range/index.js | 249 + .../www/node_modules/fill-range/package.json | 69 + website/www/node_modules/find-up/index.d.ts | 137 + website/www/node_modules/find-up/index.js | 89 + website/www/node_modules/find-up/license | 9 + website/www/node_modules/find-up/package.json | 53 + website/www/node_modules/find-up/readme.md | 156 + .../www/node_modules/fs-extra/CHANGELOG.md | 889 + website/www/node_modules/fs-extra/LICENSE | 15 + website/www/node_modules/fs-extra/README.md | 261 + .../fs-extra/lib/copy-sync/copy-sync.js | 166 + .../fs-extra/lib/copy-sync/index.js | 5 + .../node_modules/fs-extra/lib/copy/copy.js | 232 + .../node_modules/fs-extra/lib/copy/index.js | 6 + .../node_modules/fs-extra/lib/empty/index.js | 48 + .../node_modules/fs-extra/lib/ensure/file.js | 69 + .../node_modules/fs-extra/lib/ensure/index.js | 23 + .../node_modules/fs-extra/lib/ensure/link.js | 61 + .../fs-extra/lib/ensure/symlink-paths.js | 99 + .../fs-extra/lib/ensure/symlink-type.js | 31 + .../fs-extra/lib/ensure/symlink.js | 63 + .../www/node_modules/fs-extra/lib/fs/index.js | 128 + .../www/node_modules/fs-extra/lib/index.js | 27 + .../node_modules/fs-extra/lib/json/index.js | 16 + .../fs-extra/lib/json/jsonfile.js | 11 + .../fs-extra/lib/json/output-json-sync.js | 12 + .../fs-extra/lib/json/output-json.js | 12 + .../node_modules/fs-extra/lib/mkdirs/index.js | 14 + .../fs-extra/lib/mkdirs/make-dir.js | 142 + .../fs-extra/lib/move-sync/index.js | 5 + .../fs-extra/lib/move-sync/move-sync.js | 47 + .../node_modules/fs-extra/lib/move/index.js | 6 + .../node_modules/fs-extra/lib/move/move.js | 65 + .../node_modules/fs-extra/lib/output/index.js | 40 + .../fs-extra/lib/path-exists/index.js | 12 + .../node_modules/fs-extra/lib/remove/index.js | 9 + .../fs-extra/lib/remove/rimraf.js | 314 + .../node_modules/fs-extra/lib/util/stat.js | 139 + .../node_modules/fs-extra/lib/util/utimes.js | 26 + .../www/node_modules/fs-extra/package.json | 70 + .../node_modules/get-caller-file/LICENSE.md | 6 + .../node_modules/get-caller-file/README.md | 41 + .../node_modules/get-caller-file/index.d.ts | 2 + .../www/node_modules/get-caller-file/index.js | 22 + .../node_modules/get-caller-file/index.js.map | 1 + .../node_modules/get-caller-file/package.json | 42 + website/www/node_modules/get-stdin/index.d.ts | 33 + website/www/node_modules/get-stdin/index.js | 52 + website/www/node_modules/get-stdin/license | 9 + .../www/node_modules/get-stdin/package.json | 39 + website/www/node_modules/get-stdin/readme.md | 55 + website/www/node_modules/glob-parent/LICENSE | 15 + .../www/node_modules/glob-parent/README.md | 137 + website/www/node_modules/glob-parent/index.js | 41 + .../www/node_modules/glob-parent/package.json | 48 + website/www/node_modules/globby/gitignore.js | 117 + website/www/node_modules/globby/index.d.ts | 176 + website/www/node_modules/globby/index.js | 177 + website/www/node_modules/globby/license | 9 + website/www/node_modules/globby/package.json | 82 + website/www/node_modules/globby/readme.md | 170 + .../www/node_modules/globby/stream-utils.js | 46 + website/www/node_modules/graceful-fs/LICENSE | 15 + .../www/node_modules/graceful-fs/README.md | 133 + website/www/node_modules/graceful-fs/clone.js | 19 + .../node_modules/graceful-fs/graceful-fs.js | 354 + .../graceful-fs/legacy-streams.js | 118 + .../www/node_modules/graceful-fs/package.json | 50 + .../www/node_modules/graceful-fs/polyfills.js | 342 + website/www/node_modules/has-flag/index.js | 8 + website/www/node_modules/has-flag/license | 9 + .../www/node_modules/has-flag/package.json | 44 + website/www/node_modules/has-flag/readme.md | 70 + website/www/node_modules/ignore/CHANGELOG.md | 32 + website/www/node_modules/ignore/LICENSE-MIT | 21 + website/www/node_modules/ignore/README.md | 386 + website/www/node_modules/ignore/index.d.ts | 63 + website/www/node_modules/ignore/index.js | 568 + website/www/node_modules/ignore/legacy.js | 476 + website/www/node_modules/ignore/package.json | 70 + website/www/node_modules/import-cwd/index.js | 5 + website/www/node_modules/import-cwd/license | 21 + .../www/node_modules/import-cwd/package.json | 41 + website/www/node_modules/import-cwd/readme.md | 58 + .../www/node_modules/import-fresh/index.js | 29 + website/www/node_modules/import-fresh/license | 21 + .../node_modules/import-fresh/package.json | 48 + .../www/node_modules/import-fresh/readme.md | 50 + website/www/node_modules/import-from/index.js | 12 + website/www/node_modules/import-from/license | 21 + .../www/node_modules/import-from/package.json | 38 + .../www/node_modules/import-from/readme.md | 70 + .../node_modules/is-arrayish/.editorconfig | 18 + .../node_modules/is-arrayish/.istanbul.yml | 4 + .../www/node_modules/is-arrayish/.npmignore | 5 + .../www/node_modules/is-arrayish/.travis.yml | 17 + website/www/node_modules/is-arrayish/LICENSE | 21 + .../www/node_modules/is-arrayish/README.md | 16 + website/www/node_modules/is-arrayish/index.js | 10 + .../www/node_modules/is-arrayish/package.json | 34 + .../node_modules/is-binary-path/index.d.ts | 17 + .../www/node_modules/is-binary-path/index.js | 7 + .../www/node_modules/is-binary-path/license | 9 + .../node_modules/is-binary-path/package.json | 40 + .../www/node_modules/is-binary-path/readme.md | 34 + website/www/node_modules/is-directory/LICENSE | 21 + .../www/node_modules/is-directory/README.md | 76 + .../www/node_modules/is-directory/index.js | 65 + .../node_modules/is-directory/package.json | 65 + website/www/node_modules/is-extglob/LICENSE | 21 + website/www/node_modules/is-extglob/README.md | 107 + website/www/node_modules/is-extglob/index.js | 20 + .../www/node_modules/is-extglob/package.json | 69 + .../is-fullwidth-code-point/index.d.ts | 17 + .../is-fullwidth-code-point/index.js | 50 + .../is-fullwidth-code-point/license | 9 + .../is-fullwidth-code-point/package.json | 42 + .../is-fullwidth-code-point/readme.md | 39 + website/www/node_modules/is-glob/LICENSE | 21 + website/www/node_modules/is-glob/README.md | 206 + website/www/node_modules/is-glob/index.js | 48 + website/www/node_modules/is-glob/package.json | 81 + website/www/node_modules/is-number/LICENSE | 21 + website/www/node_modules/is-number/README.md | 187 + website/www/node_modules/is-number/index.js | 18 + .../www/node_modules/is-number/package.json | 82 + website/www/node_modules/isexe/.npmignore | 2 + website/www/node_modules/isexe/LICENSE | 15 + website/www/node_modules/isexe/README.md | 51 + website/www/node_modules/isexe/index.js | 57 + website/www/node_modules/isexe/mode.js | 41 + website/www/node_modules/isexe/package.json | 31 + website/www/node_modules/isexe/test/basic.js | 221 + website/www/node_modules/isexe/windows.js | 42 + website/www/node_modules/js-yaml/CHANGELOG.md | 501 + website/www/node_modules/js-yaml/LICENSE | 21 + website/www/node_modules/js-yaml/README.md | 314 + website/www/node_modules/js-yaml/index.js | 7 + .../www/node_modules/js-yaml/lib/js-yaml.js | 39 + .../js-yaml/lib/js-yaml/common.js | 59 + .../js-yaml/lib/js-yaml/dumper.js | 827 + .../js-yaml/lib/js-yaml/exception.js | 43 + .../js-yaml/lib/js-yaml/loader.js | 1625 ++ .../node_modules/js-yaml/lib/js-yaml/mark.js | 76 + .../js-yaml/lib/js-yaml/schema.js | 108 + .../js-yaml/lib/js-yaml/schema/core.js | 18 + .../lib/js-yaml/schema/default_full.js | 25 + .../lib/js-yaml/schema/default_safe.js | 28 + .../js-yaml/lib/js-yaml/schema/failsafe.js | 17 + .../js-yaml/lib/js-yaml/schema/json.js | 25 + .../node_modules/js-yaml/lib/js-yaml/type.js | 61 + .../js-yaml/lib/js-yaml/type/binary.js | 138 + .../js-yaml/lib/js-yaml/type/bool.js | 35 + .../js-yaml/lib/js-yaml/type/float.js | 116 + .../js-yaml/lib/js-yaml/type/int.js | 173 + .../js-yaml/lib/js-yaml/type/js/function.js | 92 + .../js-yaml/lib/js-yaml/type/js/regexp.js | 60 + .../js-yaml/lib/js-yaml/type/js/undefined.js | 28 + .../js-yaml/lib/js-yaml/type/map.js | 8 + .../js-yaml/lib/js-yaml/type/merge.js | 12 + .../js-yaml/lib/js-yaml/type/null.js | 34 + .../js-yaml/lib/js-yaml/type/omap.js | 44 + .../js-yaml/lib/js-yaml/type/pairs.js | 53 + .../js-yaml/lib/js-yaml/type/seq.js | 8 + .../js-yaml/lib/js-yaml/type/set.js | 29 + .../js-yaml/lib/js-yaml/type/str.js | 8 + .../js-yaml/lib/js-yaml/type/timestamp.js | 88 + .../js-yaml/node_modules/.bin/esparse | 139 + .../js-yaml/node_modules/.bin/esvalidate | 236 + website/www/node_modules/js-yaml/package.json | 47 + .../json-parse-better-errors/CHANGELOG.md | 46 + .../json-parse-better-errors/LICENSE.md | 7 + .../json-parse-better-errors/README.md | 46 + .../json-parse-better-errors/index.js | 38 + .../json-parse-better-errors/package.json | 45 + .../www/node_modules/jsonfile/CHANGELOG.md | 165 + website/www/node_modules/jsonfile/LICENSE | 15 + website/www/node_modules/jsonfile/README.md | 205 + website/www/node_modules/jsonfile/index.js | 88 + .../www/node_modules/jsonfile/package.json | 40 + website/www/node_modules/jsonfile/utils.js | 15 + .../www/node_modules/locate-path/index.d.ts | 83 + website/www/node_modules/locate-path/index.js | 65 + website/www/node_modules/locate-path/license | 9 + .../www/node_modules/locate-path/package.json | 45 + .../www/node_modules/locate-path/readme.md | 122 + website/www/node_modules/lodash/LICENSE | 47 + website/www/node_modules/lodash/README.md | 39 + website/www/node_modules/lodash/_DataView.js | 7 + website/www/node_modules/lodash/_Hash.js | 32 + .../www/node_modules/lodash/_LazyWrapper.js | 28 + website/www/node_modules/lodash/_ListCache.js | 32 + .../www/node_modules/lodash/_LodashWrapper.js | 22 + website/www/node_modules/lodash/_Map.js | 7 + website/www/node_modules/lodash/_MapCache.js | 32 + website/www/node_modules/lodash/_Promise.js | 7 + website/www/node_modules/lodash/_Set.js | 7 + website/www/node_modules/lodash/_SetCache.js | 27 + website/www/node_modules/lodash/_Stack.js | 27 + website/www/node_modules/lodash/_Symbol.js | 6 + .../www/node_modules/lodash/_Uint8Array.js | 6 + website/www/node_modules/lodash/_WeakMap.js | 7 + website/www/node_modules/lodash/_apply.js | 21 + .../node_modules/lodash/_arrayAggregator.js | 22 + website/www/node_modules/lodash/_arrayEach.js | 22 + .../node_modules/lodash/_arrayEachRight.js | 21 + .../www/node_modules/lodash/_arrayEvery.js | 23 + .../www/node_modules/lodash/_arrayFilter.js | 25 + .../www/node_modules/lodash/_arrayIncludes.js | 17 + .../node_modules/lodash/_arrayIncludesWith.js | 22 + .../www/node_modules/lodash/_arrayLikeKeys.js | 49 + website/www/node_modules/lodash/_arrayMap.js | 21 + website/www/node_modules/lodash/_arrayPush.js | 20 + .../www/node_modules/lodash/_arrayReduce.js | 26 + .../node_modules/lodash/_arrayReduceRight.js | 24 + .../www/node_modules/lodash/_arraySample.js | 15 + .../node_modules/lodash/_arraySampleSize.js | 17 + .../www/node_modules/lodash/_arrayShuffle.js | 15 + website/www/node_modules/lodash/_arraySome.js | 23 + website/www/node_modules/lodash/_asciiSize.js | 12 + .../www/node_modules/lodash/_asciiToArray.js | 12 + .../www/node_modules/lodash/_asciiWords.js | 15 + .../node_modules/lodash/_assignMergeValue.js | 20 + .../www/node_modules/lodash/_assignValue.js | 28 + .../www/node_modules/lodash/_assocIndexOf.js | 21 + .../node_modules/lodash/_baseAggregator.js | 21 + .../www/node_modules/lodash/_baseAssign.js | 17 + .../www/node_modules/lodash/_baseAssignIn.js | 17 + .../node_modules/lodash/_baseAssignValue.js | 25 + website/www/node_modules/lodash/_baseAt.js | 23 + website/www/node_modules/lodash/_baseClamp.js | 22 + website/www/node_modules/lodash/_baseClone.js | 165 + .../www/node_modules/lodash/_baseConforms.js | 18 + .../node_modules/lodash/_baseConformsTo.js | 27 + .../www/node_modules/lodash/_baseCreate.js | 30 + website/www/node_modules/lodash/_baseDelay.js | 21 + .../node_modules/lodash/_baseDifference.js | 67 + website/www/node_modules/lodash/_baseEach.js | 14 + .../www/node_modules/lodash/_baseEachRight.js | 14 + website/www/node_modules/lodash/_baseEvery.js | 21 + .../www/node_modules/lodash/_baseExtremum.js | 32 + website/www/node_modules/lodash/_baseFill.js | 32 + .../www/node_modules/lodash/_baseFilter.js | 21 + .../www/node_modules/lodash/_baseFindIndex.js | 24 + .../www/node_modules/lodash/_baseFindKey.js | 23 + .../www/node_modules/lodash/_baseFlatten.js | 38 + website/www/node_modules/lodash/_baseFor.js | 16 + .../www/node_modules/lodash/_baseForOwn.js | 16 + .../node_modules/lodash/_baseForOwnRight.js | 16 + .../www/node_modules/lodash/_baseForRight.js | 15 + .../www/node_modules/lodash/_baseFunctions.js | 19 + website/www/node_modules/lodash/_baseGet.js | 24 + .../node_modules/lodash/_baseGetAllKeys.js | 20 + .../www/node_modules/lodash/_baseGetTag.js | 28 + website/www/node_modules/lodash/_baseGt.js | 14 + website/www/node_modules/lodash/_baseHas.js | 19 + website/www/node_modules/lodash/_baseHasIn.js | 13 + .../www/node_modules/lodash/_baseInRange.js | 18 + .../www/node_modules/lodash/_baseIndexOf.js | 20 + .../node_modules/lodash/_baseIndexOfWith.js | 23 + .../node_modules/lodash/_baseIntersection.js | 74 + .../www/node_modules/lodash/_baseInverter.js | 21 + .../www/node_modules/lodash/_baseInvoke.js | 24 + .../node_modules/lodash/_baseIsArguments.js | 18 + .../node_modules/lodash/_baseIsArrayBuffer.js | 17 + .../www/node_modules/lodash/_baseIsDate.js | 18 + .../www/node_modules/lodash/_baseIsEqual.js | 28 + .../node_modules/lodash/_baseIsEqualDeep.js | 83 + website/www/node_modules/lodash/_baseIsMap.js | 18 + .../www/node_modules/lodash/_baseIsMatch.js | 62 + website/www/node_modules/lodash/_baseIsNaN.js | 12 + .../www/node_modules/lodash/_baseIsNative.js | 47 + .../www/node_modules/lodash/_baseIsRegExp.js | 18 + website/www/node_modules/lodash/_baseIsSet.js | 18 + .../node_modules/lodash/_baseIsTypedArray.js | 60 + .../www/node_modules/lodash/_baseIteratee.js | 31 + website/www/node_modules/lodash/_baseKeys.js | 30 + .../www/node_modules/lodash/_baseKeysIn.js | 33 + .../www/node_modules/lodash/_baseLodash.js | 10 + website/www/node_modules/lodash/_baseLt.js | 14 + website/www/node_modules/lodash/_baseMap.js | 22 + .../www/node_modules/lodash/_baseMatches.js | 22 + .../lodash/_baseMatchesProperty.js | 33 + website/www/node_modules/lodash/_baseMean.js | 20 + website/www/node_modules/lodash/_baseMerge.js | 42 + .../www/node_modules/lodash/_baseMergeDeep.js | 94 + website/www/node_modules/lodash/_baseNth.js | 20 + .../www/node_modules/lodash/_baseOrderBy.js | 34 + website/www/node_modules/lodash/_basePick.js | 19 + .../www/node_modules/lodash/_basePickBy.js | 30 + .../www/node_modules/lodash/_baseProperty.js | 14 + .../node_modules/lodash/_basePropertyDeep.js | 16 + .../node_modules/lodash/_basePropertyOf.js | 14 + .../www/node_modules/lodash/_basePullAll.js | 51 + .../www/node_modules/lodash/_basePullAt.js | 37 + .../www/node_modules/lodash/_baseRandom.js | 18 + website/www/node_modules/lodash/_baseRange.js | 28 + .../www/node_modules/lodash/_baseReduce.js | 23 + .../www/node_modules/lodash/_baseRepeat.js | 35 + website/www/node_modules/lodash/_baseRest.js | 17 + .../www/node_modules/lodash/_baseSample.js | 15 + .../node_modules/lodash/_baseSampleSize.js | 18 + website/www/node_modules/lodash/_baseSet.js | 47 + .../www/node_modules/lodash/_baseSetData.js | 17 + .../node_modules/lodash/_baseSetToString.js | 22 + .../www/node_modules/lodash/_baseShuffle.js | 15 + website/www/node_modules/lodash/_baseSlice.js | 31 + website/www/node_modules/lodash/_baseSome.js | 22 + .../www/node_modules/lodash/_baseSortBy.js | 21 + .../node_modules/lodash/_baseSortedIndex.js | 42 + .../node_modules/lodash/_baseSortedIndexBy.js | 64 + .../node_modules/lodash/_baseSortedUniq.js | 30 + website/www/node_modules/lodash/_baseSum.js | 24 + website/www/node_modules/lodash/_baseTimes.js | 20 + .../www/node_modules/lodash/_baseToNumber.js | 24 + .../www/node_modules/lodash/_baseToPairs.js | 18 + .../www/node_modules/lodash/_baseToString.js | 37 + website/www/node_modules/lodash/_baseUnary.js | 14 + website/www/node_modules/lodash/_baseUniq.js | 72 + website/www/node_modules/lodash/_baseUnset.js | 20 + .../www/node_modules/lodash/_baseUpdate.js | 18 + .../www/node_modules/lodash/_baseValues.js | 19 + website/www/node_modules/lodash/_baseWhile.js | 26 + .../node_modules/lodash/_baseWrapperValue.js | 25 + website/www/node_modules/lodash/_baseXor.js | 36 + .../www/node_modules/lodash/_baseZipObject.js | 23 + website/www/node_modules/lodash/_cacheHas.js | 13 + .../lodash/_castArrayLikeObject.js | 14 + .../www/node_modules/lodash/_castFunction.js | 14 + website/www/node_modules/lodash/_castPath.js | 21 + website/www/node_modules/lodash/_castRest.js | 14 + website/www/node_modules/lodash/_castSlice.js | 18 + .../www/node_modules/lodash/_charsEndIndex.js | 19 + .../node_modules/lodash/_charsStartIndex.js | 20 + .../node_modules/lodash/_cloneArrayBuffer.js | 16 + .../www/node_modules/lodash/_cloneBuffer.js | 35 + .../www/node_modules/lodash/_cloneDataView.js | 16 + .../www/node_modules/lodash/_cloneRegExp.js | 17 + .../www/node_modules/lodash/_cloneSymbol.js | 18 + .../node_modules/lodash/_cloneTypedArray.js | 16 + .../node_modules/lodash/_compareAscending.js | 41 + .../node_modules/lodash/_compareMultiple.js | 44 + .../www/node_modules/lodash/_composeArgs.js | 39 + .../node_modules/lodash/_composeArgsRight.js | 41 + website/www/node_modules/lodash/_copyArray.js | 20 + .../www/node_modules/lodash/_copyObject.js | 40 + .../www/node_modules/lodash/_copySymbols.js | 16 + .../www/node_modules/lodash/_copySymbolsIn.js | 16 + .../www/node_modules/lodash/_coreJsData.js | 6 + .../www/node_modules/lodash/_countHolders.js | 21 + .../node_modules/lodash/_createAggregator.js | 23 + .../node_modules/lodash/_createAssigner.js | 37 + .../node_modules/lodash/_createBaseEach.js | 32 + .../www/node_modules/lodash/_createBaseFor.js | 25 + .../www/node_modules/lodash/_createBind.js | 28 + .../node_modules/lodash/_createCaseFirst.js | 33 + .../node_modules/lodash/_createCompounder.js | 24 + .../www/node_modules/lodash/_createCtor.js | 37 + .../www/node_modules/lodash/_createCurry.js | 46 + .../www/node_modules/lodash/_createFind.js | 25 + .../www/node_modules/lodash/_createFlow.js | 78 + .../www/node_modules/lodash/_createHybrid.js | 92 + .../node_modules/lodash/_createInverter.js | 17 + .../lodash/_createMathOperation.js | 38 + .../www/node_modules/lodash/_createOver.js | 27 + .../www/node_modules/lodash/_createPadding.js | 33 + .../www/node_modules/lodash/_createPartial.js | 43 + .../www/node_modules/lodash/_createRange.js | 30 + .../www/node_modules/lodash/_createRecurry.js | 56 + .../lodash/_createRelationalOperation.js | 20 + .../www/node_modules/lodash/_createRound.js | 35 + website/www/node_modules/lodash/_createSet.js | 19 + .../www/node_modules/lodash/_createToPairs.js | 30 + .../www/node_modules/lodash/_createWrap.js | 106 + .../lodash/_customDefaultsAssignIn.js | 29 + .../lodash/_customDefaultsMerge.js | 28 + .../node_modules/lodash/_customOmitClone.js | 16 + .../www/node_modules/lodash/_deburrLetter.js | 71 + .../node_modules/lodash/_defineProperty.js | 11 + .../www/node_modules/lodash/_equalArrays.js | 83 + .../www/node_modules/lodash/_equalByTag.js | 112 + .../www/node_modules/lodash/_equalObjects.js | 89 + .../node_modules/lodash/_escapeHtmlChar.js | 21 + .../node_modules/lodash/_escapeStringChar.js | 22 + website/www/node_modules/lodash/_flatRest.js | 16 + .../www/node_modules/lodash/_freeGlobal.js | 4 + .../www/node_modules/lodash/_getAllKeys.js | 16 + .../www/node_modules/lodash/_getAllKeysIn.js | 17 + website/www/node_modules/lodash/_getData.js | 15 + .../www/node_modules/lodash/_getFuncName.js | 31 + website/www/node_modules/lodash/_getHolder.js | 13 + .../www/node_modules/lodash/_getMapData.js | 18 + .../www/node_modules/lodash/_getMatchData.js | 24 + website/www/node_modules/lodash/_getNative.js | 17 + .../www/node_modules/lodash/_getPrototype.js | 6 + website/www/node_modules/lodash/_getRawTag.js | 46 + .../www/node_modules/lodash/_getSymbols.js | 30 + .../www/node_modules/lodash/_getSymbolsIn.js | 25 + website/www/node_modules/lodash/_getTag.js | 58 + website/www/node_modules/lodash/_getValue.js | 13 + website/www/node_modules/lodash/_getView.js | 33 + .../node_modules/lodash/_getWrapDetails.js | 17 + website/www/node_modules/lodash/_hasPath.js | 39 + .../www/node_modules/lodash/_hasUnicode.js | 26 + .../node_modules/lodash/_hasUnicodeWord.js | 15 + website/www/node_modules/lodash/_hashClear.js | 15 + .../www/node_modules/lodash/_hashDelete.js | 17 + website/www/node_modules/lodash/_hashGet.js | 30 + website/www/node_modules/lodash/_hashHas.js | 23 + website/www/node_modules/lodash/_hashSet.js | 23 + .../node_modules/lodash/_initCloneArray.js | 26 + .../node_modules/lodash/_initCloneByTag.js | 77 + .../node_modules/lodash/_initCloneObject.js | 18 + .../node_modules/lodash/_insertWrapDetails.js | 23 + .../www/node_modules/lodash/_isFlattenable.js | 20 + website/www/node_modules/lodash/_isIndex.js | 25 + .../node_modules/lodash/_isIterateeCall.js | 30 + website/www/node_modules/lodash/_isKey.js | 29 + website/www/node_modules/lodash/_isKeyable.js | 15 + .../www/node_modules/lodash/_isLaziable.js | 28 + .../www/node_modules/lodash/_isMaskable.js | 14 + website/www/node_modules/lodash/_isMasked.js | 20 + .../www/node_modules/lodash/_isPrototype.js | 18 + .../lodash/_isStrictComparable.js | 15 + .../node_modules/lodash/_iteratorToArray.js | 18 + website/www/node_modules/lodash/_lazyClone.js | 23 + .../www/node_modules/lodash/_lazyReverse.js | 23 + website/www/node_modules/lodash/_lazyValue.js | 69 + .../node_modules/lodash/_listCacheClear.js | 13 + .../node_modules/lodash/_listCacheDelete.js | 35 + .../www/node_modules/lodash/_listCacheGet.js | 19 + .../www/node_modules/lodash/_listCacheHas.js | 16 + .../www/node_modules/lodash/_listCacheSet.js | 26 + .../www/node_modules/lodash/_mapCacheClear.js | 21 + .../node_modules/lodash/_mapCacheDelete.js | 18 + .../www/node_modules/lodash/_mapCacheGet.js | 16 + .../www/node_modules/lodash/_mapCacheHas.js | 16 + .../www/node_modules/lodash/_mapCacheSet.js | 22 + .../www/node_modules/lodash/_mapToArray.js | 18 + .../lodash/_matchesStrictComparable.js | 20 + .../www/node_modules/lodash/_memoizeCapped.js | 26 + website/www/node_modules/lodash/_mergeData.js | 90 + website/www/node_modules/lodash/_metaMap.js | 6 + .../www/node_modules/lodash/_nativeCreate.js | 6 + .../www/node_modules/lodash/_nativeKeys.js | 6 + .../www/node_modules/lodash/_nativeKeysIn.js | 20 + website/www/node_modules/lodash/_nodeUtil.js | 30 + .../node_modules/lodash/_objectToString.js | 22 + website/www/node_modules/lodash/_overArg.js | 15 + website/www/node_modules/lodash/_overRest.js | 36 + website/www/node_modules/lodash/_parent.js | 16 + website/www/node_modules/lodash/_reEscape.js | 4 + .../www/node_modules/lodash/_reEvaluate.js | 4 + .../www/node_modules/lodash/_reInterpolate.js | 4 + website/www/node_modules/lodash/_realNames.js | 4 + website/www/node_modules/lodash/_reorder.js | 29 + .../node_modules/lodash/_replaceHolders.js | 29 + website/www/node_modules/lodash/_root.js | 9 + website/www/node_modules/lodash/_safeGet.js | 21 + .../www/node_modules/lodash/_setCacheAdd.js | 19 + .../www/node_modules/lodash/_setCacheHas.js | 14 + website/www/node_modules/lodash/_setData.js | 20 + .../www/node_modules/lodash/_setToArray.js | 18 + .../www/node_modules/lodash/_setToPairs.js | 18 + .../www/node_modules/lodash/_setToString.js | 14 + .../node_modules/lodash/_setWrapToString.js | 21 + website/www/node_modules/lodash/_shortOut.js | 37 + .../www/node_modules/lodash/_shuffleSelf.js | 28 + .../www/node_modules/lodash/_stackClear.js | 15 + .../www/node_modules/lodash/_stackDelete.js | 18 + website/www/node_modules/lodash/_stackGet.js | 14 + website/www/node_modules/lodash/_stackHas.js | 14 + website/www/node_modules/lodash/_stackSet.js | 34 + .../www/node_modules/lodash/_strictIndexOf.js | 23 + .../node_modules/lodash/_strictLastIndexOf.js | 21 + .../www/node_modules/lodash/_stringSize.js | 18 + .../www/node_modules/lodash/_stringToArray.js | 18 + .../www/node_modules/lodash/_stringToPath.js | 27 + website/www/node_modules/lodash/_toKey.js | 21 + website/www/node_modules/lodash/_toSource.js | 26 + .../node_modules/lodash/_unescapeHtmlChar.js | 21 + .../www/node_modules/lodash/_unicodeSize.js | 44 + .../node_modules/lodash/_unicodeToArray.js | 40 + .../www/node_modules/lodash/_unicodeWords.js | 69 + .../node_modules/lodash/_updateWrapDetails.js | 46 + .../www/node_modules/lodash/_wrapperClone.js | 23 + website/www/node_modules/lodash/add.js | 22 + website/www/node_modules/lodash/after.js | 42 + website/www/node_modules/lodash/array.js | 67 + website/www/node_modules/lodash/ary.js | 29 + website/www/node_modules/lodash/assign.js | 58 + website/www/node_modules/lodash/assignIn.js | 40 + .../www/node_modules/lodash/assignInWith.js | 38 + website/www/node_modules/lodash/assignWith.js | 37 + website/www/node_modules/lodash/at.js | 23 + website/www/node_modules/lodash/attempt.js | 35 + website/www/node_modules/lodash/before.js | 40 + website/www/node_modules/lodash/bind.js | 57 + website/www/node_modules/lodash/bindAll.js | 41 + website/www/node_modules/lodash/bindKey.js | 68 + website/www/node_modules/lodash/camelCase.js | 29 + website/www/node_modules/lodash/capitalize.js | 23 + website/www/node_modules/lodash/castArray.js | 44 + website/www/node_modules/lodash/ceil.js | 26 + website/www/node_modules/lodash/chain.js | 38 + website/www/node_modules/lodash/chunk.js | 50 + website/www/node_modules/lodash/clamp.js | 39 + website/www/node_modules/lodash/clone.js | 36 + website/www/node_modules/lodash/cloneDeep.js | 29 + .../www/node_modules/lodash/cloneDeepWith.js | 40 + website/www/node_modules/lodash/cloneWith.js | 42 + website/www/node_modules/lodash/collection.js | 30 + website/www/node_modules/lodash/commit.js | 33 + website/www/node_modules/lodash/compact.js | 31 + website/www/node_modules/lodash/concat.js | 43 + website/www/node_modules/lodash/cond.js | 60 + website/www/node_modules/lodash/conforms.js | 35 + website/www/node_modules/lodash/conformsTo.js | 32 + website/www/node_modules/lodash/constant.js | 26 + website/www/node_modules/lodash/core.js | 3854 +++ website/www/node_modules/lodash/core.min.js | 29 + website/www/node_modules/lodash/countBy.js | 40 + website/www/node_modules/lodash/create.js | 43 + website/www/node_modules/lodash/curry.js | 57 + website/www/node_modules/lodash/curryRight.js | 54 + website/www/node_modules/lodash/date.js | 3 + website/www/node_modules/lodash/debounce.js | 191 + website/www/node_modules/lodash/deburr.js | 45 + website/www/node_modules/lodash/defaultTo.js | 25 + website/www/node_modules/lodash/defaults.js | 64 + .../www/node_modules/lodash/defaultsDeep.js | 30 + website/www/node_modules/lodash/defer.js | 26 + website/www/node_modules/lodash/delay.js | 28 + website/www/node_modules/lodash/difference.js | 33 + .../www/node_modules/lodash/differenceBy.js | 44 + .../www/node_modules/lodash/differenceWith.js | 40 + website/www/node_modules/lodash/divide.js | 22 + website/www/node_modules/lodash/drop.js | 38 + website/www/node_modules/lodash/dropRight.js | 39 + .../www/node_modules/lodash/dropRightWhile.js | 45 + website/www/node_modules/lodash/dropWhile.js | 45 + website/www/node_modules/lodash/each.js | 1 + website/www/node_modules/lodash/eachRight.js | 1 + website/www/node_modules/lodash/endsWith.js | 43 + website/www/node_modules/lodash/entries.js | 1 + website/www/node_modules/lodash/entriesIn.js | 1 + website/www/node_modules/lodash/eq.js | 37 + website/www/node_modules/lodash/escape.js | 43 + .../www/node_modules/lodash/escapeRegExp.js | 32 + website/www/node_modules/lodash/every.js | 56 + website/www/node_modules/lodash/extend.js | 1 + website/www/node_modules/lodash/extendWith.js | 1 + website/www/node_modules/lodash/fill.js | 45 + website/www/node_modules/lodash/filter.js | 48 + website/www/node_modules/lodash/find.js | 42 + website/www/node_modules/lodash/findIndex.js | 55 + website/www/node_modules/lodash/findKey.js | 44 + website/www/node_modules/lodash/findLast.js | 25 + .../www/node_modules/lodash/findLastIndex.js | 59 + .../www/node_modules/lodash/findLastKey.js | 44 + website/www/node_modules/lodash/first.js | 1 + website/www/node_modules/lodash/flatMap.js | 29 + .../www/node_modules/lodash/flatMapDeep.js | 31 + .../www/node_modules/lodash/flatMapDepth.js | 31 + website/www/node_modules/lodash/flatten.js | 22 + .../www/node_modules/lodash/flattenDeep.js | 25 + .../www/node_modules/lodash/flattenDepth.js | 33 + website/www/node_modules/lodash/flip.js | 28 + website/www/node_modules/lodash/floor.js | 26 + website/www/node_modules/lodash/flow.js | 27 + website/www/node_modules/lodash/flowRight.js | 26 + website/www/node_modules/lodash/forEach.js | 41 + .../www/node_modules/lodash/forEachRight.js | 31 + website/www/node_modules/lodash/forIn.js | 39 + website/www/node_modules/lodash/forInRight.js | 37 + website/www/node_modules/lodash/forOwn.js | 36 + .../www/node_modules/lodash/forOwnRight.js | 34 + website/www/node_modules/lodash/fp.js | 2 + website/www/node_modules/lodash/fp/F.js | 1 + website/www/node_modules/lodash/fp/T.js | 1 + website/www/node_modules/lodash/fp/__.js | 1 + .../node_modules/lodash/fp/_baseConvert.js | 569 + .../node_modules/lodash/fp/_convertBrowser.js | 18 + .../node_modules/lodash/fp/_falseOptions.js | 7 + .../www/node_modules/lodash/fp/_mapping.js | 358 + website/www/node_modules/lodash/fp/_util.js | 16 + website/www/node_modules/lodash/fp/add.js | 5 + website/www/node_modules/lodash/fp/after.js | 5 + website/www/node_modules/lodash/fp/all.js | 1 + website/www/node_modules/lodash/fp/allPass.js | 1 + website/www/node_modules/lodash/fp/always.js | 1 + website/www/node_modules/lodash/fp/any.js | 1 + website/www/node_modules/lodash/fp/anyPass.js | 1 + website/www/node_modules/lodash/fp/apply.js | 1 + website/www/node_modules/lodash/fp/array.js | 2 + website/www/node_modules/lodash/fp/ary.js | 5 + website/www/node_modules/lodash/fp/assign.js | 5 + .../www/node_modules/lodash/fp/assignAll.js | 5 + .../node_modules/lodash/fp/assignAllWith.js | 5 + .../www/node_modules/lodash/fp/assignIn.js | 5 + .../www/node_modules/lodash/fp/assignInAll.js | 5 + .../node_modules/lodash/fp/assignInAllWith.js | 5 + .../node_modules/lodash/fp/assignInWith.js | 5 + .../www/node_modules/lodash/fp/assignWith.js | 5 + website/www/node_modules/lodash/fp/assoc.js | 1 + .../www/node_modules/lodash/fp/assocPath.js | 1 + website/www/node_modules/lodash/fp/at.js | 5 + website/www/node_modules/lodash/fp/attempt.js | 5 + website/www/node_modules/lodash/fp/before.js | 5 + website/www/node_modules/lodash/fp/bind.js | 5 + website/www/node_modules/lodash/fp/bindAll.js | 5 + website/www/node_modules/lodash/fp/bindKey.js | 5 + .../www/node_modules/lodash/fp/camelCase.js | 5 + .../www/node_modules/lodash/fp/capitalize.js | 5 + .../www/node_modules/lodash/fp/castArray.js | 5 + website/www/node_modules/lodash/fp/ceil.js | 5 + website/www/node_modules/lodash/fp/chain.js | 5 + website/www/node_modules/lodash/fp/chunk.js | 5 + website/www/node_modules/lodash/fp/clamp.js | 5 + website/www/node_modules/lodash/fp/clone.js | 5 + .../www/node_modules/lodash/fp/cloneDeep.js | 5 + .../node_modules/lodash/fp/cloneDeepWith.js | 5 + .../www/node_modules/lodash/fp/cloneWith.js | 5 + .../www/node_modules/lodash/fp/collection.js | 2 + website/www/node_modules/lodash/fp/commit.js | 5 + website/www/node_modules/lodash/fp/compact.js | 5 + .../www/node_modules/lodash/fp/complement.js | 1 + website/www/node_modules/lodash/fp/compose.js | 1 + website/www/node_modules/lodash/fp/concat.js | 5 + website/www/node_modules/lodash/fp/cond.js | 5 + .../www/node_modules/lodash/fp/conforms.js | 1 + .../www/node_modules/lodash/fp/conformsTo.js | 5 + .../www/node_modules/lodash/fp/constant.js | 5 + .../www/node_modules/lodash/fp/contains.js | 1 + website/www/node_modules/lodash/fp/convert.js | 18 + website/www/node_modules/lodash/fp/countBy.js | 5 + website/www/node_modules/lodash/fp/create.js | 5 + website/www/node_modules/lodash/fp/curry.js | 5 + website/www/node_modules/lodash/fp/curryN.js | 5 + .../www/node_modules/lodash/fp/curryRight.js | 5 + .../www/node_modules/lodash/fp/curryRightN.js | 5 + website/www/node_modules/lodash/fp/date.js | 2 + .../www/node_modules/lodash/fp/debounce.js | 5 + website/www/node_modules/lodash/fp/deburr.js | 5 + .../www/node_modules/lodash/fp/defaultTo.js | 5 + .../www/node_modules/lodash/fp/defaults.js | 5 + .../www/node_modules/lodash/fp/defaultsAll.js | 5 + .../node_modules/lodash/fp/defaultsDeep.js | 5 + .../node_modules/lodash/fp/defaultsDeepAll.js | 5 + website/www/node_modules/lodash/fp/defer.js | 5 + website/www/node_modules/lodash/fp/delay.js | 5 + .../www/node_modules/lodash/fp/difference.js | 5 + .../node_modules/lodash/fp/differenceBy.js | 5 + .../node_modules/lodash/fp/differenceWith.js | 5 + website/www/node_modules/lodash/fp/dissoc.js | 1 + .../www/node_modules/lodash/fp/dissocPath.js | 1 + website/www/node_modules/lodash/fp/divide.js | 5 + website/www/node_modules/lodash/fp/drop.js | 5 + .../www/node_modules/lodash/fp/dropLast.js | 1 + .../node_modules/lodash/fp/dropLastWhile.js | 1 + .../www/node_modules/lodash/fp/dropRight.js | 5 + .../node_modules/lodash/fp/dropRightWhile.js | 5 + .../www/node_modules/lodash/fp/dropWhile.js | 5 + website/www/node_modules/lodash/fp/each.js | 1 + .../www/node_modules/lodash/fp/eachRight.js | 1 + .../www/node_modules/lodash/fp/endsWith.js | 5 + website/www/node_modules/lodash/fp/entries.js | 1 + .../www/node_modules/lodash/fp/entriesIn.js | 1 + website/www/node_modules/lodash/fp/eq.js | 5 + website/www/node_modules/lodash/fp/equals.js | 1 + website/www/node_modules/lodash/fp/escape.js | 5 + .../node_modules/lodash/fp/escapeRegExp.js | 5 + website/www/node_modules/lodash/fp/every.js | 5 + website/www/node_modules/lodash/fp/extend.js | 1 + .../www/node_modules/lodash/fp/extendAll.js | 1 + .../node_modules/lodash/fp/extendAllWith.js | 1 + .../www/node_modules/lodash/fp/extendWith.js | 1 + website/www/node_modules/lodash/fp/fill.js | 5 + website/www/node_modules/lodash/fp/filter.js | 5 + website/www/node_modules/lodash/fp/find.js | 5 + .../www/node_modules/lodash/fp/findFrom.js | 5 + .../www/node_modules/lodash/fp/findIndex.js | 5 + .../node_modules/lodash/fp/findIndexFrom.js | 5 + website/www/node_modules/lodash/fp/findKey.js | 5 + .../www/node_modules/lodash/fp/findLast.js | 5 + .../node_modules/lodash/fp/findLastFrom.js | 5 + .../node_modules/lodash/fp/findLastIndex.js | 5 + .../lodash/fp/findLastIndexFrom.js | 5 + .../www/node_modules/lodash/fp/findLastKey.js | 5 + website/www/node_modules/lodash/fp/first.js | 1 + website/www/node_modules/lodash/fp/flatMap.js | 5 + .../www/node_modules/lodash/fp/flatMapDeep.js | 5 + .../node_modules/lodash/fp/flatMapDepth.js | 5 + website/www/node_modules/lodash/fp/flatten.js | 5 + .../www/node_modules/lodash/fp/flattenDeep.js | 5 + .../node_modules/lodash/fp/flattenDepth.js | 5 + website/www/node_modules/lodash/fp/flip.js | 5 + website/www/node_modules/lodash/fp/floor.js | 5 + website/www/node_modules/lodash/fp/flow.js | 5 + .../www/node_modules/lodash/fp/flowRight.js | 5 + website/www/node_modules/lodash/fp/forEach.js | 5 + .../node_modules/lodash/fp/forEachRight.js | 5 + website/www/node_modules/lodash/fp/forIn.js | 5 + .../www/node_modules/lodash/fp/forInRight.js | 5 + website/www/node_modules/lodash/fp/forOwn.js | 5 + .../www/node_modules/lodash/fp/forOwnRight.js | 5 + .../www/node_modules/lodash/fp/fromPairs.js | 5 + .../www/node_modules/lodash/fp/function.js | 2 + .../www/node_modules/lodash/fp/functions.js | 5 + .../www/node_modules/lodash/fp/functionsIn.js | 5 + website/www/node_modules/lodash/fp/get.js | 5 + website/www/node_modules/lodash/fp/getOr.js | 5 + website/www/node_modules/lodash/fp/groupBy.js | 5 + website/www/node_modules/lodash/fp/gt.js | 5 + website/www/node_modules/lodash/fp/gte.js | 5 + website/www/node_modules/lodash/fp/has.js | 5 + website/www/node_modules/lodash/fp/hasIn.js | 5 + website/www/node_modules/lodash/fp/head.js | 5 + .../www/node_modules/lodash/fp/identical.js | 1 + .../www/node_modules/lodash/fp/identity.js | 5 + website/www/node_modules/lodash/fp/inRange.js | 5 + .../www/node_modules/lodash/fp/includes.js | 5 + .../node_modules/lodash/fp/includesFrom.js | 5 + website/www/node_modules/lodash/fp/indexBy.js | 1 + website/www/node_modules/lodash/fp/indexOf.js | 5 + .../www/node_modules/lodash/fp/indexOfFrom.js | 5 + website/www/node_modules/lodash/fp/init.js | 1 + website/www/node_modules/lodash/fp/initial.js | 5 + .../node_modules/lodash/fp/intersection.js | 5 + .../node_modules/lodash/fp/intersectionBy.js | 5 + .../lodash/fp/intersectionWith.js | 5 + website/www/node_modules/lodash/fp/invert.js | 5 + .../www/node_modules/lodash/fp/invertBy.js | 5 + .../www/node_modules/lodash/fp/invertObj.js | 1 + website/www/node_modules/lodash/fp/invoke.js | 5 + .../www/node_modules/lodash/fp/invokeArgs.js | 5 + .../node_modules/lodash/fp/invokeArgsMap.js | 5 + .../www/node_modules/lodash/fp/invokeMap.js | 5 + .../www/node_modules/lodash/fp/isArguments.js | 5 + website/www/node_modules/lodash/fp/isArray.js | 5 + .../node_modules/lodash/fp/isArrayBuffer.js | 5 + .../www/node_modules/lodash/fp/isArrayLike.js | 5 + .../lodash/fp/isArrayLikeObject.js | 5 + .../www/node_modules/lodash/fp/isBoolean.js | 5 + .../www/node_modules/lodash/fp/isBuffer.js | 5 + website/www/node_modules/lodash/fp/isDate.js | 5 + .../www/node_modules/lodash/fp/isElement.js | 5 + website/www/node_modules/lodash/fp/isEmpty.js | 5 + website/www/node_modules/lodash/fp/isEqual.js | 5 + .../www/node_modules/lodash/fp/isEqualWith.js | 5 + website/www/node_modules/lodash/fp/isError.js | 5 + .../www/node_modules/lodash/fp/isFinite.js | 5 + .../www/node_modules/lodash/fp/isFunction.js | 5 + .../www/node_modules/lodash/fp/isInteger.js | 5 + .../www/node_modules/lodash/fp/isLength.js | 5 + website/www/node_modules/lodash/fp/isMap.js | 5 + website/www/node_modules/lodash/fp/isMatch.js | 5 + .../www/node_modules/lodash/fp/isMatchWith.js | 5 + website/www/node_modules/lodash/fp/isNaN.js | 5 + .../www/node_modules/lodash/fp/isNative.js | 5 + website/www/node_modules/lodash/fp/isNil.js | 5 + website/www/node_modules/lodash/fp/isNull.js | 5 + .../www/node_modules/lodash/fp/isNumber.js | 5 + .../www/node_modules/lodash/fp/isObject.js | 5 + .../node_modules/lodash/fp/isObjectLike.js | 5 + .../node_modules/lodash/fp/isPlainObject.js | 5 + .../www/node_modules/lodash/fp/isRegExp.js | 5 + .../node_modules/lodash/fp/isSafeInteger.js | 5 + website/www/node_modules/lodash/fp/isSet.js | 5 + .../www/node_modules/lodash/fp/isString.js | 5 + .../www/node_modules/lodash/fp/isSymbol.js | 5 + .../node_modules/lodash/fp/isTypedArray.js | 5 + .../www/node_modules/lodash/fp/isUndefined.js | 5 + .../www/node_modules/lodash/fp/isWeakMap.js | 5 + .../www/node_modules/lodash/fp/isWeakSet.js | 5 + .../www/node_modules/lodash/fp/iteratee.js | 5 + website/www/node_modules/lodash/fp/join.js | 5 + website/www/node_modules/lodash/fp/juxt.js | 1 + .../www/node_modules/lodash/fp/kebabCase.js | 5 + website/www/node_modules/lodash/fp/keyBy.js | 5 + website/www/node_modules/lodash/fp/keys.js | 5 + website/www/node_modules/lodash/fp/keysIn.js | 5 + website/www/node_modules/lodash/fp/lang.js | 2 + website/www/node_modules/lodash/fp/last.js | 5 + .../www/node_modules/lodash/fp/lastIndexOf.js | 5 + .../node_modules/lodash/fp/lastIndexOfFrom.js | 5 + .../www/node_modules/lodash/fp/lowerCase.js | 5 + .../www/node_modules/lodash/fp/lowerFirst.js | 5 + website/www/node_modules/lodash/fp/lt.js | 5 + website/www/node_modules/lodash/fp/lte.js | 5 + website/www/node_modules/lodash/fp/map.js | 5 + website/www/node_modules/lodash/fp/mapKeys.js | 5 + .../www/node_modules/lodash/fp/mapValues.js | 5 + website/www/node_modules/lodash/fp/matches.js | 1 + .../node_modules/lodash/fp/matchesProperty.js | 5 + website/www/node_modules/lodash/fp/math.js | 2 + website/www/node_modules/lodash/fp/max.js | 5 + website/www/node_modules/lodash/fp/maxBy.js | 5 + website/www/node_modules/lodash/fp/mean.js | 5 + website/www/node_modules/lodash/fp/meanBy.js | 5 + website/www/node_modules/lodash/fp/memoize.js | 5 + website/www/node_modules/lodash/fp/merge.js | 5 + .../www/node_modules/lodash/fp/mergeAll.js | 5 + .../node_modules/lodash/fp/mergeAllWith.js | 5 + .../www/node_modules/lodash/fp/mergeWith.js | 5 + website/www/node_modules/lodash/fp/method.js | 5 + .../www/node_modules/lodash/fp/methodOf.js | 5 + website/www/node_modules/lodash/fp/min.js | 5 + website/www/node_modules/lodash/fp/minBy.js | 5 + website/www/node_modules/lodash/fp/mixin.js | 5 + .../www/node_modules/lodash/fp/multiply.js | 5 + website/www/node_modules/lodash/fp/nAry.js | 1 + website/www/node_modules/lodash/fp/negate.js | 5 + website/www/node_modules/lodash/fp/next.js | 5 + website/www/node_modules/lodash/fp/noop.js | 5 + website/www/node_modules/lodash/fp/now.js | 5 + website/www/node_modules/lodash/fp/nth.js | 5 + website/www/node_modules/lodash/fp/nthArg.js | 5 + website/www/node_modules/lodash/fp/number.js | 2 + website/www/node_modules/lodash/fp/object.js | 2 + website/www/node_modules/lodash/fp/omit.js | 5 + website/www/node_modules/lodash/fp/omitAll.js | 1 + website/www/node_modules/lodash/fp/omitBy.js | 5 + website/www/node_modules/lodash/fp/once.js | 5 + website/www/node_modules/lodash/fp/orderBy.js | 5 + website/www/node_modules/lodash/fp/over.js | 5 + .../www/node_modules/lodash/fp/overArgs.js | 5 + .../www/node_modules/lodash/fp/overEvery.js | 5 + .../www/node_modules/lodash/fp/overSome.js | 5 + website/www/node_modules/lodash/fp/pad.js | 5 + .../www/node_modules/lodash/fp/padChars.js | 5 + .../www/node_modules/lodash/fp/padCharsEnd.js | 5 + .../node_modules/lodash/fp/padCharsStart.js | 5 + website/www/node_modules/lodash/fp/padEnd.js | 5 + .../www/node_modules/lodash/fp/padStart.js | 5 + .../www/node_modules/lodash/fp/parseInt.js | 5 + website/www/node_modules/lodash/fp/partial.js | 5 + .../node_modules/lodash/fp/partialRight.js | 5 + .../www/node_modules/lodash/fp/partition.js | 5 + website/www/node_modules/lodash/fp/path.js | 1 + website/www/node_modules/lodash/fp/pathEq.js | 1 + website/www/node_modules/lodash/fp/pathOr.js | 1 + website/www/node_modules/lodash/fp/paths.js | 1 + website/www/node_modules/lodash/fp/pick.js | 5 + website/www/node_modules/lodash/fp/pickAll.js | 1 + website/www/node_modules/lodash/fp/pickBy.js | 5 + website/www/node_modules/lodash/fp/pipe.js | 1 + .../www/node_modules/lodash/fp/placeholder.js | 6 + website/www/node_modules/lodash/fp/plant.js | 5 + website/www/node_modules/lodash/fp/pluck.js | 1 + website/www/node_modules/lodash/fp/prop.js | 1 + website/www/node_modules/lodash/fp/propEq.js | 1 + website/www/node_modules/lodash/fp/propOr.js | 1 + .../www/node_modules/lodash/fp/property.js | 1 + .../www/node_modules/lodash/fp/propertyOf.js | 5 + website/www/node_modules/lodash/fp/props.js | 1 + website/www/node_modules/lodash/fp/pull.js | 5 + website/www/node_modules/lodash/fp/pullAll.js | 5 + .../www/node_modules/lodash/fp/pullAllBy.js | 5 + .../www/node_modules/lodash/fp/pullAllWith.js | 5 + website/www/node_modules/lodash/fp/pullAt.js | 5 + website/www/node_modules/lodash/fp/random.js | 5 + website/www/node_modules/lodash/fp/range.js | 5 + .../www/node_modules/lodash/fp/rangeRight.js | 5 + .../www/node_modules/lodash/fp/rangeStep.js | 5 + .../node_modules/lodash/fp/rangeStepRight.js | 5 + website/www/node_modules/lodash/fp/rearg.js | 5 + website/www/node_modules/lodash/fp/reduce.js | 5 + .../www/node_modules/lodash/fp/reduceRight.js | 5 + website/www/node_modules/lodash/fp/reject.js | 5 + website/www/node_modules/lodash/fp/remove.js | 5 + website/www/node_modules/lodash/fp/repeat.js | 5 + website/www/node_modules/lodash/fp/replace.js | 5 + website/www/node_modules/lodash/fp/rest.js | 5 + .../www/node_modules/lodash/fp/restFrom.js | 5 + website/www/node_modules/lodash/fp/result.js | 5 + website/www/node_modules/lodash/fp/reverse.js | 5 + website/www/node_modules/lodash/fp/round.js | 5 + website/www/node_modules/lodash/fp/sample.js | 5 + .../www/node_modules/lodash/fp/sampleSize.js | 5 + website/www/node_modules/lodash/fp/seq.js | 2 + website/www/node_modules/lodash/fp/set.js | 5 + website/www/node_modules/lodash/fp/setWith.js | 5 + website/www/node_modules/lodash/fp/shuffle.js | 5 + website/www/node_modules/lodash/fp/size.js | 5 + website/www/node_modules/lodash/fp/slice.js | 5 + .../www/node_modules/lodash/fp/snakeCase.js | 5 + website/www/node_modules/lodash/fp/some.js | 5 + website/www/node_modules/lodash/fp/sortBy.js | 5 + .../www/node_modules/lodash/fp/sortedIndex.js | 5 + .../node_modules/lodash/fp/sortedIndexBy.js | 5 + .../node_modules/lodash/fp/sortedIndexOf.js | 5 + .../node_modules/lodash/fp/sortedLastIndex.js | 5 + .../lodash/fp/sortedLastIndexBy.js | 5 + .../lodash/fp/sortedLastIndexOf.js | 5 + .../www/node_modules/lodash/fp/sortedUniq.js | 5 + .../node_modules/lodash/fp/sortedUniqBy.js | 5 + website/www/node_modules/lodash/fp/split.js | 5 + website/www/node_modules/lodash/fp/spread.js | 5 + .../www/node_modules/lodash/fp/spreadFrom.js | 5 + .../www/node_modules/lodash/fp/startCase.js | 5 + .../www/node_modules/lodash/fp/startsWith.js | 5 + website/www/node_modules/lodash/fp/string.js | 2 + .../www/node_modules/lodash/fp/stubArray.js | 5 + .../www/node_modules/lodash/fp/stubFalse.js | 5 + .../www/node_modules/lodash/fp/stubObject.js | 5 + .../www/node_modules/lodash/fp/stubString.js | 5 + .../www/node_modules/lodash/fp/stubTrue.js | 5 + .../www/node_modules/lodash/fp/subtract.js | 5 + website/www/node_modules/lodash/fp/sum.js | 5 + website/www/node_modules/lodash/fp/sumBy.js | 5 + .../lodash/fp/symmetricDifference.js | 1 + .../lodash/fp/symmetricDifferenceBy.js | 1 + .../lodash/fp/symmetricDifferenceWith.js | 1 + website/www/node_modules/lodash/fp/tail.js | 5 + website/www/node_modules/lodash/fp/take.js | 5 + .../www/node_modules/lodash/fp/takeLast.js | 1 + .../node_modules/lodash/fp/takeLastWhile.js | 1 + .../www/node_modules/lodash/fp/takeRight.js | 5 + .../node_modules/lodash/fp/takeRightWhile.js | 5 + .../www/node_modules/lodash/fp/takeWhile.js | 5 + website/www/node_modules/lodash/fp/tap.js | 5 + .../www/node_modules/lodash/fp/template.js | 5 + .../lodash/fp/templateSettings.js | 5 + .../www/node_modules/lodash/fp/throttle.js | 5 + website/www/node_modules/lodash/fp/thru.js | 5 + website/www/node_modules/lodash/fp/times.js | 5 + website/www/node_modules/lodash/fp/toArray.js | 5 + .../www/node_modules/lodash/fp/toFinite.js | 5 + .../www/node_modules/lodash/fp/toInteger.js | 5 + .../www/node_modules/lodash/fp/toIterator.js | 5 + website/www/node_modules/lodash/fp/toJSON.js | 5 + .../www/node_modules/lodash/fp/toLength.js | 5 + website/www/node_modules/lodash/fp/toLower.js | 5 + .../www/node_modules/lodash/fp/toNumber.js | 5 + website/www/node_modules/lodash/fp/toPairs.js | 5 + .../www/node_modules/lodash/fp/toPairsIn.js | 5 + website/www/node_modules/lodash/fp/toPath.js | 5 + .../node_modules/lodash/fp/toPlainObject.js | 5 + .../node_modules/lodash/fp/toSafeInteger.js | 5 + .../www/node_modules/lodash/fp/toString.js | 5 + website/www/node_modules/lodash/fp/toUpper.js | 5 + .../www/node_modules/lodash/fp/transform.js | 5 + website/www/node_modules/lodash/fp/trim.js | 5 + .../www/node_modules/lodash/fp/trimChars.js | 5 + .../node_modules/lodash/fp/trimCharsEnd.js | 5 + .../node_modules/lodash/fp/trimCharsStart.js | 5 + website/www/node_modules/lodash/fp/trimEnd.js | 5 + .../www/node_modules/lodash/fp/trimStart.js | 5 + .../www/node_modules/lodash/fp/truncate.js | 5 + website/www/node_modules/lodash/fp/unapply.js | 1 + website/www/node_modules/lodash/fp/unary.js | 5 + .../www/node_modules/lodash/fp/unescape.js | 5 + website/www/node_modules/lodash/fp/union.js | 5 + website/www/node_modules/lodash/fp/unionBy.js | 5 + .../www/node_modules/lodash/fp/unionWith.js | 5 + website/www/node_modules/lodash/fp/uniq.js | 5 + website/www/node_modules/lodash/fp/uniqBy.js | 5 + .../www/node_modules/lodash/fp/uniqWith.js | 5 + .../www/node_modules/lodash/fp/uniqueId.js | 5 + website/www/node_modules/lodash/fp/unnest.js | 1 + website/www/node_modules/lodash/fp/unset.js | 5 + website/www/node_modules/lodash/fp/unzip.js | 5 + .../www/node_modules/lodash/fp/unzipWith.js | 5 + website/www/node_modules/lodash/fp/update.js | 5 + .../www/node_modules/lodash/fp/updateWith.js | 5 + .../www/node_modules/lodash/fp/upperCase.js | 5 + .../www/node_modules/lodash/fp/upperFirst.js | 5 + website/www/node_modules/lodash/fp/useWith.js | 1 + website/www/node_modules/lodash/fp/util.js | 2 + website/www/node_modules/lodash/fp/value.js | 5 + website/www/node_modules/lodash/fp/valueOf.js | 5 + website/www/node_modules/lodash/fp/values.js | 5 + .../www/node_modules/lodash/fp/valuesIn.js | 5 + website/www/node_modules/lodash/fp/where.js | 1 + website/www/node_modules/lodash/fp/whereEq.js | 1 + website/www/node_modules/lodash/fp/without.js | 5 + website/www/node_modules/lodash/fp/words.js | 5 + website/www/node_modules/lodash/fp/wrap.js | 5 + .../www/node_modules/lodash/fp/wrapperAt.js | 5 + .../node_modules/lodash/fp/wrapperChain.js | 5 + .../node_modules/lodash/fp/wrapperLodash.js | 5 + .../node_modules/lodash/fp/wrapperReverse.js | 5 + .../node_modules/lodash/fp/wrapperValue.js | 5 + website/www/node_modules/lodash/fp/xor.js | 5 + website/www/node_modules/lodash/fp/xorBy.js | 5 + website/www/node_modules/lodash/fp/xorWith.js | 5 + website/www/node_modules/lodash/fp/zip.js | 5 + website/www/node_modules/lodash/fp/zipAll.js | 5 + website/www/node_modules/lodash/fp/zipObj.js | 1 + .../www/node_modules/lodash/fp/zipObject.js | 5 + .../node_modules/lodash/fp/zipObjectDeep.js | 5 + website/www/node_modules/lodash/fp/zipWith.js | 5 + website/www/node_modules/lodash/fromPairs.js | 28 + website/www/node_modules/lodash/function.js | 25 + website/www/node_modules/lodash/functions.js | 31 + .../www/node_modules/lodash/functionsIn.js | 31 + website/www/node_modules/lodash/get.js | 33 + website/www/node_modules/lodash/groupBy.js | 41 + website/www/node_modules/lodash/gt.js | 29 + website/www/node_modules/lodash/gte.js | 30 + website/www/node_modules/lodash/has.js | 35 + website/www/node_modules/lodash/hasIn.js | 34 + website/www/node_modules/lodash/head.js | 23 + website/www/node_modules/lodash/identity.js | 21 + website/www/node_modules/lodash/inRange.js | 55 + website/www/node_modules/lodash/includes.js | 53 + website/www/node_modules/lodash/index.js | 1 + website/www/node_modules/lodash/indexOf.js | 42 + website/www/node_modules/lodash/initial.js | 22 + .../www/node_modules/lodash/intersection.js | 30 + .../www/node_modules/lodash/intersectionBy.js | 45 + .../node_modules/lodash/intersectionWith.js | 41 + website/www/node_modules/lodash/invert.js | 42 + website/www/node_modules/lodash/invertBy.js | 56 + website/www/node_modules/lodash/invoke.js | 24 + website/www/node_modules/lodash/invokeMap.js | 41 + .../www/node_modules/lodash/isArguments.js | 36 + website/www/node_modules/lodash/isArray.js | 26 + .../www/node_modules/lodash/isArrayBuffer.js | 27 + .../www/node_modules/lodash/isArrayLike.js | 33 + .../node_modules/lodash/isArrayLikeObject.js | 33 + website/www/node_modules/lodash/isBoolean.js | 29 + website/www/node_modules/lodash/isBuffer.js | 38 + website/www/node_modules/lodash/isDate.js | 27 + website/www/node_modules/lodash/isElement.js | 25 + website/www/node_modules/lodash/isEmpty.js | 77 + website/www/node_modules/lodash/isEqual.js | 35 + .../www/node_modules/lodash/isEqualWith.js | 41 + website/www/node_modules/lodash/isError.js | 36 + website/www/node_modules/lodash/isFinite.js | 36 + website/www/node_modules/lodash/isFunction.js | 37 + website/www/node_modules/lodash/isInteger.js | 33 + website/www/node_modules/lodash/isLength.js | 35 + website/www/node_modules/lodash/isMap.js | 27 + website/www/node_modules/lodash/isMatch.js | 36 + .../www/node_modules/lodash/isMatchWith.js | 41 + website/www/node_modules/lodash/isNaN.js | 38 + website/www/node_modules/lodash/isNative.js | 40 + website/www/node_modules/lodash/isNil.js | 25 + website/www/node_modules/lodash/isNull.js | 22 + website/www/node_modules/lodash/isNumber.js | 38 + website/www/node_modules/lodash/isObject.js | 31 + .../www/node_modules/lodash/isObjectLike.js | 29 + .../www/node_modules/lodash/isPlainObject.js | 62 + website/www/node_modules/lodash/isRegExp.js | 27 + .../www/node_modules/lodash/isSafeInteger.js | 37 + website/www/node_modules/lodash/isSet.js | 27 + website/www/node_modules/lodash/isString.js | 30 + website/www/node_modules/lodash/isSymbol.js | 29 + .../www/node_modules/lodash/isTypedArray.js | 27 + .../www/node_modules/lodash/isUndefined.js | 22 + website/www/node_modules/lodash/isWeakMap.js | 28 + website/www/node_modules/lodash/isWeakSet.js | 28 + website/www/node_modules/lodash/iteratee.js | 53 + website/www/node_modules/lodash/join.js | 26 + website/www/node_modules/lodash/kebabCase.js | 28 + website/www/node_modules/lodash/keyBy.js | 36 + website/www/node_modules/lodash/keys.js | 37 + website/www/node_modules/lodash/keysIn.js | 32 + website/www/node_modules/lodash/lang.js | 58 + website/www/node_modules/lodash/last.js | 20 + .../www/node_modules/lodash/lastIndexOf.js | 46 + website/www/node_modules/lodash/lodash.js | 17112 ++++++++++++ website/www/node_modules/lodash/lodash.min.js | 137 + website/www/node_modules/lodash/lowerCase.js | 27 + website/www/node_modules/lodash/lowerFirst.js | 22 + website/www/node_modules/lodash/lt.js | 29 + website/www/node_modules/lodash/lte.js | 30 + website/www/node_modules/lodash/map.js | 53 + website/www/node_modules/lodash/mapKeys.js | 36 + website/www/node_modules/lodash/mapValues.js | 43 + website/www/node_modules/lodash/matches.js | 39 + .../node_modules/lodash/matchesProperty.js | 37 + website/www/node_modules/lodash/math.js | 17 + website/www/node_modules/lodash/max.js | 29 + website/www/node_modules/lodash/maxBy.js | 34 + website/www/node_modules/lodash/mean.js | 22 + website/www/node_modules/lodash/meanBy.js | 31 + website/www/node_modules/lodash/memoize.js | 73 + website/www/node_modules/lodash/merge.js | 39 + website/www/node_modules/lodash/mergeWith.js | 39 + website/www/node_modules/lodash/method.js | 34 + website/www/node_modules/lodash/methodOf.js | 33 + website/www/node_modules/lodash/min.js | 29 + website/www/node_modules/lodash/minBy.js | 34 + website/www/node_modules/lodash/mixin.js | 74 + website/www/node_modules/lodash/multiply.js | 22 + website/www/node_modules/lodash/negate.js | 40 + website/www/node_modules/lodash/next.js | 35 + website/www/node_modules/lodash/noop.js | 17 + website/www/node_modules/lodash/now.js | 23 + website/www/node_modules/lodash/nth.js | 29 + website/www/node_modules/lodash/nthArg.js | 32 + website/www/node_modules/lodash/number.js | 5 + website/www/node_modules/lodash/object.js | 49 + website/www/node_modules/lodash/omit.js | 57 + website/www/node_modules/lodash/omitBy.js | 29 + website/www/node_modules/lodash/once.js | 25 + website/www/node_modules/lodash/orderBy.js | 47 + website/www/node_modules/lodash/over.js | 24 + website/www/node_modules/lodash/overArgs.js | 61 + website/www/node_modules/lodash/overEvery.js | 30 + website/www/node_modules/lodash/overSome.js | 30 + website/www/node_modules/lodash/package.json | 17 + website/www/node_modules/lodash/pad.js | 49 + website/www/node_modules/lodash/padEnd.js | 39 + website/www/node_modules/lodash/padStart.js | 39 + website/www/node_modules/lodash/parseInt.js | 43 + website/www/node_modules/lodash/partial.js | 50 + .../www/node_modules/lodash/partialRight.js | 49 + website/www/node_modules/lodash/partition.js | 43 + website/www/node_modules/lodash/pick.js | 25 + website/www/node_modules/lodash/pickBy.js | 37 + website/www/node_modules/lodash/plant.js | 48 + website/www/node_modules/lodash/property.js | 32 + website/www/node_modules/lodash/propertyOf.js | 30 + website/www/node_modules/lodash/pull.js | 29 + website/www/node_modules/lodash/pullAll.js | 29 + website/www/node_modules/lodash/pullAllBy.js | 33 + .../www/node_modules/lodash/pullAllWith.js | 32 + website/www/node_modules/lodash/pullAt.js | 43 + website/www/node_modules/lodash/random.js | 82 + website/www/node_modules/lodash/range.js | 46 + website/www/node_modules/lodash/rangeRight.js | 41 + website/www/node_modules/lodash/rearg.js | 33 + website/www/node_modules/lodash/reduce.js | 51 + .../www/node_modules/lodash/reduceRight.js | 36 + website/www/node_modules/lodash/reject.js | 46 + website/www/node_modules/lodash/remove.js | 53 + website/www/node_modules/lodash/repeat.js | 37 + website/www/node_modules/lodash/replace.js | 29 + website/www/node_modules/lodash/rest.js | 40 + website/www/node_modules/lodash/result.js | 56 + website/www/node_modules/lodash/reverse.js | 34 + website/www/node_modules/lodash/round.js | 26 + website/www/node_modules/lodash/sample.js | 24 + website/www/node_modules/lodash/sampleSize.js | 37 + website/www/node_modules/lodash/seq.js | 16 + website/www/node_modules/lodash/set.js | 35 + website/www/node_modules/lodash/setWith.js | 32 + website/www/node_modules/lodash/shuffle.js | 25 + website/www/node_modules/lodash/size.js | 46 + website/www/node_modules/lodash/slice.js | 37 + website/www/node_modules/lodash/snakeCase.js | 28 + website/www/node_modules/lodash/some.js | 51 + website/www/node_modules/lodash/sortBy.js | 48 + .../www/node_modules/lodash/sortedIndex.js | 24 + .../www/node_modules/lodash/sortedIndexBy.js | 33 + .../www/node_modules/lodash/sortedIndexOf.js | 31 + .../node_modules/lodash/sortedLastIndex.js | 25 + .../node_modules/lodash/sortedLastIndexBy.js | 33 + .../node_modules/lodash/sortedLastIndexOf.js | 31 + website/www/node_modules/lodash/sortedUniq.js | 24 + .../www/node_modules/lodash/sortedUniqBy.js | 26 + website/www/node_modules/lodash/split.js | 52 + website/www/node_modules/lodash/spread.js | 63 + website/www/node_modules/lodash/startCase.js | 29 + website/www/node_modules/lodash/startsWith.js | 39 + website/www/node_modules/lodash/string.js | 33 + website/www/node_modules/lodash/stubArray.js | 23 + website/www/node_modules/lodash/stubFalse.js | 18 + website/www/node_modules/lodash/stubObject.js | 23 + website/www/node_modules/lodash/stubString.js | 18 + website/www/node_modules/lodash/stubTrue.js | 18 + website/www/node_modules/lodash/subtract.js | 22 + website/www/node_modules/lodash/sum.js | 24 + website/www/node_modules/lodash/sumBy.js | 33 + website/www/node_modules/lodash/tail.js | 22 + website/www/node_modules/lodash/take.js | 37 + website/www/node_modules/lodash/takeRight.js | 39 + .../www/node_modules/lodash/takeRightWhile.js | 45 + website/www/node_modules/lodash/takeWhile.js | 45 + website/www/node_modules/lodash/tap.js | 29 + website/www/node_modules/lodash/template.js | 253 + .../node_modules/lodash/templateSettings.js | 67 + website/www/node_modules/lodash/throttle.js | 69 + website/www/node_modules/lodash/thru.js | 28 + website/www/node_modules/lodash/times.js | 51 + website/www/node_modules/lodash/toArray.js | 58 + website/www/node_modules/lodash/toFinite.js | 42 + website/www/node_modules/lodash/toInteger.js | 36 + website/www/node_modules/lodash/toIterator.js | 23 + website/www/node_modules/lodash/toJSON.js | 1 + website/www/node_modules/lodash/toLength.js | 38 + website/www/node_modules/lodash/toLower.js | 28 + website/www/node_modules/lodash/toNumber.js | 66 + website/www/node_modules/lodash/toPairs.js | 30 + website/www/node_modules/lodash/toPairsIn.js | 30 + website/www/node_modules/lodash/toPath.js | 33 + .../www/node_modules/lodash/toPlainObject.js | 32 + .../www/node_modules/lodash/toSafeInteger.js | 37 + website/www/node_modules/lodash/toString.js | 28 + website/www/node_modules/lodash/toUpper.js | 28 + website/www/node_modules/lodash/transform.js | 65 + website/www/node_modules/lodash/trim.js | 49 + website/www/node_modules/lodash/trimEnd.js | 43 + website/www/node_modules/lodash/trimStart.js | 43 + website/www/node_modules/lodash/truncate.js | 111 + website/www/node_modules/lodash/unary.js | 22 + website/www/node_modules/lodash/unescape.js | 34 + website/www/node_modules/lodash/union.js | 26 + website/www/node_modules/lodash/unionBy.js | 39 + website/www/node_modules/lodash/unionWith.js | 34 + website/www/node_modules/lodash/uniq.js | 25 + website/www/node_modules/lodash/uniqBy.js | 31 + website/www/node_modules/lodash/uniqWith.js | 28 + website/www/node_modules/lodash/uniqueId.js | 28 + website/www/node_modules/lodash/unset.js | 34 + website/www/node_modules/lodash/unzip.js | 45 + website/www/node_modules/lodash/unzipWith.js | 39 + website/www/node_modules/lodash/update.js | 35 + website/www/node_modules/lodash/updateWith.js | 33 + website/www/node_modules/lodash/upperCase.js | 27 + website/www/node_modules/lodash/upperFirst.js | 22 + website/www/node_modules/lodash/util.js | 34 + website/www/node_modules/lodash/value.js | 1 + website/www/node_modules/lodash/valueOf.js | 1 + website/www/node_modules/lodash/values.js | 34 + website/www/node_modules/lodash/valuesIn.js | 32 + website/www/node_modules/lodash/without.js | 31 + website/www/node_modules/lodash/words.js | 35 + website/www/node_modules/lodash/wrap.js | 30 + website/www/node_modules/lodash/wrapperAt.js | 48 + .../www/node_modules/lodash/wrapperChain.js | 34 + .../www/node_modules/lodash/wrapperLodash.js | 147 + .../www/node_modules/lodash/wrapperReverse.js | 44 + .../www/node_modules/lodash/wrapperValue.js | 21 + website/www/node_modules/lodash/xor.js | 28 + website/www/node_modules/lodash/xorBy.js | 39 + website/www/node_modules/lodash/xorWith.js | 34 + website/www/node_modules/lodash/zip.js | 22 + website/www/node_modules/lodash/zipObject.js | 24 + .../www/node_modules/lodash/zipObjectDeep.js | 23 + website/www/node_modules/lodash/zipWith.js | 32 + .../www/node_modules/log-symbols/browser.js | 7 + website/www/node_modules/log-symbols/index.js | 20 + website/www/node_modules/log-symbols/license | 9 + .../www/node_modules/log-symbols/package.json | 50 + .../www/node_modules/log-symbols/readme.md | 45 + website/www/node_modules/merge2/LICENSE | 21 + website/www/node_modules/merge2/README.md | 142 + website/www/node_modules/merge2/index.js | 107 + website/www/node_modules/merge2/package.json | 43 + .../www/node_modules/micromatch/CHANGELOG.md | 108 + website/www/node_modules/micromatch/LICENSE | 21 + website/www/node_modules/micromatch/README.md | 1000 + website/www/node_modules/micromatch/index.js | 467 + .../www/node_modules/micromatch/package.json | 118 + .../www/node_modules/node-releases/LICENSE | 21 + .../www/node_modules/node-releases/README.md | 31 + .../node-releases/data/processed/envs.json | 1237 + .../node-releases/data/raw/iojs.json | 43 + .../node-releases/data/raw/nodejs.json | 510 + .../release-schedule/release-schedule.json | 82 + .../node_modules/node-releases/package.json | 24 + .../www/node_modules/normalize-path/LICENSE | 21 + .../www/node_modules/normalize-path/README.md | 127 + .../www/node_modules/normalize-path/index.js | 35 + .../node_modules/normalize-path/package.json | 77 + .../www/node_modules/normalize-range/index.js | 54 + .../www/node_modules/normalize-range/license | 21 + .../node_modules/normalize-range/package.json | 46 + .../node_modules/normalize-range/readme.md | 148 + .../node_modules/num2fraction/.editorconfig | 14 + .../www/node_modules/num2fraction/.npmignore | 8 + website/www/node_modules/num2fraction/LICENSE | 22 + .../www/node_modules/num2fraction/README.md | 87 + .../www/node_modules/num2fraction/index.js | 48 + .../node_modules/num2fraction/package.json | 31 + website/www/node_modules/p-limit/index.d.ts | 38 + website/www/node_modules/p-limit/index.js | 57 + website/www/node_modules/p-limit/license | 9 + website/www/node_modules/p-limit/package.json | 52 + website/www/node_modules/p-limit/readme.md | 101 + website/www/node_modules/p-locate/index.d.ts | 64 + website/www/node_modules/p-locate/index.js | 52 + website/www/node_modules/p-locate/license | 9 + .../www/node_modules/p-locate/package.json | 53 + website/www/node_modules/p-locate/readme.md | 90 + website/www/node_modules/p-try/index.d.ts | 39 + website/www/node_modules/p-try/index.js | 9 + website/www/node_modules/p-try/license | 9 + website/www/node_modules/p-try/package.json | 42 + website/www/node_modules/p-try/readme.md | 58 + website/www/node_modules/parse-json/index.js | 33 + website/www/node_modules/parse-json/license | 9 + .../www/node_modules/parse-json/package.json | 43 + website/www/node_modules/parse-json/readme.md | 83 + .../www/node_modules/path-exists/index.d.ts | 28 + website/www/node_modules/path-exists/index.js | 23 + website/www/node_modules/path-exists/license | 9 + .../www/node_modules/path-exists/package.json | 39 + .../www/node_modules/path-exists/readme.md | 52 + website/www/node_modules/path-key/index.d.ts | 40 + website/www/node_modules/path-key/index.js | 16 + website/www/node_modules/path-key/license | 9 + .../www/node_modules/path-key/package.json | 39 + website/www/node_modules/path-key/readme.md | 61 + website/www/node_modules/path-type/index.d.ts | 51 + website/www/node_modules/path-type/index.js | 43 + website/www/node_modules/path-type/license | 9 + .../www/node_modules/path-type/package.json | 45 + website/www/node_modules/path-type/readme.md | 72 + .../www/node_modules/picomatch/CHANGELOG.md | 113 + website/www/node_modules/picomatch/LICENSE | 21 + website/www/node_modules/picomatch/README.md | 691 + website/www/node_modules/picomatch/index.js | 3 + .../node_modules/picomatch/lib/constants.js | 179 + .../www/node_modules/picomatch/lib/parse.js | 1078 + .../node_modules/picomatch/lib/picomatch.js | 339 + .../www/node_modules/picomatch/lib/scan.js | 383 + .../www/node_modules/picomatch/lib/utils.js | 64 + .../www/node_modules/picomatch/package.json | 81 + website/www/node_modules/pify/index.js | 68 + website/www/node_modules/pify/license | 21 + website/www/node_modules/pify/package.json | 48 + website/www/node_modules/pify/readme.md | 119 + website/www/node_modules/pkg-up/index.js | 5 + website/www/node_modules/pkg-up/license | 21 + .../pkg-up/node_modules/find-up/index.js | 48 + .../pkg-up/node_modules/find-up/license | 21 + .../pkg-up/node_modules/find-up/package.json | 53 + .../pkg-up/node_modules/find-up/readme.md | 85 + .../pkg-up/node_modules/locate-path/index.js | 24 + .../pkg-up/node_modules/locate-path/license | 21 + .../node_modules/locate-path/package.json | 47 + .../pkg-up/node_modules/locate-path/readme.md | 99 + .../pkg-up/node_modules/p-limit/index.js | 42 + .../pkg-up/node_modules/p-limit/license | 9 + .../pkg-up/node_modules/p-limit/package.json | 49 + .../pkg-up/node_modules/p-limit/readme.md | 69 + .../pkg-up/node_modules/p-locate/index.js | 31 + .../pkg-up/node_modules/p-locate/license | 21 + .../pkg-up/node_modules/p-locate/package.json | 54 + .../pkg-up/node_modules/p-locate/readme.md | 86 + .../pkg-up/node_modules/p-try/index.js | 4 + .../pkg-up/node_modules/p-try/license | 21 + .../pkg-up/node_modules/p-try/package.json | 43 + .../pkg-up/node_modules/p-try/readme.md | 38 + .../pkg-up/node_modules/path-exists/index.js | 17 + .../pkg-up/node_modules/path-exists/license | 21 + .../node_modules/path-exists/package.json | 40 + .../pkg-up/node_modules/path-exists/readme.md | 50 + website/www/node_modules/pkg-up/package.json | 50 + website/www/node_modules/pkg-up/readme.md | 64 + .../www/node_modules/postcss-cli/CHANGELOG.md | 273 + website/www/node_modules/postcss-cli/LICENSE | 21 + .../www/node_modules/postcss-cli/README.md | 146 + website/www/node_modules/postcss-cli/index.js | 285 + .../www/node_modules/postcss-cli/lib/args.js | 144 + .../node_modules/postcss-cli/lib/depGraph.js | 22 + .../postcss-cli/lib/getMapfile.js | 8 + .../postcss-cli/node_modules/chalk/index.d.ts | 408 + .../postcss-cli/node_modules/chalk/license | 9 + .../node_modules/chalk/package.json | 68 + .../postcss-cli/node_modules/chalk/readme.md | 292 + .../node_modules/chalk/source/index.js | 222 + .../node_modules/chalk/source/templates.js | 134 + .../node_modules/chalk/source/util.js | 39 + .../node_modules/has-flag/index.d.ts | 39 + .../node_modules/has-flag/index.js | 8 + .../postcss-cli/node_modules/has-flag/license | 9 + .../node_modules/has-flag/package.json | 46 + .../node_modules/has-flag/readme.md | 89 + .../node_modules/supports-color/browser.js | 5 + .../node_modules/supports-color/index.js | 139 + .../node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../node_modules/supports-color/readme.md | 76 + .../www/node_modules/postcss-cli/package.json | 74 + .../postcss-load-config/CHANGELOG.md | 75 + .../node_modules/postcss-load-config/LICENSE | 21 + .../postcss-load-config/README.md | 485 + .../postcss-load-config/package.json | 50 + .../postcss-load-config/src/index.js | 131 + .../postcss-load-config/src/options.js | 47 + .../postcss-load-config/src/plugins.js | 80 + .../postcss-reporter/CHANGELOG.md | 74 + .../www/node_modules/postcss-reporter/LICENSE | 22 + .../node_modules/postcss-reporter/README.md | 149 + .../node_modules/postcss-reporter/index.js | 4 + .../postcss-reporter/lib/formatter.js | 82 + .../postcss-reporter/lib/reporter.js | 81 + .../node_modules/postcss-reporter/lib/util.js | 20 + .../postcss-reporter/package.json | 26 + .../node_modules/postcss-value-parser/LICENSE | 22 + .../postcss-value-parser/README.md | 263 + .../postcss-value-parser/lib/index.d.ts | 172 + .../postcss-value-parser/lib/index.js | 28 + .../postcss-value-parser/lib/parse.js | 304 + .../postcss-value-parser/lib/stringify.js | 48 + .../postcss-value-parser/lib/unit.js | 120 + .../postcss-value-parser/lib/walk.js | 22 + .../postcss-value-parser/package.json | 58 + website/www/node_modules/postcss/CHANGELOG.md | 653 + website/www/node_modules/postcss/LICENSE | 20 + website/www/node_modules/postcss/README.md | 491 + .../postcss/docs/api/assets/scripts.min.js | 8 + .../postcss/docs/api/assets/styles.min.css | 1 + .../node_modules/postcss/docs/api/index.html | 22716 ++++++++++++++++ .../node_modules/postcss/docs/architecture.md | 156 + .../postcss/docs/guidelines/plugin.md | 195 + .../postcss/docs/guidelines/runner.md | 143 + .../node_modules/postcss/docs/source-maps.md | 74 + .../www/node_modules/postcss/docs/syntax.md | 233 + .../www/node_modules/postcss/lib/at-rule.js | 129 + .../www/node_modules/postcss/lib/comment.js | 57 + .../www/node_modules/postcss/lib/container.js | 869 + .../postcss/lib/css-syntax-error.js | 300 + .../node_modules/postcss/lib/declaration.js | 98 + website/www/node_modules/postcss/lib/input.js | 216 + .../node_modules/postcss/lib/lazy-result.js | 444 + website/www/node_modules/postcss/lib/list.js | 93 + .../node_modules/postcss/lib/map-generator.js | 354 + website/www/node_modules/postcss/lib/node.js | 608 + website/www/node_modules/postcss/lib/parse.js | 40 + .../www/node_modules/postcss/lib/parser.js | 611 + .../www/node_modules/postcss/lib/postcss.d.ts | 1282 + .../www/node_modules/postcss/lib/postcss.js | 285 + .../node_modules/postcss/lib/previous-map.js | 161 + .../www/node_modules/postcss/lib/processor.js | 263 + .../www/node_modules/postcss/lib/result.js | 215 + website/www/node_modules/postcss/lib/root.js | 129 + website/www/node_modules/postcss/lib/rule.js | 118 + .../node_modules/postcss/lib/stringifier.js | 364 + .../www/node_modules/postcss/lib/stringify.js | 18 + .../postcss/lib/terminal-highlight.js | 84 + .../www/node_modules/postcss/lib/tokenize.js | 295 + .../www/node_modules/postcss/lib/vendor.js | 53 + .../www/node_modules/postcss/lib/warn-once.js | 17 + .../www/node_modules/postcss/lib/warning.js | 133 + .../node_modules/supports-color/browser.js | 5 + .../node_modules/supports-color/index.js | 138 + .../node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../node_modules/supports-color/readme.md | 85 + website/www/node_modules/postcss/package.json | 36 + .../node_modules/pretty-hrtime/.jshintignore | 1 + .../www/node_modules/pretty-hrtime/.npmignore | 10 + .../www/node_modules/pretty-hrtime/LICENSE | 20 + .../www/node_modules/pretty-hrtime/README.md | 57 + .../www/node_modules/pretty-hrtime/index.js | 80 + .../node_modules/pretty-hrtime/package.json | 25 + website/www/node_modules/read-cache/LICENSE | 20 + website/www/node_modules/read-cache/README.md | 46 + website/www/node_modules/read-cache/index.js | 78 + .../www/node_modules/read-cache/package.json | 34 + website/www/node_modules/readdirp/LICENSE | 21 + website/www/node_modules/readdirp/README.md | 120 + website/www/node_modules/readdirp/index.d.ts | 43 + website/www/node_modules/readdirp/index.js | 275 + .../www/node_modules/readdirp/package.json | 121 + .../node_modules/require-directory/.jshintrc | 67 + .../node_modules/require-directory/.npmignore | 1 + .../require-directory/.travis.yml | 3 + .../node_modules/require-directory/LICENSE | 22 + .../require-directory/README.markdown | 184 + .../node_modules/require-directory/index.js | 86 + .../require-directory/package.json | 40 + .../require-main-filename/CHANGELOG.md | 26 + .../require-main-filename/LICENSE.txt | 14 + .../require-main-filename/README.md | 26 + .../require-main-filename/index.js | 18 + .../require-main-filename/package.json | 35 + .../www/node_modules/resolve-from/index.js | 35 + website/www/node_modules/resolve-from/license | 21 + .../node_modules/resolve-from/package.json | 35 + .../www/node_modules/resolve-from/readme.md | 71 + .../www/node_modules/reusify/.coveralls.yml | 1 + website/www/node_modules/reusify/.travis.yml | 28 + website/www/node_modules/reusify/LICENSE | 22 + website/www/node_modules/reusify/README.md | 145 + .../benchmarks/createNoCodeFunction.js | 30 + .../node_modules/reusify/benchmarks/fib.js | 13 + .../reusify/benchmarks/reuseNoCodeFunction.js | 38 + website/www/node_modules/reusify/package.json | 45 + website/www/node_modules/reusify/reusify.js | 33 + website/www/node_modules/reusify/test.js | 66 + website/www/node_modules/run-parallel/LICENSE | 20 + .../www/node_modules/run-parallel/README.md | 85 + .../www/node_modules/run-parallel/index.js | 48 + .../node_modules/run-parallel/package.json | 42 + .../node_modules/set-blocking/CHANGELOG.md | 26 + .../www/node_modules/set-blocking/LICENSE.txt | 14 + .../www/node_modules/set-blocking/README.md | 31 + .../www/node_modules/set-blocking/index.js | 7 + .../node_modules/set-blocking/package.json | 42 + .../www/node_modules/shebang-command/index.js | 19 + .../www/node_modules/shebang-command/license | 9 + .../node_modules/shebang-command/package.json | 34 + .../node_modules/shebang-command/readme.md | 34 + .../www/node_modules/shebang-regex/index.d.ts | 22 + .../www/node_modules/shebang-regex/index.js | 2 + .../www/node_modules/shebang-regex/license | 9 + .../node_modules/shebang-regex/package.json | 35 + .../www/node_modules/shebang-regex/readme.md | 33 + website/www/node_modules/slash/index.d.ts | 25 + website/www/node_modules/slash/index.js | 11 + website/www/node_modules/slash/license | 9 + website/www/node_modules/slash/package.json | 35 + website/www/node_modules/slash/readme.md | 44 + .../www/node_modules/source-map/CHANGELOG.md | 301 + website/www/node_modules/source-map/LICENSE | 28 + website/www/node_modules/source-map/README.md | 742 + .../node_modules/source-map/lib/array-set.js | 121 + .../node_modules/source-map/lib/base64-vlq.js | 140 + .../www/node_modules/source-map/lib/base64.js | 67 + .../source-map/lib/binary-search.js | 111 + .../source-map/lib/mapping-list.js | 79 + .../node_modules/source-map/lib/quick-sort.js | 114 + .../source-map/lib/source-map-consumer.js | 1145 + .../source-map/lib/source-map-generator.js | 425 + .../source-map/lib/source-node.js | 413 + .../www/node_modules/source-map/lib/util.js | 488 + .../www/node_modules/source-map/package.json | 73 + .../node_modules/source-map/source-map.d.ts | 98 + .../www/node_modules/source-map/source-map.js | 8 + .../www/node_modules/sprintf-js/.npmignore | 1 + website/www/node_modules/sprintf-js/LICENSE | 24 + website/www/node_modules/sprintf-js/README.md | 88 + .../www/node_modules/sprintf-js/bower.json | 14 + .../node_modules/sprintf-js/demo/angular.html | 20 + .../www/node_modules/sprintf-js/gruntfile.js | 36 + .../www/node_modules/sprintf-js/package.json | 22 + .../sprintf-js/src/angular-sprintf.js | 18 + .../node_modules/sprintf-js/src/sprintf.js | 208 + .../www/node_modules/sprintf-js/test/test.js | 82 + .../www/node_modules/string-width/index.d.ts | 29 + .../www/node_modules/string-width/index.js | 43 + website/www/node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 56 + .../www/node_modules/string-width/readme.md | 50 + .../www/node_modules/strip-ansi/index.d.ts | 17 + website/www/node_modules/strip-ansi/index.js | 4 + website/www/node_modules/strip-ansi/license | 9 + .../www/node_modules/strip-ansi/package.json | 54 + website/www/node_modules/strip-ansi/readme.md | 46 + .../node_modules/supports-color/browser.js | 5 + .../www/node_modules/supports-color/index.js | 131 + .../www/node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../www/node_modules/supports-color/readme.md | 66 + .../www/node_modules/to-regex-range/LICENSE | 21 + .../www/node_modules/to-regex-range/README.md | 305 + .../www/node_modules/to-regex-range/index.js | 288 + .../node_modules/to-regex-range/package.json | 88 + website/www/node_modules/universalify/LICENSE | 20 + .../www/node_modules/universalify/README.md | 76 + .../www/node_modules/universalify/index.js | 23 + .../node_modules/universalify/package.json | 34 + .../node_modules/which-module/CHANGELOG.md | 26 + website/www/node_modules/which-module/LICENSE | 13 + .../www/node_modules/which-module/README.md | 55 + .../www/node_modules/which-module/index.js | 9 + .../node_modules/which-module/package.json | 41 + website/www/node_modules/which/CHANGELOG.md | 166 + website/www/node_modules/which/LICENSE | 15 + website/www/node_modules/which/README.md | 54 + website/www/node_modules/which/package.json | 43 + website/www/node_modules/which/which.js | 125 + website/www/node_modules/wrap-ansi/index.js | 186 + website/www/node_modules/wrap-ansi/license | 9 + .../www/node_modules/wrap-ansi/package.json | 61 + website/www/node_modules/wrap-ansi/readme.md | 97 + website/www/node_modules/y18n/CHANGELOG.md | 21 + website/www/node_modules/y18n/LICENSE | 13 + website/www/node_modules/y18n/README.md | 109 + website/www/node_modules/y18n/index.js | 188 + website/www/node_modules/y18n/package.json | 39 + .../node_modules/yargs-parser/CHANGELOG.md | 601 + .../www/node_modules/yargs-parser/LICENSE.txt | 14 + .../www/node_modules/yargs-parser/README.md | 449 + .../www/node_modules/yargs-parser/index.js | 1032 + .../yargs-parser/lib/tokenize-arg-string.js | 40 + .../node_modules/yargs-parser/package.json | 46 + website/www/node_modules/yargs/CHANGELOG.md | 399 + website/www/node_modules/yargs/LICENSE | 22 + website/www/node_modules/yargs/README.md | 140 + website/www/node_modules/yargs/index.js | 40 + .../node_modules/yargs/lib/apply-extends.js | 67 + website/www/node_modules/yargs/lib/argsert.js | 68 + website/www/node_modules/yargs/lib/command.js | 462 + .../yargs/lib/completion-templates.js | 49 + .../www/node_modules/yargs/lib/completion.js | 132 + .../www/node_modules/yargs/lib/is-promise.js | 3 + .../www/node_modules/yargs/lib/levenshtein.js | 58 + .../www/node_modules/yargs/lib/middleware.js | 64 + .../www/node_modules/yargs/lib/obj-filter.js | 11 + .../node_modules/yargs/lib/process-argv.js | 34 + website/www/node_modules/yargs/lib/usage.js | 571 + .../www/node_modules/yargs/lib/validation.js | 394 + website/www/node_modules/yargs/lib/yerror.js | 11 + .../www/node_modules/yargs/locales/be.json | 46 + .../www/node_modules/yargs/locales/de.json | 46 + .../www/node_modules/yargs/locales/en.json | 51 + .../www/node_modules/yargs/locales/es.json | 46 + .../www/node_modules/yargs/locales/fi.json | 49 + .../www/node_modules/yargs/locales/fr.json | 53 + .../www/node_modules/yargs/locales/hi.json | 49 + .../www/node_modules/yargs/locales/hu.json | 46 + .../www/node_modules/yargs/locales/id.json | 50 + .../www/node_modules/yargs/locales/it.json | 46 + .../www/node_modules/yargs/locales/ja.json | 49 + .../www/node_modules/yargs/locales/ko.json | 49 + .../www/node_modules/yargs/locales/nb.json | 44 + .../www/node_modules/yargs/locales/nl.json | 49 + .../www/node_modules/yargs/locales/nn.json | 44 + .../node_modules/yargs/locales/pirate.json | 13 + .../www/node_modules/yargs/locales/pl.json | 49 + .../www/node_modules/yargs/locales/pt.json | 45 + .../www/node_modules/yargs/locales/pt_BR.json | 48 + .../www/node_modules/yargs/locales/ru.json | 46 + .../www/node_modules/yargs/locales/th.json | 46 + .../www/node_modules/yargs/locales/tr.json | 48 + .../www/node_modules/yargs/locales/zh_CN.json | 48 + .../www/node_modules/yargs/locales/zh_TW.json | 47 + website/www/node_modules/yargs/package.json | 78 + website/www/node_modules/yargs/yargs.js | 1303 + website/www/package.json | 2 +- .../{calendar-icon.svg => close-icon.svg} | 5 +- .../icons/{youtube-icon.svg => edit-icon.svg} | 5 +- .../www/site/assets/icons/extensive-icon.svg | 26 - website/www/site/assets/icons/github-icon.svg | 29 - .../site/assets/icons/open-source-icon.svg | 31 - .../www/site/assets/icons/portable-icon.svg | 27 - website/www/site/assets/icons/search-icon.svg | 22 + .../www/site/assets/icons/twitter-icon.svg | 30 - .../www/site/assets/icons/unified-icon.svg | 26 - website/www/site/assets/scss/_blog.scss | 212 + website/www/site/assets/scss/_calendar.scss | 72 +- website/www/site/assets/scss/_cards.sass | 69 - website/www/site/assets/scss/_ctas.sass | 59 +- website/www/site/assets/scss/_footer.sass | 50 +- website/www/site/assets/scss/_global.sass | 39 +- website/www/site/assets/scss/_graphic.sass | 2 + ...{_table-wrapper.sass => _hero-mobile.scss} | 51 +- website/www/site/assets/scss/_hero.sass | 156 - website/www/site/assets/scss/_hero.scss | 132 + .../www/site/assets/scss/_keen-slider.scss | 40 + website/www/site/assets/scss/_layout.scss | 280 +- website/www/site/assets/scss/_lists.scss | 229 + .../www/site/assets/scss/_navbar-desktop.scss | 186 + .../{_navbar.sass => _navbar-mobile.sass} | 43 +- website/www/site/assets/scss/_page-nav.sass | 51 +- website/www/site/assets/scss/_quotes.scss | 151 + website/www/site/assets/scss/_search.scss | 71 + .../www/site/assets/scss/_section-nav.sass | 31 +- .../assets/scss/_syntax-highlighting.scss | 262 +- .../www/site/assets/scss/_table-wrapper.scss | 106 + website/www/site/assets/scss/_traits.scss | 48 + website/www/site/assets/scss/_typography.scss | 106 +- website/www/site/assets/scss/_vars.sass | 4 + .../site/assets/scss/bootstrap/_navbar.scss | 34 +- website/www/site/assets/scss/main.scss | 18 +- ...beam_examples_complete_game_GameStats.java | 354 + ...xamples_complete_game_HourlyTeamScore.java | 179 + ...am_examples_complete_game_LeaderBoard.java | 313 + ...beam_examples_complete_game_UserScore.java | 260 + ...pache_beam_examples_snippets_Snippets.java | 1410 + ...io_gcp_bigquery_BigQueryReadFromQuery.java | 53 + ...io_gcp_bigquery_BigQueryReadFromTable.java | 51 + ...ryReadFromTableWithBigQueryStorageAPI.java | 70 + ..._io_gcp_bigquery_BigQuerySchemaCreate.java | 70 + ...o_gcp_bigquery_BigQueryTableRowCreate.java | 80 + ..._io_gcp_bigquery_BigQueryWriteToTable.java | 65 + ...e_beam_examples_snippets_SnippetsTest.java | 263 + ..._beam_examples_complete_game_game_stats.py | 413 + ...xamples_complete_game_hourly_team_score.py | 324 + ...eam_examples_complete_game_leader_board.py | 378 + ..._beam_examples_complete_game_user_score.py | 176 + ..._apache_beam_examples_snippets_snippets.py | 1852 ++ ...he_beam_examples_snippets_snippets_test.py | 1358 + ...eam_examples_snippets_snippets_test_py3.py | 114 + ...ets_transforms_aggregation_cogroupbykey.py | 51 + ...ransforms_aggregation_cogroupbykey_test.py | 62 + ..._transforms_aggregation_combineglobally.py | 230 + ...sforms_aggregation_combineglobally_test.py | 119 + ...ts_transforms_aggregation_combineperkey.py | 263 + ...ansforms_aggregation_combineperkey_test.py | 101 + ...ts_transforms_aggregation_combinevalues.py | 249 + ...ansforms_aggregation_combinevalues_test.py | 99 + ...s_snippets_transforms_aggregation_count.py | 80 + ...ppets_transforms_aggregation_count_test.py | 77 + ...nippets_transforms_aggregation_distinct.py | 44 + ...ts_transforms_aggregation_distinct_test.py | 52 + ...ets_transforms_aggregation_groupby_test.py | 239 + ...ppets_transforms_aggregation_groupbykey.py | 48 + ..._transforms_aggregation_groupbykey_test.py | 56 + ...transforms_aggregation_groupintobatches.py | 46 + ...forms_aggregation_groupintobatches_test.py | 56 + ..._snippets_transforms_aggregation_latest.py | 116 + ...pets_transforms_aggregation_latest_test.py | 63 + ...les_snippets_transforms_aggregation_max.py | 60 + ...nippets_transforms_aggregation_max_test.py | 62 + ...es_snippets_transforms_aggregation_mean.py | 59 + ...ippets_transforms_aggregation_mean_test.py | 62 + ...les_snippets_transforms_aggregation_min.py | 58 + ...nippets_transforms_aggregation_min_test.py | 60 + ..._snippets_transforms_aggregation_sample.py | 69 + ...pets_transforms_aggregation_sample_test.py | 65 + ...les_snippets_transforms_aggregation_sum.py | 57 + ...nippets_transforms_aggregation_sum_test.py | 60 + ...les_snippets_transforms_aggregation_top.py | 149 + ...nippets_transforms_aggregation_top_test.py | 112 + ..._snippets_transforms_elementwise_filter.py | 241 + ...pets_transforms_elementwise_filter_test.py | 77 + ...snippets_transforms_elementwise_flatmap.py | 262 + ...ets_transforms_elementwise_flatmap_test.py | 88 + ...es_snippets_transforms_elementwise_keys.py | 43 + ...ippets_transforms_elementwise_keys_test.py | 54 + ..._snippets_transforms_elementwise_kvswap.py | 43 + ...pets_transforms_elementwise_kvswap_test.py | 54 + ...les_snippets_transforms_elementwise_map.py | 232 + ...nippets_transforms_elementwise_map_test.py | 86 + ...s_snippets_transforms_elementwise_pardo.py | 132 + ...ppets_transforms_elementwise_pardo_test.py | 127 + ...ippets_transforms_elementwise_partition.py | 127 + ...s_transforms_elementwise_partition_test.py | 99 + ...s_snippets_transforms_elementwise_regex.py | 229 + ...ppets_transforms_elementwise_regex_test.py | 157 + ...nippets_transforms_elementwise_tostring.py | 85 + ...ts_transforms_elementwise_tostring_test.py | 82 + ..._snippets_transforms_elementwise_values.py | 43 + ...pets_transforms_elementwise_values_test.py | 54 + ...s_transforms_elementwise_withtimestamps.py | 130 + ...nsforms_elementwise_withtimestamps_test.py | 97 + website/www/site/config.toml | 2 +- .../www/site/content/en/blog/beam-2.13.0.md | 2 +- .../www/site/content/en/blog/beam-2.21.0.md | 2 +- .../www/site/content/en/blog/beam-2.22.0.md | 2 +- .../www/site/content/en/blog/beam-2.23.0.md | 4 +- .../www/site/content/en/blog/beam-2.24.0.md | 4 +- .../www/site/content/en/blog/beam-2.25.0.md | 4 +- .../www/site/content/en/blog/beam-2.26.0.md | 65 + .../blog/dataframe-api-preview-available.md | 178 + .../content/en/blog/pattern-match-beam-sql.md | 2 +- .../en/blog/splittable-do-fn-is-available.md | 91 + .../site/content/en/community/join-beam.md | 44 + .../site/content/en/community/powered-by.md | 2 + .../www/site/content/en/contribute/_index.md | 18 +- .../content/en/contribute/release-guide.md | 7 +- .../documentation/dsls/dataframes/overview.md | 131 + .../sql/extensions/create-external-table.md | 147 +- .../io/built-in/google-bigquery.md | 4 +- .../en/documentation/io/built-in/snowflake.md | 6 +- .../en/documentation/io/developing-io-java.md | 3 + .../io/developing-io-overview.md | 80 +- .../documentation/io/developing-io-python.md | 3 + .../en/documentation/programming-guide.md | 6 +- .../en/documentation/runners/direct.md | 112 +- .../content/en/documentation/runners/flink.md | 42 +- .../content/en/documentation/runners/samza.md | 5 + .../en/documentation/runtime/environments.md | 305 +- .../documentation/sdks/python-dependencies.md | 12 +- .../content/en/get-started/beam-overview.md | 5 +- .../site/content/en/get-started/downloads.md | 20 +- .../site/content/en/get-started/from-spark.md | 268 + .../content/en/get-started/quickstart-py.md | 4 +- .../en/get-started/wordcount-example.md | 2 +- website/www/site/data/authors.yml | 38 +- website/www/site/data/capability_matrix.yaml | 714 +- .../site/data/capability_matrix_snapshot.yaml | 195 + website/www/site/data/en/calendar_events.yaml | 27 - .../logos/en.yaml => data/en/join_beam.yaml} | 13 +- website/www/site/data/en/pillars.yaml | 10 +- website/www/site/data/en/pillars_social.yaml | 21 - website/www/site/i18n/home/calendar/en.yaml | 44 - website/www/site/i18n/home/en.yaml | 4 + website/www/site/i18n/home/pillars/en.yaml | 16 - website/www/site/layouts/_default/baseof.html | 1 - website/www/site/layouts/blog/single.html | 1 + website/www/site/layouts/index.html | 101 +- .../partials/calendar/calendar-events.html | 33 - website/www/site/layouts/partials/head.html | 26 +- website/www/site/layouts/partials/header.html | 174 +- .../partials/pillars/pillars-item.html | 23 - .../partials/pillars/pillars-social.html | 19 - .../partials/section-menu/en/community.html | 1 + .../partials/section-menu/en/get-started.html | 7 +- .../partials/section-menu/en/sdks.html | 17 +- .../community/join_beam_columns.html | 41 + ...s_60afefe949d523e83b9759c49b47fc3a.content | 8782 ++++++ ...scss_60afefe949d523e83b9759c49b47fc3a.json | 1 + website/www/site/static/.htaccess | 2 +- .../site/static/images/arrow-expandable.svg | 22 + .../static/images/beam_logo_navbar_mobile.png | Bin 0 -> 1517 bytes website/www/site/static/images/elipse.svg | 22 + website/www/site/static/js/page-nav.js | 52 +- website/www/site/static/js/section-nav.js | 11 +- 3485 files changed, 217783 insertions(+), 5948 deletions(-) create mode 100644 sdks/go/pkg/beam/core/graph/coder/row_decoder.go create mode 100644 sdks/go/pkg/beam/core/graph/coder/row_encoder.go create mode 100644 sdks/go/pkg/beam/core/graph/coder/testutil/testutil.go create mode 100644 sdks/go/pkg/beam/core/graph/coder/testutil/testutil_test.go create mode 100644 sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics.go create mode 100644 sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics_test.go rename sdks/go/test/integration/{ => driver}/driver.go (100%) create mode 100644 sdks/go/test/integration/integration.go create mode 100644 sdks/go/test/integration/synthetic/synthetic_test.go create mode 100644 sdks/go/test/integration/xlang/xlang_test.go create mode 100644 sdks/go/test/load/cogbk/cogbk.go create mode 100644 sdks/go/test/load/combine/combine.go create mode 100644 sdks/go/test/load/group_by_key/group_by_key.go create mode 100644 sdks/go/test/load/sideinput/sideinput.go create mode 100755 sdks/go/test/run_validatesrunner_tests.sh create mode 100644 sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/RowMessages.java create mode 100644 sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java create mode 100644 sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflector.java create mode 100644 sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilter.java create mode 100644 sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTable.java create mode 100644 sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableProvider.java rename sdks/java/{io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableStatusFunction.java => extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/package-info.java} (72%) create mode 100644 sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaThriftTable.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflectorTest.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableClientWrapper.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilterTest.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableCreationFailuresTest.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableFlatTest.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableIT.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableTestUtils.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableWithRowsTest.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableThriftTest.java delete mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderProtoIT.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/ItThriftMessage.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/SimpleThriftMessage.java create mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/TestThriftMessage.java delete mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubAvroIT.java delete mode 100644 sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubJsonIT.java create mode 100644 sdks/java/extensions/sql/src/test/thrift/kafka/messages.thrift create mode 100644 sdks/java/extensions/sql/udf/build.gradle create mode 100644 sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/AggregateFn.java create mode 100644 sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/ScalarFn.java rename sdks/java/extensions/sql/{src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderAvroIT.java => udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/UdfProvider.java} (53%) create mode 100644 sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/package-info.java create mode 100644 sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ZetaSqlScalarFunctionImpl.java create mode 100644 sdks/java/extensions/zetasketch/src/main/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinct.java create mode 100644 sdks/java/extensions/zetasketch/src/test/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinctTest.java create mode 100644 sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/DecodingFnDataReceiver.java create mode 100644 sdks/java/harness/src/main/java/org/apache/beam/fn/harness/ToStringFnRunner.java create mode 100644 sdks/java/harness/src/test/java/org/apache/beam/fn/harness/ToStringFnRunnerTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtils.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProviderTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtilsTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProviderTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProviderTest.java create mode 100644 sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProviderTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutation.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRow.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlat.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFn.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java rename sdks/java/{extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderJsonIT.java => io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/RowUtils.java} (54%) create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIO.java rename sdks/java/{extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderCSVIT.java => io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/JsonArrayCoder.java} (52%) create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParser.java rename sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/{OffsetFinalizer.java => InitialOffsetReader.java} (77%) create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReaderImpl.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/LimitingTopicBacklogReader.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteProgress.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTracker.java delete mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMark.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdf.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/Publishers.java delete mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReader.java delete mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedSource.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSubscriberFactory.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscribeTransform.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartition.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionCoder.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessor.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorFactory.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImpl.java delete mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TranslatingPullSubscriber.java create mode 100644 sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/testing/BigtableUtils.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutationTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlatTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableTestUtils.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParserTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOReadIT.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOSearchIT.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParserTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTrackerTest.java delete mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMarkTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdfTest.java delete mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReaderTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImplTest.java create mode 100644 sdks/java/io/google-cloud-platform/src/test/resources/DICOM/testDicomFile.dcm delete mode 100644 sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/GenericRecordReadConverter.java delete mode 100644 sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/GenericRecordToRowTest.java create mode 100644 sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftSchema.java create mode 100644 sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftEnum.java create mode 100644 sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftInnerStruct.java create mode 100644 sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftUnion.java create mode 100644 sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftSchemaTest.java create mode 100644 sdks/python/apache_beam/runners/portability/job_server_test.py create mode 100644 sdks/python/apache_beam/typehints/sharded_key_type.py create mode 100644 sdks/python/apache_beam/typehints/sharded_key_type_test.py delete mode 100644 website/.gitignore create mode 100755 website/www/node_modules/.bin/autoprefixer create mode 100755 website/www/node_modules/.bin/browserslist create mode 100755 website/www/node_modules/.bin/cross-env create mode 100755 website/www/node_modules/.bin/cross-env-shell create mode 100755 website/www/node_modules/.bin/esparse create mode 100755 website/www/node_modules/.bin/esvalidate create mode 100755 website/www/node_modules/.bin/js-yaml create mode 100755 website/www/node_modules/.bin/node-which create mode 100755 website/www/node_modules/.bin/postcss create mode 100644 website/www/node_modules/.yarn-integrity create mode 100644 website/www/node_modules/@nodelib/fs.scandir/LICENSE create mode 100644 website/www/node_modules/@nodelib/fs.scandir/README.md create mode 100644 website/www/node_modules/@nodelib/fs.scandir/package.json create mode 100644 website/www/node_modules/@nodelib/fs.stat/LICENSE create mode 100644 website/www/node_modules/@nodelib/fs.stat/README.md create mode 100644 website/www/node_modules/@nodelib/fs.stat/package.json create mode 100644 website/www/node_modules/@nodelib/fs.walk/LICENSE create mode 100644 website/www/node_modules/@nodelib/fs.walk/README.md create mode 100644 website/www/node_modules/@nodelib/fs.walk/package.json create mode 100644 website/www/node_modules/@types/color-name/LICENSE create mode 100644 website/www/node_modules/@types/color-name/README.md create mode 100644 website/www/node_modules/@types/color-name/index.d.ts create mode 100644 website/www/node_modules/@types/color-name/package.json create mode 100644 website/www/node_modules/ansi-regex/index.d.ts create mode 100644 website/www/node_modules/ansi-regex/index.js create mode 100644 website/www/node_modules/ansi-regex/license create mode 100644 website/www/node_modules/ansi-regex/package.json create mode 100644 website/www/node_modules/ansi-regex/readme.md create mode 100644 website/www/node_modules/ansi-styles/index.d.ts create mode 100644 website/www/node_modules/ansi-styles/index.js create mode 100644 website/www/node_modules/ansi-styles/license create mode 100644 website/www/node_modules/ansi-styles/package.json create mode 100644 website/www/node_modules/ansi-styles/readme.md create mode 100644 website/www/node_modules/anymatch/LICENSE create mode 100644 website/www/node_modules/anymatch/README.md create mode 100644 website/www/node_modules/anymatch/index.d.ts create mode 100644 website/www/node_modules/anymatch/index.js create mode 100644 website/www/node_modules/anymatch/package.json create mode 100644 website/www/node_modules/argparse/CHANGELOG.md create mode 100644 website/www/node_modules/argparse/LICENSE create mode 100644 website/www/node_modules/argparse/README.md create mode 100644 website/www/node_modules/argparse/index.js create mode 100644 website/www/node_modules/argparse/lib/action.js create mode 100644 website/www/node_modules/argparse/lib/action/append.js create mode 100644 website/www/node_modules/argparse/lib/action/append/constant.js create mode 100644 website/www/node_modules/argparse/lib/action/count.js create mode 100644 website/www/node_modules/argparse/lib/action/help.js create mode 100644 website/www/node_modules/argparse/lib/action/store.js create mode 100644 website/www/node_modules/argparse/lib/action/store/constant.js create mode 100644 website/www/node_modules/argparse/lib/action/store/false.js create mode 100644 website/www/node_modules/argparse/lib/action/store/true.js create mode 100644 website/www/node_modules/argparse/lib/action/subparsers.js create mode 100644 website/www/node_modules/argparse/lib/action/version.js create mode 100644 website/www/node_modules/argparse/lib/action_container.js create mode 100644 website/www/node_modules/argparse/lib/argparse.js create mode 100644 website/www/node_modules/argparse/lib/argument/error.js create mode 100644 website/www/node_modules/argparse/lib/argument/exclusive.js create mode 100644 website/www/node_modules/argparse/lib/argument/group.js create mode 100644 website/www/node_modules/argparse/lib/argument_parser.js create mode 100644 website/www/node_modules/argparse/lib/const.js create mode 100644 website/www/node_modules/argparse/lib/help/added_formatters.js create mode 100644 website/www/node_modules/argparse/lib/help/formatter.js create mode 100644 website/www/node_modules/argparse/lib/namespace.js create mode 100644 website/www/node_modules/argparse/lib/utils.js create mode 100644 website/www/node_modules/argparse/package.json create mode 100644 website/www/node_modules/array-union/index.d.ts create mode 100644 website/www/node_modules/array-union/index.js create mode 100644 website/www/node_modules/array-union/license create mode 100644 website/www/node_modules/array-union/package.json create mode 100644 website/www/node_modules/array-union/readme.md create mode 100644 website/www/node_modules/at-least-node/LICENSE create mode 100644 website/www/node_modules/at-least-node/README.md create mode 100644 website/www/node_modules/at-least-node/index.js create mode 100644 website/www/node_modules/at-least-node/package.json create mode 100644 website/www/node_modules/autoprefixer/CHANGELOG.md create mode 100644 website/www/node_modules/autoprefixer/LICENSE create mode 100644 website/www/node_modules/autoprefixer/README.md create mode 100644 website/www/node_modules/autoprefixer/data/prefixes.js create mode 100644 website/www/node_modules/autoprefixer/lib/at-rule.js create mode 100644 website/www/node_modules/autoprefixer/lib/autoprefixer.js create mode 100644 website/www/node_modules/autoprefixer/lib/brackets.js create mode 100644 website/www/node_modules/autoprefixer/lib/browsers.js create mode 100644 website/www/node_modules/autoprefixer/lib/declaration.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/align-content.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/align-items.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/align-self.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/animation.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/appearance.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/backdrop-filter.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/background-clip.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/background-size.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/block-logical.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/border-image.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/border-radius.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/break-props.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/color-adjust.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/cross-fade.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/display-flex.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/display-grid.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/filter-value.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/filter.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-basis.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-direction.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-flow.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-grow.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-shrink.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-spec.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex-wrap.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/flex.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/fullscreen.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/gradient.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-area.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-column-align.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-end.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-row-align.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-row-column.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-start.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-template-areas.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-template.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/grid-utils.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/image-rendering.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/image-set.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/inline-logical.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/intrinsic.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/justify-content.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/mask-border.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/mask-composite.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/order.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/pixelated.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/place-self.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/placeholder.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/text-decoration.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/transform-decl.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/user-select.js create mode 100644 website/www/node_modules/autoprefixer/lib/hacks/writing-mode.js create mode 100644 website/www/node_modules/autoprefixer/lib/info.js create mode 100644 website/www/node_modules/autoprefixer/lib/old-selector.js create mode 100644 website/www/node_modules/autoprefixer/lib/old-value.js create mode 100644 website/www/node_modules/autoprefixer/lib/prefixer.js create mode 100644 website/www/node_modules/autoprefixer/lib/prefixes.js create mode 100644 website/www/node_modules/autoprefixer/lib/processor.js create mode 100644 website/www/node_modules/autoprefixer/lib/resolution.js create mode 100644 website/www/node_modules/autoprefixer/lib/selector.js create mode 100644 website/www/node_modules/autoprefixer/lib/supports.js create mode 100644 website/www/node_modules/autoprefixer/lib/transition.js create mode 100644 website/www/node_modules/autoprefixer/lib/utils.js create mode 100644 website/www/node_modules/autoprefixer/lib/value.js create mode 100755 website/www/node_modules/autoprefixer/node_modules/.bin/browserslist create mode 100644 website/www/node_modules/autoprefixer/package.json create mode 100644 website/www/node_modules/binary-extensions/binary-extensions.json create mode 100644 website/www/node_modules/binary-extensions/binary-extensions.json.d.ts create mode 100644 website/www/node_modules/binary-extensions/index.d.ts create mode 100644 website/www/node_modules/binary-extensions/index.js create mode 100644 website/www/node_modules/binary-extensions/license create mode 100644 website/www/node_modules/binary-extensions/package.json create mode 100644 website/www/node_modules/binary-extensions/readme.md create mode 100644 website/www/node_modules/braces/CHANGELOG.md create mode 100644 website/www/node_modules/braces/LICENSE create mode 100644 website/www/node_modules/braces/README.md create mode 100644 website/www/node_modules/braces/index.js create mode 100644 website/www/node_modules/braces/lib/compile.js create mode 100644 website/www/node_modules/braces/lib/constants.js create mode 100644 website/www/node_modules/braces/lib/expand.js create mode 100644 website/www/node_modules/braces/lib/parse.js create mode 100644 website/www/node_modules/braces/lib/stringify.js create mode 100644 website/www/node_modules/braces/lib/utils.js create mode 100644 website/www/node_modules/braces/package.json create mode 100644 website/www/node_modules/browserslist/CHANGELOG.md create mode 100644 website/www/node_modules/browserslist/LICENSE create mode 100644 website/www/node_modules/browserslist/README.md create mode 100644 website/www/node_modules/browserslist/browser.js create mode 100755 website/www/node_modules/browserslist/cli.js create mode 100644 website/www/node_modules/browserslist/error.js create mode 100644 website/www/node_modules/browserslist/index.js create mode 100644 website/www/node_modules/browserslist/node.js create mode 100644 website/www/node_modules/browserslist/package.json create mode 100644 website/www/node_modules/browserslist/update-db.js create mode 100644 website/www/node_modules/caller-callsite/index.js create mode 100644 website/www/node_modules/caller-callsite/license create mode 100644 website/www/node_modules/caller-callsite/package.json create mode 100644 website/www/node_modules/caller-callsite/readme.md create mode 100644 website/www/node_modules/caller-path/index.js create mode 100644 website/www/node_modules/caller-path/license create mode 100644 website/www/node_modules/caller-path/package.json create mode 100644 website/www/node_modules/caller-path/readme.md create mode 100644 website/www/node_modules/callsites/index.js create mode 100644 website/www/node_modules/callsites/license create mode 100644 website/www/node_modules/callsites/package.json create mode 100644 website/www/node_modules/callsites/readme.md create mode 100644 website/www/node_modules/camelcase/index.d.ts create mode 100644 website/www/node_modules/camelcase/index.js create mode 100644 website/www/node_modules/camelcase/license create mode 100644 website/www/node_modules/camelcase/package.json create mode 100644 website/www/node_modules/camelcase/readme.md create mode 100644 website/www/node_modules/caniuse-lite/CHANGELOG.md create mode 100644 website/www/node_modules/caniuse-lite/LICENSE create mode 100644 website/www/node_modules/caniuse-lite/README.md create mode 100644 website/www/node_modules/caniuse-lite/data/agents.js create mode 100644 website/www/node_modules/caniuse-lite/data/browserVersions.js create mode 100644 website/www/node_modules/caniuse-lite/data/browsers.js create mode 100644 website/www/node_modules/caniuse-lite/data/features.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/aac.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/abortcontroller.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ac3-ec3.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/accelerometer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/addeventlistener.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/alternate-stylesheet.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ambient-light.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/apng.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/array-find-index.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/array-find.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/array-flat.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/array-includes.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/arrow-functions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/asmjs.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/async-clipboard.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/async-functions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/async-iterations-and-generators.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/atob-btoa.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/audio-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/audio.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/audiotracks.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/autofocus.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/aux-click.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/auxclick.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/av1.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/avif.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-attachment.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-clip-text.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-img-opts.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-position-x-y.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-repeat-round-space.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/background-sync.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/battery-status.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/beacon.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/beforeafterprint.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/bigint.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/blobbuilder.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/bloburls.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/border-image.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/border-radius.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/broadcastchannel.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/brotli.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/calc.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/canvas-blending.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/canvas-text.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/canvas.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ch-unit.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/chacha20-poly1305.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/channel-messaging.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/childnode-remove.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/classlist.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/clear-site-data-header.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/clipboard.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/comparedocumentposition.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/console-basic.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/console-time.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/const.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/constraint-validation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/contenteditable.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/cors.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/createimagebitmap.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/credential-management.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/cryptography.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-all.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-animation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-any-link.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-appearance.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-apply-rule.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-at-counter-style.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-backdrop-filter.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-background-offsets.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-boxshadow.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-canvas.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-caret-color.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-case-insensitive.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-clip-path.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-color-adjust.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-conic-gradients.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-containment.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-counters.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-crisp-edges.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-cross-fade.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-default-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-deviceadaptation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-dir-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-display-contents.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-element-function.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-env-function.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-exclusions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-featurequeries.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-filter-function.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-filters.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-first-letter.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-first-line.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-fixed.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-focus-ring.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-focus-visible.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-focus-within.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-font-stretch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-gencontent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-gradients.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-grid.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-has.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-hyphenate.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-hyphens.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-image-orientation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-image-set.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-in-out-of-range.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-initial-letter.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-initial-value.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-letter-spacing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-line-clamp.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-logical-props.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-marker-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-masks.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-matches-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-math-functions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-media-interaction.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-media-resolution.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-media-scripting.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-mediaqueries.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-mixblendmode.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-motion-paths.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-namespaces.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-not-sel-list.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-nth-child-of.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-opacity.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-optional-pseudo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-overflow-anchor.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-overflow.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-page-break.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-paged-media.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-paint-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-placeholder-shown.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-placeholder.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-read-only-write.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-rebeccapurple.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-reflections.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-regions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-repeating-gradients.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-resize.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-revert-value.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-rrggbbaa.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-scroll-behavior.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-scrollbar.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-sel2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-sel3.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-selection.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-shapes.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-snappoints.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-sticky.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-subgrid.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-supports-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-table.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-text-align-last.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-text-indent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-text-justify.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-text-orientation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-text-spacing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-textshadow.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-touch-action-2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-touch-action.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-transitions.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-unicode-bidi.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-unset-value.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-variables.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-widows-orphans.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-writing-mode.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css-zoom.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-attr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-boxsizing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-colors.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-cursors-grab.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-cursors-newer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-cursors.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/css3-tabsize.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/currentcolor.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/custom-elements.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/custom-elementsv1.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/customevent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/datalist.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dataset.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/datauri.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/details.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/deviceorientation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/devicepixelratio.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dialog.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dispatchevent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dnssec.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/do-not-track.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/document-currentscript.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/document-execcommand.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/document-scrollingelement.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/documenthead.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dom-manip-convenience.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dom-range.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/domcontentloaded.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/domfocusin-domfocusout-events.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dommatrix.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/download.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/dragndrop.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/element-closest.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/element-from-point.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/element-scroll-methods.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/eme.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/eot.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es5.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-class.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-generators.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-module-nomodule.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-module.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-number.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6-string-includes.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/es6.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/eventsource.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/extended-system-fonts.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/feature-policy.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/fetch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/fieldset-disabled.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/fileapi.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/filereader.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/filereadersync.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/filesystem.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/flac.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/flexbox-gap.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/flexbox.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/flow-root.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/focusin-focusout-events.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/focusoptions-preventscroll.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-family-system-ui.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-feature.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-kerning.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-loading.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-size-adjust.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-smooth.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-unicode-range.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-variant-alternates.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-variant-east-asian.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/font-variant-numeric.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/fontface.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/form-attribute.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/form-submit-attributes.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/form-validation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/forms.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/fullscreen.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/gamepad.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/geolocation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/getboundingclientrect.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/getcomputedstyle.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/getelementsbyclassname.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/getrandomvalues.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/gyroscope.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/hardwareconcurrency.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/hashchange.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/heif.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/hevc.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/hidden.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/high-resolution-time.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/history.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/html-media-capture.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/html5semantic.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/http-live-streaming.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/http2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/http3.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/iframe-sandbox.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/iframe-seamless.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/iframe-srcdoc.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/imagecapture.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ime.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/imports.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/indexeddb.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/indexeddb2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/inline-block.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/innertext.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-color.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-datetime.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-email-tel-url.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-event.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-file-accept.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-file-directory.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-file-multiple.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-inputmode.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-minlength.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-number.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-pattern.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-placeholder.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-range.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-search.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/input-selection.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/insert-adjacent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/insertadjacenthtml.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/internationalization-plural-rul.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/internationalization.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/intersectionobserver.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/intl-pluralrules.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/intrinsic-width.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/jpeg2000.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/jpegxr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/json.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-code.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-key.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-location.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/keyboardevent-which.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/lazyload.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/let.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-icon-png.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-icon-svg.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-preconnect.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-prefetch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-preload.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/link-rel-prerender.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/loading-lazy-attr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/localecompare.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/magnetometer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/matchesselector.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/matchmedia.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mathml.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/maxlength.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/media-attribute.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/media-fragments.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/media-session-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mediarecorder.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mediasource.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/menu.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/meta-theme-color.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/meter.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/midi.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/minmaxwh.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mp3.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mpeg-dash.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mpeg4.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/multibackgrounds.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/multicolumn.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mutation-events.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/mutationobserver.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/namevalue-storage.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/native-filesystem-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/nav-timing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/navigator-language.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/netinfo.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/node-contains.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/node-parentelement.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/notifications.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/object-entries.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/object-fit.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/object-observe.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/object-values.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/objectrtc.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/offline-apps.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/offscreencanvas.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ogg-vorbis.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ogv.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ol-reversed.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/once-event-listener.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/online-status.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/opus.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/orientation-sensor.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/outline.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/pad-start-end.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/page-transition-events.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/pagevisibility.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/passive-event-listener.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/passwordrules.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/path2d.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/payment-request.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/permissions-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/picture-in-picture.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/picture.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ping.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/png-alpha.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/pointer-events.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/pointer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/pointerlock.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/prefers-color-scheme.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/private-class-fields.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/private-methods-and-accessors.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/progress.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/promise-finally.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/promises.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/proximity.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/proxy.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/public-class-fields.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/publickeypinning.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/push-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/queryselector.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/readonly-attr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/referrer-policy.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/registerprotocolhandler.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rel-noopener.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rel-noreferrer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rellist.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rem.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/replace-all.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/requestanimationframe.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/requestidlecallback.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/resizeobserver.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/resource-timing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rest-parameters.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/rtcpeerconnection.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ruby.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/run-in.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/screen-orientation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/script-async.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/script-defer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/scrollintoview.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sdch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/selection-api.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/server-timing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/serviceworkers.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/setimmediate.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sha-2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/shadowdom.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/shadowdomv1.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sharedarraybuffer.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sharedworkers.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sni.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/spdy.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/speech-recognition.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/speech-synthesis.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/spellcheck-attribute.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sql-storage.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/srcset.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/stopimmediatepropagation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/stream.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/streams.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/stricttransportsecurity.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/style-scoped.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/subresource-integrity.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-css.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-filters.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-fonts.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-fragment.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-html.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-html5.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-img.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg-smil.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/svg.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/sxg.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/symbols.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/tabindex-attr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/template-literals.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/template.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/testfeat.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-decoration.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-emphasis.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-overflow.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-size-adjust.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-stroke.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/text-underline-offset.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/textcontent.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/textencoder.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/tls1-1.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/tls1-2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/tls1-3.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/token-binding.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/touch.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/transforms2d.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/transforms3d.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/trusted-types.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/ttf.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/typedarrays.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/u2f.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/unhandledrejection.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/url.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/urlsearchparams.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/use-strict.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/user-select-none.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/user-timing.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/variable-fonts.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/vibration.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/video.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/videotracks.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/viewport-units.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/wai-aria.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/wasm.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/wav.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/wbr-element.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/web-animation.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/web-app-manifest.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/web-bluetooth.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/web-share.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webauthn.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webgl.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webgl2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webgpu.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webhid.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webm.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webp.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/websockets.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webusb.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webvr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webvtt.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webworkers.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/webxr.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/will-change.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/woff.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/woff2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/word-break.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/wordwrap.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/x-doc-messaging.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/x-frame-options.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/xhr2.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/xhtml.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/xhtmlsmil.js create mode 100644 website/www/node_modules/caniuse-lite/data/features/xml-serializer.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AX.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/AZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BB.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BJ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/BZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CV.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CX.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/CZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DJ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/DZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/EC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/EE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/EG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ER.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ES.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ET.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FJ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/FR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GB.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GP.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GQ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/GY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/HK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/HN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/HR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/HT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/HU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ID.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IQ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/IT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/JE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/JM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/JO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/JP.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KP.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/KZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LB.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LV.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/LY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ME.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ML.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MP.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MQ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MV.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MX.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/MZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NP.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/NZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/OM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/PY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/QA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/RE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/RO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/RS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/RU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/RW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SB.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ST.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SV.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/SZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TD.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TH.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TJ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TK.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TL.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TO.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TR.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TV.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/TZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/UA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/UG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/US.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/UY.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/UZ.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VC.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VG.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VI.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VN.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/VU.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/WF.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/WS.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/YE.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/YT.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ZA.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ZM.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/ZW.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-af.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-an.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-as.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-eu.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-na.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-oc.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-sa.js create mode 100644 website/www/node_modules/caniuse-lite/data/regions/alt-ww.js create mode 100644 website/www/node_modules/caniuse-lite/package.json create mode 100644 website/www/node_modules/chalk/index.js create mode 100644 website/www/node_modules/chalk/index.js.flow create mode 100644 website/www/node_modules/chalk/license create mode 100644 website/www/node_modules/chalk/node_modules/ansi-styles/index.js create mode 100644 website/www/node_modules/chalk/node_modules/ansi-styles/license create mode 100644 website/www/node_modules/chalk/node_modules/ansi-styles/package.json create mode 100644 website/www/node_modules/chalk/node_modules/ansi-styles/readme.md create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/CHANGELOG.md create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/LICENSE create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/README.md create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/conversions.js create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/index.js create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/package.json create mode 100644 website/www/node_modules/chalk/node_modules/color-convert/route.js create mode 100644 website/www/node_modules/chalk/node_modules/color-name/.eslintrc.json create mode 100644 website/www/node_modules/chalk/node_modules/color-name/.npmignore create mode 100644 website/www/node_modules/chalk/node_modules/color-name/LICENSE create mode 100644 website/www/node_modules/chalk/node_modules/color-name/README.md create mode 100644 website/www/node_modules/chalk/node_modules/color-name/index.js create mode 100644 website/www/node_modules/chalk/node_modules/color-name/package.json create mode 100644 website/www/node_modules/chalk/node_modules/color-name/test.js create mode 100644 website/www/node_modules/chalk/package.json create mode 100644 website/www/node_modules/chalk/readme.md create mode 100644 website/www/node_modules/chalk/templates.js create mode 100644 website/www/node_modules/chalk/types/index.d.ts create mode 100644 website/www/node_modules/chokidar/LICENSE create mode 100644 website/www/node_modules/chokidar/README.md create mode 100644 website/www/node_modules/chokidar/index.js create mode 100644 website/www/node_modules/chokidar/lib/constants.js create mode 100644 website/www/node_modules/chokidar/lib/fsevents-handler.js create mode 100644 website/www/node_modules/chokidar/lib/nodefs-handler.js create mode 100644 website/www/node_modules/chokidar/package.json create mode 100644 website/www/node_modules/chokidar/types/index.d.ts create mode 100644 website/www/node_modules/cliui/CHANGELOG.md create mode 100644 website/www/node_modules/cliui/LICENSE.txt create mode 100644 website/www/node_modules/cliui/README.md create mode 100644 website/www/node_modules/cliui/index.js create mode 100644 website/www/node_modules/cliui/package.json create mode 100644 website/www/node_modules/color-convert/CHANGELOG.md create mode 100644 website/www/node_modules/color-convert/LICENSE create mode 100644 website/www/node_modules/color-convert/README.md create mode 100644 website/www/node_modules/color-convert/conversions.js create mode 100644 website/www/node_modules/color-convert/index.js create mode 100644 website/www/node_modules/color-convert/package.json create mode 100644 website/www/node_modules/color-convert/route.js create mode 100644 website/www/node_modules/color-name/LICENSE create mode 100644 website/www/node_modules/color-name/README.md create mode 100644 website/www/node_modules/color-name/index.js create mode 100644 website/www/node_modules/color-name/package.json create mode 100644 website/www/node_modules/cosmiconfig/CHANGELOG.md create mode 100644 website/www/node_modules/cosmiconfig/LICENSE create mode 100644 website/www/node_modules/cosmiconfig/README.md create mode 100755 website/www/node_modules/cosmiconfig/node_modules/.bin/js-yaml create mode 100644 website/www/node_modules/cosmiconfig/package.json create mode 100644 website/www/node_modules/cross-env/CHANGELOG.md create mode 100644 website/www/node_modules/cross-env/LICENSE create mode 100755 website/www/node_modules/cross-env/README.md create mode 100644 website/www/node_modules/cross-env/package.json create mode 100644 website/www/node_modules/cross-env/src/command.js create mode 100644 website/www/node_modules/cross-env/src/index.js create mode 100644 website/www/node_modules/cross-env/src/is-windows.js create mode 100644 website/www/node_modules/cross-env/src/variable.js create mode 100644 website/www/node_modules/cross-spawn/CHANGELOG.md create mode 100644 website/www/node_modules/cross-spawn/LICENSE create mode 100644 website/www/node_modules/cross-spawn/README.md create mode 100644 website/www/node_modules/cross-spawn/index.js create mode 100644 website/www/node_modules/cross-spawn/lib/enoent.js create mode 100644 website/www/node_modules/cross-spawn/lib/parse.js create mode 100644 website/www/node_modules/cross-spawn/lib/util/escape.js create mode 100644 website/www/node_modules/cross-spawn/lib/util/readShebang.js create mode 100644 website/www/node_modules/cross-spawn/lib/util/resolveCommand.js create mode 100755 website/www/node_modules/cross-spawn/node_modules/.bin/node-which create mode 100644 website/www/node_modules/cross-spawn/package.json create mode 100644 website/www/node_modules/decamelize/index.js create mode 100644 website/www/node_modules/decamelize/license create mode 100644 website/www/node_modules/decamelize/package.json create mode 100644 website/www/node_modules/decamelize/readme.md create mode 100755 website/www/node_modules/dependency-graph/CHANGELOG.md create mode 100755 website/www/node_modules/dependency-graph/LICENSE create mode 100755 website/www/node_modules/dependency-graph/README.md create mode 100755 website/www/node_modules/dependency-graph/lib/dep_graph.js create mode 100755 website/www/node_modules/dependency-graph/lib/index.d.ts create mode 100755 website/www/node_modules/dependency-graph/package.json create mode 100755 website/www/node_modules/dependency-graph/specs/dep_graph_spec.js create mode 100644 website/www/node_modules/dir-glob/index.js create mode 100644 website/www/node_modules/dir-glob/license create mode 100644 website/www/node_modules/dir-glob/package.json create mode 100644 website/www/node_modules/dir-glob/readme.md create mode 100644 website/www/node_modules/electron-to-chromium/CHANGELOG.md create mode 100644 website/www/node_modules/electron-to-chromium/LICENSE create mode 100644 website/www/node_modules/electron-to-chromium/README.md create mode 100644 website/www/node_modules/electron-to-chromium/chromium-versions.js create mode 100644 website/www/node_modules/electron-to-chromium/full-chromium-versions.js create mode 100644 website/www/node_modules/electron-to-chromium/full-versions.js create mode 100644 website/www/node_modules/electron-to-chromium/index.js create mode 100644 website/www/node_modules/electron-to-chromium/package.json create mode 100644 website/www/node_modules/electron-to-chromium/versions.js create mode 100644 website/www/node_modules/emoji-regex/LICENSE-MIT.txt create mode 100644 website/www/node_modules/emoji-regex/README.md create mode 100644 website/www/node_modules/emoji-regex/es2015/index.js create mode 100644 website/www/node_modules/emoji-regex/es2015/text.js create mode 100644 website/www/node_modules/emoji-regex/index.d.ts create mode 100644 website/www/node_modules/emoji-regex/index.js create mode 100644 website/www/node_modules/emoji-regex/package.json create mode 100644 website/www/node_modules/emoji-regex/text.js create mode 100644 website/www/node_modules/error-ex/LICENSE create mode 100644 website/www/node_modules/error-ex/README.md create mode 100644 website/www/node_modules/error-ex/index.js create mode 100644 website/www/node_modules/error-ex/package.json create mode 100644 website/www/node_modules/escape-string-regexp/index.js create mode 100644 website/www/node_modules/escape-string-regexp/license create mode 100644 website/www/node_modules/escape-string-regexp/package.json create mode 100644 website/www/node_modules/escape-string-regexp/readme.md create mode 100644 website/www/node_modules/esprima/ChangeLog create mode 100644 website/www/node_modules/esprima/LICENSE.BSD create mode 100644 website/www/node_modules/esprima/README.md create mode 100644 website/www/node_modules/esprima/package.json create mode 100644 website/www/node_modules/fast-glob/LICENSE create mode 100644 website/www/node_modules/fast-glob/README.md create mode 100644 website/www/node_modules/fast-glob/package.json create mode 100644 website/www/node_modules/fastq/.github/workflows/ci.yml create mode 100644 website/www/node_modules/fastq/LICENSE create mode 100644 website/www/node_modules/fastq/README.md create mode 100644 website/www/node_modules/fastq/bench.js create mode 100644 website/www/node_modules/fastq/example.js create mode 100644 website/www/node_modules/fastq/index.d.ts create mode 100644 website/www/node_modules/fastq/package.json create mode 100644 website/www/node_modules/fastq/queue.js create mode 100644 website/www/node_modules/fastq/test/example.ts create mode 100644 website/www/node_modules/fastq/test/test.js create mode 100644 website/www/node_modules/fastq/test/tsconfig.json create mode 100644 website/www/node_modules/fill-range/LICENSE create mode 100644 website/www/node_modules/fill-range/README.md create mode 100644 website/www/node_modules/fill-range/index.js create mode 100644 website/www/node_modules/fill-range/package.json create mode 100644 website/www/node_modules/find-up/index.d.ts create mode 100644 website/www/node_modules/find-up/index.js create mode 100644 website/www/node_modules/find-up/license create mode 100644 website/www/node_modules/find-up/package.json create mode 100644 website/www/node_modules/find-up/readme.md create mode 100644 website/www/node_modules/fs-extra/CHANGELOG.md create mode 100644 website/www/node_modules/fs-extra/LICENSE create mode 100644 website/www/node_modules/fs-extra/README.md create mode 100644 website/www/node_modules/fs-extra/lib/copy-sync/copy-sync.js create mode 100644 website/www/node_modules/fs-extra/lib/copy-sync/index.js create mode 100644 website/www/node_modules/fs-extra/lib/copy/copy.js create mode 100644 website/www/node_modules/fs-extra/lib/copy/index.js create mode 100644 website/www/node_modules/fs-extra/lib/empty/index.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/file.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/index.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/link.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/symlink-paths.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/symlink-type.js create mode 100644 website/www/node_modules/fs-extra/lib/ensure/symlink.js create mode 100644 website/www/node_modules/fs-extra/lib/fs/index.js create mode 100644 website/www/node_modules/fs-extra/lib/index.js create mode 100644 website/www/node_modules/fs-extra/lib/json/index.js create mode 100644 website/www/node_modules/fs-extra/lib/json/jsonfile.js create mode 100644 website/www/node_modules/fs-extra/lib/json/output-json-sync.js create mode 100644 website/www/node_modules/fs-extra/lib/json/output-json.js create mode 100644 website/www/node_modules/fs-extra/lib/mkdirs/index.js create mode 100644 website/www/node_modules/fs-extra/lib/mkdirs/make-dir.js create mode 100644 website/www/node_modules/fs-extra/lib/move-sync/index.js create mode 100644 website/www/node_modules/fs-extra/lib/move-sync/move-sync.js create mode 100644 website/www/node_modules/fs-extra/lib/move/index.js create mode 100644 website/www/node_modules/fs-extra/lib/move/move.js create mode 100644 website/www/node_modules/fs-extra/lib/output/index.js create mode 100644 website/www/node_modules/fs-extra/lib/path-exists/index.js create mode 100644 website/www/node_modules/fs-extra/lib/remove/index.js create mode 100644 website/www/node_modules/fs-extra/lib/remove/rimraf.js create mode 100644 website/www/node_modules/fs-extra/lib/util/stat.js create mode 100644 website/www/node_modules/fs-extra/lib/util/utimes.js create mode 100644 website/www/node_modules/fs-extra/package.json create mode 100644 website/www/node_modules/get-caller-file/LICENSE.md create mode 100644 website/www/node_modules/get-caller-file/README.md create mode 100644 website/www/node_modules/get-caller-file/index.d.ts create mode 100644 website/www/node_modules/get-caller-file/index.js create mode 100644 website/www/node_modules/get-caller-file/index.js.map create mode 100644 website/www/node_modules/get-caller-file/package.json create mode 100644 website/www/node_modules/get-stdin/index.d.ts create mode 100644 website/www/node_modules/get-stdin/index.js create mode 100644 website/www/node_modules/get-stdin/license create mode 100644 website/www/node_modules/get-stdin/package.json create mode 100644 website/www/node_modules/get-stdin/readme.md create mode 100644 website/www/node_modules/glob-parent/LICENSE create mode 100644 website/www/node_modules/glob-parent/README.md create mode 100644 website/www/node_modules/glob-parent/index.js create mode 100644 website/www/node_modules/glob-parent/package.json create mode 100644 website/www/node_modules/globby/gitignore.js create mode 100644 website/www/node_modules/globby/index.d.ts create mode 100644 website/www/node_modules/globby/index.js create mode 100644 website/www/node_modules/globby/license create mode 100644 website/www/node_modules/globby/package.json create mode 100644 website/www/node_modules/globby/readme.md create mode 100644 website/www/node_modules/globby/stream-utils.js create mode 100644 website/www/node_modules/graceful-fs/LICENSE create mode 100644 website/www/node_modules/graceful-fs/README.md create mode 100644 website/www/node_modules/graceful-fs/clone.js create mode 100644 website/www/node_modules/graceful-fs/graceful-fs.js create mode 100644 website/www/node_modules/graceful-fs/legacy-streams.js create mode 100644 website/www/node_modules/graceful-fs/package.json create mode 100644 website/www/node_modules/graceful-fs/polyfills.js create mode 100644 website/www/node_modules/has-flag/index.js create mode 100644 website/www/node_modules/has-flag/license create mode 100644 website/www/node_modules/has-flag/package.json create mode 100644 website/www/node_modules/has-flag/readme.md create mode 100644 website/www/node_modules/ignore/CHANGELOG.md create mode 100644 website/www/node_modules/ignore/LICENSE-MIT create mode 100644 website/www/node_modules/ignore/README.md create mode 100644 website/www/node_modules/ignore/index.d.ts create mode 100644 website/www/node_modules/ignore/index.js create mode 100644 website/www/node_modules/ignore/legacy.js create mode 100644 website/www/node_modules/ignore/package.json create mode 100644 website/www/node_modules/import-cwd/index.js create mode 100644 website/www/node_modules/import-cwd/license create mode 100644 website/www/node_modules/import-cwd/package.json create mode 100644 website/www/node_modules/import-cwd/readme.md create mode 100644 website/www/node_modules/import-fresh/index.js create mode 100644 website/www/node_modules/import-fresh/license create mode 100644 website/www/node_modules/import-fresh/package.json create mode 100644 website/www/node_modules/import-fresh/readme.md create mode 100644 website/www/node_modules/import-from/index.js create mode 100644 website/www/node_modules/import-from/license create mode 100644 website/www/node_modules/import-from/package.json create mode 100644 website/www/node_modules/import-from/readme.md create mode 100644 website/www/node_modules/is-arrayish/.editorconfig create mode 100644 website/www/node_modules/is-arrayish/.istanbul.yml create mode 100644 website/www/node_modules/is-arrayish/.npmignore create mode 100644 website/www/node_modules/is-arrayish/.travis.yml create mode 100644 website/www/node_modules/is-arrayish/LICENSE create mode 100644 website/www/node_modules/is-arrayish/README.md create mode 100644 website/www/node_modules/is-arrayish/index.js create mode 100644 website/www/node_modules/is-arrayish/package.json create mode 100644 website/www/node_modules/is-binary-path/index.d.ts create mode 100644 website/www/node_modules/is-binary-path/index.js create mode 100644 website/www/node_modules/is-binary-path/license create mode 100644 website/www/node_modules/is-binary-path/package.json create mode 100644 website/www/node_modules/is-binary-path/readme.md create mode 100644 website/www/node_modules/is-directory/LICENSE create mode 100644 website/www/node_modules/is-directory/README.md create mode 100644 website/www/node_modules/is-directory/index.js create mode 100644 website/www/node_modules/is-directory/package.json create mode 100644 website/www/node_modules/is-extglob/LICENSE create mode 100644 website/www/node_modules/is-extglob/README.md create mode 100644 website/www/node_modules/is-extglob/index.js create mode 100644 website/www/node_modules/is-extglob/package.json create mode 100644 website/www/node_modules/is-fullwidth-code-point/index.d.ts create mode 100644 website/www/node_modules/is-fullwidth-code-point/index.js create mode 100644 website/www/node_modules/is-fullwidth-code-point/license create mode 100644 website/www/node_modules/is-fullwidth-code-point/package.json create mode 100644 website/www/node_modules/is-fullwidth-code-point/readme.md create mode 100644 website/www/node_modules/is-glob/LICENSE create mode 100644 website/www/node_modules/is-glob/README.md create mode 100644 website/www/node_modules/is-glob/index.js create mode 100644 website/www/node_modules/is-glob/package.json create mode 100644 website/www/node_modules/is-number/LICENSE create mode 100644 website/www/node_modules/is-number/README.md create mode 100644 website/www/node_modules/is-number/index.js create mode 100644 website/www/node_modules/is-number/package.json create mode 100644 website/www/node_modules/isexe/.npmignore create mode 100644 website/www/node_modules/isexe/LICENSE create mode 100644 website/www/node_modules/isexe/README.md create mode 100644 website/www/node_modules/isexe/index.js create mode 100644 website/www/node_modules/isexe/mode.js create mode 100644 website/www/node_modules/isexe/package.json create mode 100644 website/www/node_modules/isexe/test/basic.js create mode 100644 website/www/node_modules/isexe/windows.js create mode 100644 website/www/node_modules/js-yaml/CHANGELOG.md create mode 100644 website/www/node_modules/js-yaml/LICENSE create mode 100644 website/www/node_modules/js-yaml/README.md create mode 100644 website/www/node_modules/js-yaml/index.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/common.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/dumper.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/exception.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/loader.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/mark.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema/core.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema/default_full.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/schema/json.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/binary.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/bool.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/float.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/int.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/js/function.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/map.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/merge.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/null.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/omap.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/pairs.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/seq.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/set.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/str.js create mode 100644 website/www/node_modules/js-yaml/lib/js-yaml/type/timestamp.js create mode 100755 website/www/node_modules/js-yaml/node_modules/.bin/esparse create mode 100755 website/www/node_modules/js-yaml/node_modules/.bin/esvalidate create mode 100644 website/www/node_modules/js-yaml/package.json create mode 100644 website/www/node_modules/json-parse-better-errors/CHANGELOG.md create mode 100644 website/www/node_modules/json-parse-better-errors/LICENSE.md create mode 100644 website/www/node_modules/json-parse-better-errors/README.md create mode 100644 website/www/node_modules/json-parse-better-errors/index.js create mode 100644 website/www/node_modules/json-parse-better-errors/package.json create mode 100644 website/www/node_modules/jsonfile/CHANGELOG.md create mode 100644 website/www/node_modules/jsonfile/LICENSE create mode 100644 website/www/node_modules/jsonfile/README.md create mode 100644 website/www/node_modules/jsonfile/index.js create mode 100644 website/www/node_modules/jsonfile/package.json create mode 100644 website/www/node_modules/jsonfile/utils.js create mode 100644 website/www/node_modules/locate-path/index.d.ts create mode 100644 website/www/node_modules/locate-path/index.js create mode 100644 website/www/node_modules/locate-path/license create mode 100644 website/www/node_modules/locate-path/package.json create mode 100644 website/www/node_modules/locate-path/readme.md create mode 100644 website/www/node_modules/lodash/LICENSE create mode 100644 website/www/node_modules/lodash/README.md create mode 100644 website/www/node_modules/lodash/_DataView.js create mode 100644 website/www/node_modules/lodash/_Hash.js create mode 100644 website/www/node_modules/lodash/_LazyWrapper.js create mode 100644 website/www/node_modules/lodash/_ListCache.js create mode 100644 website/www/node_modules/lodash/_LodashWrapper.js create mode 100644 website/www/node_modules/lodash/_Map.js create mode 100644 website/www/node_modules/lodash/_MapCache.js create mode 100644 website/www/node_modules/lodash/_Promise.js create mode 100644 website/www/node_modules/lodash/_Set.js create mode 100644 website/www/node_modules/lodash/_SetCache.js create mode 100644 website/www/node_modules/lodash/_Stack.js create mode 100644 website/www/node_modules/lodash/_Symbol.js create mode 100644 website/www/node_modules/lodash/_Uint8Array.js create mode 100644 website/www/node_modules/lodash/_WeakMap.js create mode 100644 website/www/node_modules/lodash/_apply.js create mode 100644 website/www/node_modules/lodash/_arrayAggregator.js create mode 100644 website/www/node_modules/lodash/_arrayEach.js create mode 100644 website/www/node_modules/lodash/_arrayEachRight.js create mode 100644 website/www/node_modules/lodash/_arrayEvery.js create mode 100644 website/www/node_modules/lodash/_arrayFilter.js create mode 100644 website/www/node_modules/lodash/_arrayIncludes.js create mode 100644 website/www/node_modules/lodash/_arrayIncludesWith.js create mode 100644 website/www/node_modules/lodash/_arrayLikeKeys.js create mode 100644 website/www/node_modules/lodash/_arrayMap.js create mode 100644 website/www/node_modules/lodash/_arrayPush.js create mode 100644 website/www/node_modules/lodash/_arrayReduce.js create mode 100644 website/www/node_modules/lodash/_arrayReduceRight.js create mode 100644 website/www/node_modules/lodash/_arraySample.js create mode 100644 website/www/node_modules/lodash/_arraySampleSize.js create mode 100644 website/www/node_modules/lodash/_arrayShuffle.js create mode 100644 website/www/node_modules/lodash/_arraySome.js create mode 100644 website/www/node_modules/lodash/_asciiSize.js create mode 100644 website/www/node_modules/lodash/_asciiToArray.js create mode 100644 website/www/node_modules/lodash/_asciiWords.js create mode 100644 website/www/node_modules/lodash/_assignMergeValue.js create mode 100644 website/www/node_modules/lodash/_assignValue.js create mode 100644 website/www/node_modules/lodash/_assocIndexOf.js create mode 100644 website/www/node_modules/lodash/_baseAggregator.js create mode 100644 website/www/node_modules/lodash/_baseAssign.js create mode 100644 website/www/node_modules/lodash/_baseAssignIn.js create mode 100644 website/www/node_modules/lodash/_baseAssignValue.js create mode 100644 website/www/node_modules/lodash/_baseAt.js create mode 100644 website/www/node_modules/lodash/_baseClamp.js create mode 100644 website/www/node_modules/lodash/_baseClone.js create mode 100644 website/www/node_modules/lodash/_baseConforms.js create mode 100644 website/www/node_modules/lodash/_baseConformsTo.js create mode 100644 website/www/node_modules/lodash/_baseCreate.js create mode 100644 website/www/node_modules/lodash/_baseDelay.js create mode 100644 website/www/node_modules/lodash/_baseDifference.js create mode 100644 website/www/node_modules/lodash/_baseEach.js create mode 100644 website/www/node_modules/lodash/_baseEachRight.js create mode 100644 website/www/node_modules/lodash/_baseEvery.js create mode 100644 website/www/node_modules/lodash/_baseExtremum.js create mode 100644 website/www/node_modules/lodash/_baseFill.js create mode 100644 website/www/node_modules/lodash/_baseFilter.js create mode 100644 website/www/node_modules/lodash/_baseFindIndex.js create mode 100644 website/www/node_modules/lodash/_baseFindKey.js create mode 100644 website/www/node_modules/lodash/_baseFlatten.js create mode 100644 website/www/node_modules/lodash/_baseFor.js create mode 100644 website/www/node_modules/lodash/_baseForOwn.js create mode 100644 website/www/node_modules/lodash/_baseForOwnRight.js create mode 100644 website/www/node_modules/lodash/_baseForRight.js create mode 100644 website/www/node_modules/lodash/_baseFunctions.js create mode 100644 website/www/node_modules/lodash/_baseGet.js create mode 100644 website/www/node_modules/lodash/_baseGetAllKeys.js create mode 100644 website/www/node_modules/lodash/_baseGetTag.js create mode 100644 website/www/node_modules/lodash/_baseGt.js create mode 100644 website/www/node_modules/lodash/_baseHas.js create mode 100644 website/www/node_modules/lodash/_baseHasIn.js create mode 100644 website/www/node_modules/lodash/_baseInRange.js create mode 100644 website/www/node_modules/lodash/_baseIndexOf.js create mode 100644 website/www/node_modules/lodash/_baseIndexOfWith.js create mode 100644 website/www/node_modules/lodash/_baseIntersection.js create mode 100644 website/www/node_modules/lodash/_baseInverter.js create mode 100644 website/www/node_modules/lodash/_baseInvoke.js create mode 100644 website/www/node_modules/lodash/_baseIsArguments.js create mode 100644 website/www/node_modules/lodash/_baseIsArrayBuffer.js create mode 100644 website/www/node_modules/lodash/_baseIsDate.js create mode 100644 website/www/node_modules/lodash/_baseIsEqual.js create mode 100644 website/www/node_modules/lodash/_baseIsEqualDeep.js create mode 100644 website/www/node_modules/lodash/_baseIsMap.js create mode 100644 website/www/node_modules/lodash/_baseIsMatch.js create mode 100644 website/www/node_modules/lodash/_baseIsNaN.js create mode 100644 website/www/node_modules/lodash/_baseIsNative.js create mode 100644 website/www/node_modules/lodash/_baseIsRegExp.js create mode 100644 website/www/node_modules/lodash/_baseIsSet.js create mode 100644 website/www/node_modules/lodash/_baseIsTypedArray.js create mode 100644 website/www/node_modules/lodash/_baseIteratee.js create mode 100644 website/www/node_modules/lodash/_baseKeys.js create mode 100644 website/www/node_modules/lodash/_baseKeysIn.js create mode 100644 website/www/node_modules/lodash/_baseLodash.js create mode 100644 website/www/node_modules/lodash/_baseLt.js create mode 100644 website/www/node_modules/lodash/_baseMap.js create mode 100644 website/www/node_modules/lodash/_baseMatches.js create mode 100644 website/www/node_modules/lodash/_baseMatchesProperty.js create mode 100644 website/www/node_modules/lodash/_baseMean.js create mode 100644 website/www/node_modules/lodash/_baseMerge.js create mode 100644 website/www/node_modules/lodash/_baseMergeDeep.js create mode 100644 website/www/node_modules/lodash/_baseNth.js create mode 100644 website/www/node_modules/lodash/_baseOrderBy.js create mode 100644 website/www/node_modules/lodash/_basePick.js create mode 100644 website/www/node_modules/lodash/_basePickBy.js create mode 100644 website/www/node_modules/lodash/_baseProperty.js create mode 100644 website/www/node_modules/lodash/_basePropertyDeep.js create mode 100644 website/www/node_modules/lodash/_basePropertyOf.js create mode 100644 website/www/node_modules/lodash/_basePullAll.js create mode 100644 website/www/node_modules/lodash/_basePullAt.js create mode 100644 website/www/node_modules/lodash/_baseRandom.js create mode 100644 website/www/node_modules/lodash/_baseRange.js create mode 100644 website/www/node_modules/lodash/_baseReduce.js create mode 100644 website/www/node_modules/lodash/_baseRepeat.js create mode 100644 website/www/node_modules/lodash/_baseRest.js create mode 100644 website/www/node_modules/lodash/_baseSample.js create mode 100644 website/www/node_modules/lodash/_baseSampleSize.js create mode 100644 website/www/node_modules/lodash/_baseSet.js create mode 100644 website/www/node_modules/lodash/_baseSetData.js create mode 100644 website/www/node_modules/lodash/_baseSetToString.js create mode 100644 website/www/node_modules/lodash/_baseShuffle.js create mode 100644 website/www/node_modules/lodash/_baseSlice.js create mode 100644 website/www/node_modules/lodash/_baseSome.js create mode 100644 website/www/node_modules/lodash/_baseSortBy.js create mode 100644 website/www/node_modules/lodash/_baseSortedIndex.js create mode 100644 website/www/node_modules/lodash/_baseSortedIndexBy.js create mode 100644 website/www/node_modules/lodash/_baseSortedUniq.js create mode 100644 website/www/node_modules/lodash/_baseSum.js create mode 100644 website/www/node_modules/lodash/_baseTimes.js create mode 100644 website/www/node_modules/lodash/_baseToNumber.js create mode 100644 website/www/node_modules/lodash/_baseToPairs.js create mode 100644 website/www/node_modules/lodash/_baseToString.js create mode 100644 website/www/node_modules/lodash/_baseUnary.js create mode 100644 website/www/node_modules/lodash/_baseUniq.js create mode 100644 website/www/node_modules/lodash/_baseUnset.js create mode 100644 website/www/node_modules/lodash/_baseUpdate.js create mode 100644 website/www/node_modules/lodash/_baseValues.js create mode 100644 website/www/node_modules/lodash/_baseWhile.js create mode 100644 website/www/node_modules/lodash/_baseWrapperValue.js create mode 100644 website/www/node_modules/lodash/_baseXor.js create mode 100644 website/www/node_modules/lodash/_baseZipObject.js create mode 100644 website/www/node_modules/lodash/_cacheHas.js create mode 100644 website/www/node_modules/lodash/_castArrayLikeObject.js create mode 100644 website/www/node_modules/lodash/_castFunction.js create mode 100644 website/www/node_modules/lodash/_castPath.js create mode 100644 website/www/node_modules/lodash/_castRest.js create mode 100644 website/www/node_modules/lodash/_castSlice.js create mode 100644 website/www/node_modules/lodash/_charsEndIndex.js create mode 100644 website/www/node_modules/lodash/_charsStartIndex.js create mode 100644 website/www/node_modules/lodash/_cloneArrayBuffer.js create mode 100644 website/www/node_modules/lodash/_cloneBuffer.js create mode 100644 website/www/node_modules/lodash/_cloneDataView.js create mode 100644 website/www/node_modules/lodash/_cloneRegExp.js create mode 100644 website/www/node_modules/lodash/_cloneSymbol.js create mode 100644 website/www/node_modules/lodash/_cloneTypedArray.js create mode 100644 website/www/node_modules/lodash/_compareAscending.js create mode 100644 website/www/node_modules/lodash/_compareMultiple.js create mode 100644 website/www/node_modules/lodash/_composeArgs.js create mode 100644 website/www/node_modules/lodash/_composeArgsRight.js create mode 100644 website/www/node_modules/lodash/_copyArray.js create mode 100644 website/www/node_modules/lodash/_copyObject.js create mode 100644 website/www/node_modules/lodash/_copySymbols.js create mode 100644 website/www/node_modules/lodash/_copySymbolsIn.js create mode 100644 website/www/node_modules/lodash/_coreJsData.js create mode 100644 website/www/node_modules/lodash/_countHolders.js create mode 100644 website/www/node_modules/lodash/_createAggregator.js create mode 100644 website/www/node_modules/lodash/_createAssigner.js create mode 100644 website/www/node_modules/lodash/_createBaseEach.js create mode 100644 website/www/node_modules/lodash/_createBaseFor.js create mode 100644 website/www/node_modules/lodash/_createBind.js create mode 100644 website/www/node_modules/lodash/_createCaseFirst.js create mode 100644 website/www/node_modules/lodash/_createCompounder.js create mode 100644 website/www/node_modules/lodash/_createCtor.js create mode 100644 website/www/node_modules/lodash/_createCurry.js create mode 100644 website/www/node_modules/lodash/_createFind.js create mode 100644 website/www/node_modules/lodash/_createFlow.js create mode 100644 website/www/node_modules/lodash/_createHybrid.js create mode 100644 website/www/node_modules/lodash/_createInverter.js create mode 100644 website/www/node_modules/lodash/_createMathOperation.js create mode 100644 website/www/node_modules/lodash/_createOver.js create mode 100644 website/www/node_modules/lodash/_createPadding.js create mode 100644 website/www/node_modules/lodash/_createPartial.js create mode 100644 website/www/node_modules/lodash/_createRange.js create mode 100644 website/www/node_modules/lodash/_createRecurry.js create mode 100644 website/www/node_modules/lodash/_createRelationalOperation.js create mode 100644 website/www/node_modules/lodash/_createRound.js create mode 100644 website/www/node_modules/lodash/_createSet.js create mode 100644 website/www/node_modules/lodash/_createToPairs.js create mode 100644 website/www/node_modules/lodash/_createWrap.js create mode 100644 website/www/node_modules/lodash/_customDefaultsAssignIn.js create mode 100644 website/www/node_modules/lodash/_customDefaultsMerge.js create mode 100644 website/www/node_modules/lodash/_customOmitClone.js create mode 100644 website/www/node_modules/lodash/_deburrLetter.js create mode 100644 website/www/node_modules/lodash/_defineProperty.js create mode 100644 website/www/node_modules/lodash/_equalArrays.js create mode 100644 website/www/node_modules/lodash/_equalByTag.js create mode 100644 website/www/node_modules/lodash/_equalObjects.js create mode 100644 website/www/node_modules/lodash/_escapeHtmlChar.js create mode 100644 website/www/node_modules/lodash/_escapeStringChar.js create mode 100644 website/www/node_modules/lodash/_flatRest.js create mode 100644 website/www/node_modules/lodash/_freeGlobal.js create mode 100644 website/www/node_modules/lodash/_getAllKeys.js create mode 100644 website/www/node_modules/lodash/_getAllKeysIn.js create mode 100644 website/www/node_modules/lodash/_getData.js create mode 100644 website/www/node_modules/lodash/_getFuncName.js create mode 100644 website/www/node_modules/lodash/_getHolder.js create mode 100644 website/www/node_modules/lodash/_getMapData.js create mode 100644 website/www/node_modules/lodash/_getMatchData.js create mode 100644 website/www/node_modules/lodash/_getNative.js create mode 100644 website/www/node_modules/lodash/_getPrototype.js create mode 100644 website/www/node_modules/lodash/_getRawTag.js create mode 100644 website/www/node_modules/lodash/_getSymbols.js create mode 100644 website/www/node_modules/lodash/_getSymbolsIn.js create mode 100644 website/www/node_modules/lodash/_getTag.js create mode 100644 website/www/node_modules/lodash/_getValue.js create mode 100644 website/www/node_modules/lodash/_getView.js create mode 100644 website/www/node_modules/lodash/_getWrapDetails.js create mode 100644 website/www/node_modules/lodash/_hasPath.js create mode 100644 website/www/node_modules/lodash/_hasUnicode.js create mode 100644 website/www/node_modules/lodash/_hasUnicodeWord.js create mode 100644 website/www/node_modules/lodash/_hashClear.js create mode 100644 website/www/node_modules/lodash/_hashDelete.js create mode 100644 website/www/node_modules/lodash/_hashGet.js create mode 100644 website/www/node_modules/lodash/_hashHas.js create mode 100644 website/www/node_modules/lodash/_hashSet.js create mode 100644 website/www/node_modules/lodash/_initCloneArray.js create mode 100644 website/www/node_modules/lodash/_initCloneByTag.js create mode 100644 website/www/node_modules/lodash/_initCloneObject.js create mode 100644 website/www/node_modules/lodash/_insertWrapDetails.js create mode 100644 website/www/node_modules/lodash/_isFlattenable.js create mode 100644 website/www/node_modules/lodash/_isIndex.js create mode 100644 website/www/node_modules/lodash/_isIterateeCall.js create mode 100644 website/www/node_modules/lodash/_isKey.js create mode 100644 website/www/node_modules/lodash/_isKeyable.js create mode 100644 website/www/node_modules/lodash/_isLaziable.js create mode 100644 website/www/node_modules/lodash/_isMaskable.js create mode 100644 website/www/node_modules/lodash/_isMasked.js create mode 100644 website/www/node_modules/lodash/_isPrototype.js create mode 100644 website/www/node_modules/lodash/_isStrictComparable.js create mode 100644 website/www/node_modules/lodash/_iteratorToArray.js create mode 100644 website/www/node_modules/lodash/_lazyClone.js create mode 100644 website/www/node_modules/lodash/_lazyReverse.js create mode 100644 website/www/node_modules/lodash/_lazyValue.js create mode 100644 website/www/node_modules/lodash/_listCacheClear.js create mode 100644 website/www/node_modules/lodash/_listCacheDelete.js create mode 100644 website/www/node_modules/lodash/_listCacheGet.js create mode 100644 website/www/node_modules/lodash/_listCacheHas.js create mode 100644 website/www/node_modules/lodash/_listCacheSet.js create mode 100644 website/www/node_modules/lodash/_mapCacheClear.js create mode 100644 website/www/node_modules/lodash/_mapCacheDelete.js create mode 100644 website/www/node_modules/lodash/_mapCacheGet.js create mode 100644 website/www/node_modules/lodash/_mapCacheHas.js create mode 100644 website/www/node_modules/lodash/_mapCacheSet.js create mode 100644 website/www/node_modules/lodash/_mapToArray.js create mode 100644 website/www/node_modules/lodash/_matchesStrictComparable.js create mode 100644 website/www/node_modules/lodash/_memoizeCapped.js create mode 100644 website/www/node_modules/lodash/_mergeData.js create mode 100644 website/www/node_modules/lodash/_metaMap.js create mode 100644 website/www/node_modules/lodash/_nativeCreate.js create mode 100644 website/www/node_modules/lodash/_nativeKeys.js create mode 100644 website/www/node_modules/lodash/_nativeKeysIn.js create mode 100644 website/www/node_modules/lodash/_nodeUtil.js create mode 100644 website/www/node_modules/lodash/_objectToString.js create mode 100644 website/www/node_modules/lodash/_overArg.js create mode 100644 website/www/node_modules/lodash/_overRest.js create mode 100644 website/www/node_modules/lodash/_parent.js create mode 100644 website/www/node_modules/lodash/_reEscape.js create mode 100644 website/www/node_modules/lodash/_reEvaluate.js create mode 100644 website/www/node_modules/lodash/_reInterpolate.js create mode 100644 website/www/node_modules/lodash/_realNames.js create mode 100644 website/www/node_modules/lodash/_reorder.js create mode 100644 website/www/node_modules/lodash/_replaceHolders.js create mode 100644 website/www/node_modules/lodash/_root.js create mode 100644 website/www/node_modules/lodash/_safeGet.js create mode 100644 website/www/node_modules/lodash/_setCacheAdd.js create mode 100644 website/www/node_modules/lodash/_setCacheHas.js create mode 100644 website/www/node_modules/lodash/_setData.js create mode 100644 website/www/node_modules/lodash/_setToArray.js create mode 100644 website/www/node_modules/lodash/_setToPairs.js create mode 100644 website/www/node_modules/lodash/_setToString.js create mode 100644 website/www/node_modules/lodash/_setWrapToString.js create mode 100644 website/www/node_modules/lodash/_shortOut.js create mode 100644 website/www/node_modules/lodash/_shuffleSelf.js create mode 100644 website/www/node_modules/lodash/_stackClear.js create mode 100644 website/www/node_modules/lodash/_stackDelete.js create mode 100644 website/www/node_modules/lodash/_stackGet.js create mode 100644 website/www/node_modules/lodash/_stackHas.js create mode 100644 website/www/node_modules/lodash/_stackSet.js create mode 100644 website/www/node_modules/lodash/_strictIndexOf.js create mode 100644 website/www/node_modules/lodash/_strictLastIndexOf.js create mode 100644 website/www/node_modules/lodash/_stringSize.js create mode 100644 website/www/node_modules/lodash/_stringToArray.js create mode 100644 website/www/node_modules/lodash/_stringToPath.js create mode 100644 website/www/node_modules/lodash/_toKey.js create mode 100644 website/www/node_modules/lodash/_toSource.js create mode 100644 website/www/node_modules/lodash/_unescapeHtmlChar.js create mode 100644 website/www/node_modules/lodash/_unicodeSize.js create mode 100644 website/www/node_modules/lodash/_unicodeToArray.js create mode 100644 website/www/node_modules/lodash/_unicodeWords.js create mode 100644 website/www/node_modules/lodash/_updateWrapDetails.js create mode 100644 website/www/node_modules/lodash/_wrapperClone.js create mode 100644 website/www/node_modules/lodash/add.js create mode 100644 website/www/node_modules/lodash/after.js create mode 100644 website/www/node_modules/lodash/array.js create mode 100644 website/www/node_modules/lodash/ary.js create mode 100644 website/www/node_modules/lodash/assign.js create mode 100644 website/www/node_modules/lodash/assignIn.js create mode 100644 website/www/node_modules/lodash/assignInWith.js create mode 100644 website/www/node_modules/lodash/assignWith.js create mode 100644 website/www/node_modules/lodash/at.js create mode 100644 website/www/node_modules/lodash/attempt.js create mode 100644 website/www/node_modules/lodash/before.js create mode 100644 website/www/node_modules/lodash/bind.js create mode 100644 website/www/node_modules/lodash/bindAll.js create mode 100644 website/www/node_modules/lodash/bindKey.js create mode 100644 website/www/node_modules/lodash/camelCase.js create mode 100644 website/www/node_modules/lodash/capitalize.js create mode 100644 website/www/node_modules/lodash/castArray.js create mode 100644 website/www/node_modules/lodash/ceil.js create mode 100644 website/www/node_modules/lodash/chain.js create mode 100644 website/www/node_modules/lodash/chunk.js create mode 100644 website/www/node_modules/lodash/clamp.js create mode 100644 website/www/node_modules/lodash/clone.js create mode 100644 website/www/node_modules/lodash/cloneDeep.js create mode 100644 website/www/node_modules/lodash/cloneDeepWith.js create mode 100644 website/www/node_modules/lodash/cloneWith.js create mode 100644 website/www/node_modules/lodash/collection.js create mode 100644 website/www/node_modules/lodash/commit.js create mode 100644 website/www/node_modules/lodash/compact.js create mode 100644 website/www/node_modules/lodash/concat.js create mode 100644 website/www/node_modules/lodash/cond.js create mode 100644 website/www/node_modules/lodash/conforms.js create mode 100644 website/www/node_modules/lodash/conformsTo.js create mode 100644 website/www/node_modules/lodash/constant.js create mode 100644 website/www/node_modules/lodash/core.js create mode 100644 website/www/node_modules/lodash/core.min.js create mode 100644 website/www/node_modules/lodash/countBy.js create mode 100644 website/www/node_modules/lodash/create.js create mode 100644 website/www/node_modules/lodash/curry.js create mode 100644 website/www/node_modules/lodash/curryRight.js create mode 100644 website/www/node_modules/lodash/date.js create mode 100644 website/www/node_modules/lodash/debounce.js create mode 100644 website/www/node_modules/lodash/deburr.js create mode 100644 website/www/node_modules/lodash/defaultTo.js create mode 100644 website/www/node_modules/lodash/defaults.js create mode 100644 website/www/node_modules/lodash/defaultsDeep.js create mode 100644 website/www/node_modules/lodash/defer.js create mode 100644 website/www/node_modules/lodash/delay.js create mode 100644 website/www/node_modules/lodash/difference.js create mode 100644 website/www/node_modules/lodash/differenceBy.js create mode 100644 website/www/node_modules/lodash/differenceWith.js create mode 100644 website/www/node_modules/lodash/divide.js create mode 100644 website/www/node_modules/lodash/drop.js create mode 100644 website/www/node_modules/lodash/dropRight.js create mode 100644 website/www/node_modules/lodash/dropRightWhile.js create mode 100644 website/www/node_modules/lodash/dropWhile.js create mode 100644 website/www/node_modules/lodash/each.js create mode 100644 website/www/node_modules/lodash/eachRight.js create mode 100644 website/www/node_modules/lodash/endsWith.js create mode 100644 website/www/node_modules/lodash/entries.js create mode 100644 website/www/node_modules/lodash/entriesIn.js create mode 100644 website/www/node_modules/lodash/eq.js create mode 100644 website/www/node_modules/lodash/escape.js create mode 100644 website/www/node_modules/lodash/escapeRegExp.js create mode 100644 website/www/node_modules/lodash/every.js create mode 100644 website/www/node_modules/lodash/extend.js create mode 100644 website/www/node_modules/lodash/extendWith.js create mode 100644 website/www/node_modules/lodash/fill.js create mode 100644 website/www/node_modules/lodash/filter.js create mode 100644 website/www/node_modules/lodash/find.js create mode 100644 website/www/node_modules/lodash/findIndex.js create mode 100644 website/www/node_modules/lodash/findKey.js create mode 100644 website/www/node_modules/lodash/findLast.js create mode 100644 website/www/node_modules/lodash/findLastIndex.js create mode 100644 website/www/node_modules/lodash/findLastKey.js create mode 100644 website/www/node_modules/lodash/first.js create mode 100644 website/www/node_modules/lodash/flatMap.js create mode 100644 website/www/node_modules/lodash/flatMapDeep.js create mode 100644 website/www/node_modules/lodash/flatMapDepth.js create mode 100644 website/www/node_modules/lodash/flatten.js create mode 100644 website/www/node_modules/lodash/flattenDeep.js create mode 100644 website/www/node_modules/lodash/flattenDepth.js create mode 100644 website/www/node_modules/lodash/flip.js create mode 100644 website/www/node_modules/lodash/floor.js create mode 100644 website/www/node_modules/lodash/flow.js create mode 100644 website/www/node_modules/lodash/flowRight.js create mode 100644 website/www/node_modules/lodash/forEach.js create mode 100644 website/www/node_modules/lodash/forEachRight.js create mode 100644 website/www/node_modules/lodash/forIn.js create mode 100644 website/www/node_modules/lodash/forInRight.js create mode 100644 website/www/node_modules/lodash/forOwn.js create mode 100644 website/www/node_modules/lodash/forOwnRight.js create mode 100644 website/www/node_modules/lodash/fp.js create mode 100644 website/www/node_modules/lodash/fp/F.js create mode 100644 website/www/node_modules/lodash/fp/T.js create mode 100644 website/www/node_modules/lodash/fp/__.js create mode 100644 website/www/node_modules/lodash/fp/_baseConvert.js create mode 100644 website/www/node_modules/lodash/fp/_convertBrowser.js create mode 100644 website/www/node_modules/lodash/fp/_falseOptions.js create mode 100644 website/www/node_modules/lodash/fp/_mapping.js create mode 100644 website/www/node_modules/lodash/fp/_util.js create mode 100644 website/www/node_modules/lodash/fp/add.js create mode 100644 website/www/node_modules/lodash/fp/after.js create mode 100644 website/www/node_modules/lodash/fp/all.js create mode 100644 website/www/node_modules/lodash/fp/allPass.js create mode 100644 website/www/node_modules/lodash/fp/always.js create mode 100644 website/www/node_modules/lodash/fp/any.js create mode 100644 website/www/node_modules/lodash/fp/anyPass.js create mode 100644 website/www/node_modules/lodash/fp/apply.js create mode 100644 website/www/node_modules/lodash/fp/array.js create mode 100644 website/www/node_modules/lodash/fp/ary.js create mode 100644 website/www/node_modules/lodash/fp/assign.js create mode 100644 website/www/node_modules/lodash/fp/assignAll.js create mode 100644 website/www/node_modules/lodash/fp/assignAllWith.js create mode 100644 website/www/node_modules/lodash/fp/assignIn.js create mode 100644 website/www/node_modules/lodash/fp/assignInAll.js create mode 100644 website/www/node_modules/lodash/fp/assignInAllWith.js create mode 100644 website/www/node_modules/lodash/fp/assignInWith.js create mode 100644 website/www/node_modules/lodash/fp/assignWith.js create mode 100644 website/www/node_modules/lodash/fp/assoc.js create mode 100644 website/www/node_modules/lodash/fp/assocPath.js create mode 100644 website/www/node_modules/lodash/fp/at.js create mode 100644 website/www/node_modules/lodash/fp/attempt.js create mode 100644 website/www/node_modules/lodash/fp/before.js create mode 100644 website/www/node_modules/lodash/fp/bind.js create mode 100644 website/www/node_modules/lodash/fp/bindAll.js create mode 100644 website/www/node_modules/lodash/fp/bindKey.js create mode 100644 website/www/node_modules/lodash/fp/camelCase.js create mode 100644 website/www/node_modules/lodash/fp/capitalize.js create mode 100644 website/www/node_modules/lodash/fp/castArray.js create mode 100644 website/www/node_modules/lodash/fp/ceil.js create mode 100644 website/www/node_modules/lodash/fp/chain.js create mode 100644 website/www/node_modules/lodash/fp/chunk.js create mode 100644 website/www/node_modules/lodash/fp/clamp.js create mode 100644 website/www/node_modules/lodash/fp/clone.js create mode 100644 website/www/node_modules/lodash/fp/cloneDeep.js create mode 100644 website/www/node_modules/lodash/fp/cloneDeepWith.js create mode 100644 website/www/node_modules/lodash/fp/cloneWith.js create mode 100644 website/www/node_modules/lodash/fp/collection.js create mode 100644 website/www/node_modules/lodash/fp/commit.js create mode 100644 website/www/node_modules/lodash/fp/compact.js create mode 100644 website/www/node_modules/lodash/fp/complement.js create mode 100644 website/www/node_modules/lodash/fp/compose.js create mode 100644 website/www/node_modules/lodash/fp/concat.js create mode 100644 website/www/node_modules/lodash/fp/cond.js create mode 100644 website/www/node_modules/lodash/fp/conforms.js create mode 100644 website/www/node_modules/lodash/fp/conformsTo.js create mode 100644 website/www/node_modules/lodash/fp/constant.js create mode 100644 website/www/node_modules/lodash/fp/contains.js create mode 100644 website/www/node_modules/lodash/fp/convert.js create mode 100644 website/www/node_modules/lodash/fp/countBy.js create mode 100644 website/www/node_modules/lodash/fp/create.js create mode 100644 website/www/node_modules/lodash/fp/curry.js create mode 100644 website/www/node_modules/lodash/fp/curryN.js create mode 100644 website/www/node_modules/lodash/fp/curryRight.js create mode 100644 website/www/node_modules/lodash/fp/curryRightN.js create mode 100644 website/www/node_modules/lodash/fp/date.js create mode 100644 website/www/node_modules/lodash/fp/debounce.js create mode 100644 website/www/node_modules/lodash/fp/deburr.js create mode 100644 website/www/node_modules/lodash/fp/defaultTo.js create mode 100644 website/www/node_modules/lodash/fp/defaults.js create mode 100644 website/www/node_modules/lodash/fp/defaultsAll.js create mode 100644 website/www/node_modules/lodash/fp/defaultsDeep.js create mode 100644 website/www/node_modules/lodash/fp/defaultsDeepAll.js create mode 100644 website/www/node_modules/lodash/fp/defer.js create mode 100644 website/www/node_modules/lodash/fp/delay.js create mode 100644 website/www/node_modules/lodash/fp/difference.js create mode 100644 website/www/node_modules/lodash/fp/differenceBy.js create mode 100644 website/www/node_modules/lodash/fp/differenceWith.js create mode 100644 website/www/node_modules/lodash/fp/dissoc.js create mode 100644 website/www/node_modules/lodash/fp/dissocPath.js create mode 100644 website/www/node_modules/lodash/fp/divide.js create mode 100644 website/www/node_modules/lodash/fp/drop.js create mode 100644 website/www/node_modules/lodash/fp/dropLast.js create mode 100644 website/www/node_modules/lodash/fp/dropLastWhile.js create mode 100644 website/www/node_modules/lodash/fp/dropRight.js create mode 100644 website/www/node_modules/lodash/fp/dropRightWhile.js create mode 100644 website/www/node_modules/lodash/fp/dropWhile.js create mode 100644 website/www/node_modules/lodash/fp/each.js create mode 100644 website/www/node_modules/lodash/fp/eachRight.js create mode 100644 website/www/node_modules/lodash/fp/endsWith.js create mode 100644 website/www/node_modules/lodash/fp/entries.js create mode 100644 website/www/node_modules/lodash/fp/entriesIn.js create mode 100644 website/www/node_modules/lodash/fp/eq.js create mode 100644 website/www/node_modules/lodash/fp/equals.js create mode 100644 website/www/node_modules/lodash/fp/escape.js create mode 100644 website/www/node_modules/lodash/fp/escapeRegExp.js create mode 100644 website/www/node_modules/lodash/fp/every.js create mode 100644 website/www/node_modules/lodash/fp/extend.js create mode 100644 website/www/node_modules/lodash/fp/extendAll.js create mode 100644 website/www/node_modules/lodash/fp/extendAllWith.js create mode 100644 website/www/node_modules/lodash/fp/extendWith.js create mode 100644 website/www/node_modules/lodash/fp/fill.js create mode 100644 website/www/node_modules/lodash/fp/filter.js create mode 100644 website/www/node_modules/lodash/fp/find.js create mode 100644 website/www/node_modules/lodash/fp/findFrom.js create mode 100644 website/www/node_modules/lodash/fp/findIndex.js create mode 100644 website/www/node_modules/lodash/fp/findIndexFrom.js create mode 100644 website/www/node_modules/lodash/fp/findKey.js create mode 100644 website/www/node_modules/lodash/fp/findLast.js create mode 100644 website/www/node_modules/lodash/fp/findLastFrom.js create mode 100644 website/www/node_modules/lodash/fp/findLastIndex.js create mode 100644 website/www/node_modules/lodash/fp/findLastIndexFrom.js create mode 100644 website/www/node_modules/lodash/fp/findLastKey.js create mode 100644 website/www/node_modules/lodash/fp/first.js create mode 100644 website/www/node_modules/lodash/fp/flatMap.js create mode 100644 website/www/node_modules/lodash/fp/flatMapDeep.js create mode 100644 website/www/node_modules/lodash/fp/flatMapDepth.js create mode 100644 website/www/node_modules/lodash/fp/flatten.js create mode 100644 website/www/node_modules/lodash/fp/flattenDeep.js create mode 100644 website/www/node_modules/lodash/fp/flattenDepth.js create mode 100644 website/www/node_modules/lodash/fp/flip.js create mode 100644 website/www/node_modules/lodash/fp/floor.js create mode 100644 website/www/node_modules/lodash/fp/flow.js create mode 100644 website/www/node_modules/lodash/fp/flowRight.js create mode 100644 website/www/node_modules/lodash/fp/forEach.js create mode 100644 website/www/node_modules/lodash/fp/forEachRight.js create mode 100644 website/www/node_modules/lodash/fp/forIn.js create mode 100644 website/www/node_modules/lodash/fp/forInRight.js create mode 100644 website/www/node_modules/lodash/fp/forOwn.js create mode 100644 website/www/node_modules/lodash/fp/forOwnRight.js create mode 100644 website/www/node_modules/lodash/fp/fromPairs.js create mode 100644 website/www/node_modules/lodash/fp/function.js create mode 100644 website/www/node_modules/lodash/fp/functions.js create mode 100644 website/www/node_modules/lodash/fp/functionsIn.js create mode 100644 website/www/node_modules/lodash/fp/get.js create mode 100644 website/www/node_modules/lodash/fp/getOr.js create mode 100644 website/www/node_modules/lodash/fp/groupBy.js create mode 100644 website/www/node_modules/lodash/fp/gt.js create mode 100644 website/www/node_modules/lodash/fp/gte.js create mode 100644 website/www/node_modules/lodash/fp/has.js create mode 100644 website/www/node_modules/lodash/fp/hasIn.js create mode 100644 website/www/node_modules/lodash/fp/head.js create mode 100644 website/www/node_modules/lodash/fp/identical.js create mode 100644 website/www/node_modules/lodash/fp/identity.js create mode 100644 website/www/node_modules/lodash/fp/inRange.js create mode 100644 website/www/node_modules/lodash/fp/includes.js create mode 100644 website/www/node_modules/lodash/fp/includesFrom.js create mode 100644 website/www/node_modules/lodash/fp/indexBy.js create mode 100644 website/www/node_modules/lodash/fp/indexOf.js create mode 100644 website/www/node_modules/lodash/fp/indexOfFrom.js create mode 100644 website/www/node_modules/lodash/fp/init.js create mode 100644 website/www/node_modules/lodash/fp/initial.js create mode 100644 website/www/node_modules/lodash/fp/intersection.js create mode 100644 website/www/node_modules/lodash/fp/intersectionBy.js create mode 100644 website/www/node_modules/lodash/fp/intersectionWith.js create mode 100644 website/www/node_modules/lodash/fp/invert.js create mode 100644 website/www/node_modules/lodash/fp/invertBy.js create mode 100644 website/www/node_modules/lodash/fp/invertObj.js create mode 100644 website/www/node_modules/lodash/fp/invoke.js create mode 100644 website/www/node_modules/lodash/fp/invokeArgs.js create mode 100644 website/www/node_modules/lodash/fp/invokeArgsMap.js create mode 100644 website/www/node_modules/lodash/fp/invokeMap.js create mode 100644 website/www/node_modules/lodash/fp/isArguments.js create mode 100644 website/www/node_modules/lodash/fp/isArray.js create mode 100644 website/www/node_modules/lodash/fp/isArrayBuffer.js create mode 100644 website/www/node_modules/lodash/fp/isArrayLike.js create mode 100644 website/www/node_modules/lodash/fp/isArrayLikeObject.js create mode 100644 website/www/node_modules/lodash/fp/isBoolean.js create mode 100644 website/www/node_modules/lodash/fp/isBuffer.js create mode 100644 website/www/node_modules/lodash/fp/isDate.js create mode 100644 website/www/node_modules/lodash/fp/isElement.js create mode 100644 website/www/node_modules/lodash/fp/isEmpty.js create mode 100644 website/www/node_modules/lodash/fp/isEqual.js create mode 100644 website/www/node_modules/lodash/fp/isEqualWith.js create mode 100644 website/www/node_modules/lodash/fp/isError.js create mode 100644 website/www/node_modules/lodash/fp/isFinite.js create mode 100644 website/www/node_modules/lodash/fp/isFunction.js create mode 100644 website/www/node_modules/lodash/fp/isInteger.js create mode 100644 website/www/node_modules/lodash/fp/isLength.js create mode 100644 website/www/node_modules/lodash/fp/isMap.js create mode 100644 website/www/node_modules/lodash/fp/isMatch.js create mode 100644 website/www/node_modules/lodash/fp/isMatchWith.js create mode 100644 website/www/node_modules/lodash/fp/isNaN.js create mode 100644 website/www/node_modules/lodash/fp/isNative.js create mode 100644 website/www/node_modules/lodash/fp/isNil.js create mode 100644 website/www/node_modules/lodash/fp/isNull.js create mode 100644 website/www/node_modules/lodash/fp/isNumber.js create mode 100644 website/www/node_modules/lodash/fp/isObject.js create mode 100644 website/www/node_modules/lodash/fp/isObjectLike.js create mode 100644 website/www/node_modules/lodash/fp/isPlainObject.js create mode 100644 website/www/node_modules/lodash/fp/isRegExp.js create mode 100644 website/www/node_modules/lodash/fp/isSafeInteger.js create mode 100644 website/www/node_modules/lodash/fp/isSet.js create mode 100644 website/www/node_modules/lodash/fp/isString.js create mode 100644 website/www/node_modules/lodash/fp/isSymbol.js create mode 100644 website/www/node_modules/lodash/fp/isTypedArray.js create mode 100644 website/www/node_modules/lodash/fp/isUndefined.js create mode 100644 website/www/node_modules/lodash/fp/isWeakMap.js create mode 100644 website/www/node_modules/lodash/fp/isWeakSet.js create mode 100644 website/www/node_modules/lodash/fp/iteratee.js create mode 100644 website/www/node_modules/lodash/fp/join.js create mode 100644 website/www/node_modules/lodash/fp/juxt.js create mode 100644 website/www/node_modules/lodash/fp/kebabCase.js create mode 100644 website/www/node_modules/lodash/fp/keyBy.js create mode 100644 website/www/node_modules/lodash/fp/keys.js create mode 100644 website/www/node_modules/lodash/fp/keysIn.js create mode 100644 website/www/node_modules/lodash/fp/lang.js create mode 100644 website/www/node_modules/lodash/fp/last.js create mode 100644 website/www/node_modules/lodash/fp/lastIndexOf.js create mode 100644 website/www/node_modules/lodash/fp/lastIndexOfFrom.js create mode 100644 website/www/node_modules/lodash/fp/lowerCase.js create mode 100644 website/www/node_modules/lodash/fp/lowerFirst.js create mode 100644 website/www/node_modules/lodash/fp/lt.js create mode 100644 website/www/node_modules/lodash/fp/lte.js create mode 100644 website/www/node_modules/lodash/fp/map.js create mode 100644 website/www/node_modules/lodash/fp/mapKeys.js create mode 100644 website/www/node_modules/lodash/fp/mapValues.js create mode 100644 website/www/node_modules/lodash/fp/matches.js create mode 100644 website/www/node_modules/lodash/fp/matchesProperty.js create mode 100644 website/www/node_modules/lodash/fp/math.js create mode 100644 website/www/node_modules/lodash/fp/max.js create mode 100644 website/www/node_modules/lodash/fp/maxBy.js create mode 100644 website/www/node_modules/lodash/fp/mean.js create mode 100644 website/www/node_modules/lodash/fp/meanBy.js create mode 100644 website/www/node_modules/lodash/fp/memoize.js create mode 100644 website/www/node_modules/lodash/fp/merge.js create mode 100644 website/www/node_modules/lodash/fp/mergeAll.js create mode 100644 website/www/node_modules/lodash/fp/mergeAllWith.js create mode 100644 website/www/node_modules/lodash/fp/mergeWith.js create mode 100644 website/www/node_modules/lodash/fp/method.js create mode 100644 website/www/node_modules/lodash/fp/methodOf.js create mode 100644 website/www/node_modules/lodash/fp/min.js create mode 100644 website/www/node_modules/lodash/fp/minBy.js create mode 100644 website/www/node_modules/lodash/fp/mixin.js create mode 100644 website/www/node_modules/lodash/fp/multiply.js create mode 100644 website/www/node_modules/lodash/fp/nAry.js create mode 100644 website/www/node_modules/lodash/fp/negate.js create mode 100644 website/www/node_modules/lodash/fp/next.js create mode 100644 website/www/node_modules/lodash/fp/noop.js create mode 100644 website/www/node_modules/lodash/fp/now.js create mode 100644 website/www/node_modules/lodash/fp/nth.js create mode 100644 website/www/node_modules/lodash/fp/nthArg.js create mode 100644 website/www/node_modules/lodash/fp/number.js create mode 100644 website/www/node_modules/lodash/fp/object.js create mode 100644 website/www/node_modules/lodash/fp/omit.js create mode 100644 website/www/node_modules/lodash/fp/omitAll.js create mode 100644 website/www/node_modules/lodash/fp/omitBy.js create mode 100644 website/www/node_modules/lodash/fp/once.js create mode 100644 website/www/node_modules/lodash/fp/orderBy.js create mode 100644 website/www/node_modules/lodash/fp/over.js create mode 100644 website/www/node_modules/lodash/fp/overArgs.js create mode 100644 website/www/node_modules/lodash/fp/overEvery.js create mode 100644 website/www/node_modules/lodash/fp/overSome.js create mode 100644 website/www/node_modules/lodash/fp/pad.js create mode 100644 website/www/node_modules/lodash/fp/padChars.js create mode 100644 website/www/node_modules/lodash/fp/padCharsEnd.js create mode 100644 website/www/node_modules/lodash/fp/padCharsStart.js create mode 100644 website/www/node_modules/lodash/fp/padEnd.js create mode 100644 website/www/node_modules/lodash/fp/padStart.js create mode 100644 website/www/node_modules/lodash/fp/parseInt.js create mode 100644 website/www/node_modules/lodash/fp/partial.js create mode 100644 website/www/node_modules/lodash/fp/partialRight.js create mode 100644 website/www/node_modules/lodash/fp/partition.js create mode 100644 website/www/node_modules/lodash/fp/path.js create mode 100644 website/www/node_modules/lodash/fp/pathEq.js create mode 100644 website/www/node_modules/lodash/fp/pathOr.js create mode 100644 website/www/node_modules/lodash/fp/paths.js create mode 100644 website/www/node_modules/lodash/fp/pick.js create mode 100644 website/www/node_modules/lodash/fp/pickAll.js create mode 100644 website/www/node_modules/lodash/fp/pickBy.js create mode 100644 website/www/node_modules/lodash/fp/pipe.js create mode 100644 website/www/node_modules/lodash/fp/placeholder.js create mode 100644 website/www/node_modules/lodash/fp/plant.js create mode 100644 website/www/node_modules/lodash/fp/pluck.js create mode 100644 website/www/node_modules/lodash/fp/prop.js create mode 100644 website/www/node_modules/lodash/fp/propEq.js create mode 100644 website/www/node_modules/lodash/fp/propOr.js create mode 100644 website/www/node_modules/lodash/fp/property.js create mode 100644 website/www/node_modules/lodash/fp/propertyOf.js create mode 100644 website/www/node_modules/lodash/fp/props.js create mode 100644 website/www/node_modules/lodash/fp/pull.js create mode 100644 website/www/node_modules/lodash/fp/pullAll.js create mode 100644 website/www/node_modules/lodash/fp/pullAllBy.js create mode 100644 website/www/node_modules/lodash/fp/pullAllWith.js create mode 100644 website/www/node_modules/lodash/fp/pullAt.js create mode 100644 website/www/node_modules/lodash/fp/random.js create mode 100644 website/www/node_modules/lodash/fp/range.js create mode 100644 website/www/node_modules/lodash/fp/rangeRight.js create mode 100644 website/www/node_modules/lodash/fp/rangeStep.js create mode 100644 website/www/node_modules/lodash/fp/rangeStepRight.js create mode 100644 website/www/node_modules/lodash/fp/rearg.js create mode 100644 website/www/node_modules/lodash/fp/reduce.js create mode 100644 website/www/node_modules/lodash/fp/reduceRight.js create mode 100644 website/www/node_modules/lodash/fp/reject.js create mode 100644 website/www/node_modules/lodash/fp/remove.js create mode 100644 website/www/node_modules/lodash/fp/repeat.js create mode 100644 website/www/node_modules/lodash/fp/replace.js create mode 100644 website/www/node_modules/lodash/fp/rest.js create mode 100644 website/www/node_modules/lodash/fp/restFrom.js create mode 100644 website/www/node_modules/lodash/fp/result.js create mode 100644 website/www/node_modules/lodash/fp/reverse.js create mode 100644 website/www/node_modules/lodash/fp/round.js create mode 100644 website/www/node_modules/lodash/fp/sample.js create mode 100644 website/www/node_modules/lodash/fp/sampleSize.js create mode 100644 website/www/node_modules/lodash/fp/seq.js create mode 100644 website/www/node_modules/lodash/fp/set.js create mode 100644 website/www/node_modules/lodash/fp/setWith.js create mode 100644 website/www/node_modules/lodash/fp/shuffle.js create mode 100644 website/www/node_modules/lodash/fp/size.js create mode 100644 website/www/node_modules/lodash/fp/slice.js create mode 100644 website/www/node_modules/lodash/fp/snakeCase.js create mode 100644 website/www/node_modules/lodash/fp/some.js create mode 100644 website/www/node_modules/lodash/fp/sortBy.js create mode 100644 website/www/node_modules/lodash/fp/sortedIndex.js create mode 100644 website/www/node_modules/lodash/fp/sortedIndexBy.js create mode 100644 website/www/node_modules/lodash/fp/sortedIndexOf.js create mode 100644 website/www/node_modules/lodash/fp/sortedLastIndex.js create mode 100644 website/www/node_modules/lodash/fp/sortedLastIndexBy.js create mode 100644 website/www/node_modules/lodash/fp/sortedLastIndexOf.js create mode 100644 website/www/node_modules/lodash/fp/sortedUniq.js create mode 100644 website/www/node_modules/lodash/fp/sortedUniqBy.js create mode 100644 website/www/node_modules/lodash/fp/split.js create mode 100644 website/www/node_modules/lodash/fp/spread.js create mode 100644 website/www/node_modules/lodash/fp/spreadFrom.js create mode 100644 website/www/node_modules/lodash/fp/startCase.js create mode 100644 website/www/node_modules/lodash/fp/startsWith.js create mode 100644 website/www/node_modules/lodash/fp/string.js create mode 100644 website/www/node_modules/lodash/fp/stubArray.js create mode 100644 website/www/node_modules/lodash/fp/stubFalse.js create mode 100644 website/www/node_modules/lodash/fp/stubObject.js create mode 100644 website/www/node_modules/lodash/fp/stubString.js create mode 100644 website/www/node_modules/lodash/fp/stubTrue.js create mode 100644 website/www/node_modules/lodash/fp/subtract.js create mode 100644 website/www/node_modules/lodash/fp/sum.js create mode 100644 website/www/node_modules/lodash/fp/sumBy.js create mode 100644 website/www/node_modules/lodash/fp/symmetricDifference.js create mode 100644 website/www/node_modules/lodash/fp/symmetricDifferenceBy.js create mode 100644 website/www/node_modules/lodash/fp/symmetricDifferenceWith.js create mode 100644 website/www/node_modules/lodash/fp/tail.js create mode 100644 website/www/node_modules/lodash/fp/take.js create mode 100644 website/www/node_modules/lodash/fp/takeLast.js create mode 100644 website/www/node_modules/lodash/fp/takeLastWhile.js create mode 100644 website/www/node_modules/lodash/fp/takeRight.js create mode 100644 website/www/node_modules/lodash/fp/takeRightWhile.js create mode 100644 website/www/node_modules/lodash/fp/takeWhile.js create mode 100644 website/www/node_modules/lodash/fp/tap.js create mode 100644 website/www/node_modules/lodash/fp/template.js create mode 100644 website/www/node_modules/lodash/fp/templateSettings.js create mode 100644 website/www/node_modules/lodash/fp/throttle.js create mode 100644 website/www/node_modules/lodash/fp/thru.js create mode 100644 website/www/node_modules/lodash/fp/times.js create mode 100644 website/www/node_modules/lodash/fp/toArray.js create mode 100644 website/www/node_modules/lodash/fp/toFinite.js create mode 100644 website/www/node_modules/lodash/fp/toInteger.js create mode 100644 website/www/node_modules/lodash/fp/toIterator.js create mode 100644 website/www/node_modules/lodash/fp/toJSON.js create mode 100644 website/www/node_modules/lodash/fp/toLength.js create mode 100644 website/www/node_modules/lodash/fp/toLower.js create mode 100644 website/www/node_modules/lodash/fp/toNumber.js create mode 100644 website/www/node_modules/lodash/fp/toPairs.js create mode 100644 website/www/node_modules/lodash/fp/toPairsIn.js create mode 100644 website/www/node_modules/lodash/fp/toPath.js create mode 100644 website/www/node_modules/lodash/fp/toPlainObject.js create mode 100644 website/www/node_modules/lodash/fp/toSafeInteger.js create mode 100644 website/www/node_modules/lodash/fp/toString.js create mode 100644 website/www/node_modules/lodash/fp/toUpper.js create mode 100644 website/www/node_modules/lodash/fp/transform.js create mode 100644 website/www/node_modules/lodash/fp/trim.js create mode 100644 website/www/node_modules/lodash/fp/trimChars.js create mode 100644 website/www/node_modules/lodash/fp/trimCharsEnd.js create mode 100644 website/www/node_modules/lodash/fp/trimCharsStart.js create mode 100644 website/www/node_modules/lodash/fp/trimEnd.js create mode 100644 website/www/node_modules/lodash/fp/trimStart.js create mode 100644 website/www/node_modules/lodash/fp/truncate.js create mode 100644 website/www/node_modules/lodash/fp/unapply.js create mode 100644 website/www/node_modules/lodash/fp/unary.js create mode 100644 website/www/node_modules/lodash/fp/unescape.js create mode 100644 website/www/node_modules/lodash/fp/union.js create mode 100644 website/www/node_modules/lodash/fp/unionBy.js create mode 100644 website/www/node_modules/lodash/fp/unionWith.js create mode 100644 website/www/node_modules/lodash/fp/uniq.js create mode 100644 website/www/node_modules/lodash/fp/uniqBy.js create mode 100644 website/www/node_modules/lodash/fp/uniqWith.js create mode 100644 website/www/node_modules/lodash/fp/uniqueId.js create mode 100644 website/www/node_modules/lodash/fp/unnest.js create mode 100644 website/www/node_modules/lodash/fp/unset.js create mode 100644 website/www/node_modules/lodash/fp/unzip.js create mode 100644 website/www/node_modules/lodash/fp/unzipWith.js create mode 100644 website/www/node_modules/lodash/fp/update.js create mode 100644 website/www/node_modules/lodash/fp/updateWith.js create mode 100644 website/www/node_modules/lodash/fp/upperCase.js create mode 100644 website/www/node_modules/lodash/fp/upperFirst.js create mode 100644 website/www/node_modules/lodash/fp/useWith.js create mode 100644 website/www/node_modules/lodash/fp/util.js create mode 100644 website/www/node_modules/lodash/fp/value.js create mode 100644 website/www/node_modules/lodash/fp/valueOf.js create mode 100644 website/www/node_modules/lodash/fp/values.js create mode 100644 website/www/node_modules/lodash/fp/valuesIn.js create mode 100644 website/www/node_modules/lodash/fp/where.js create mode 100644 website/www/node_modules/lodash/fp/whereEq.js create mode 100644 website/www/node_modules/lodash/fp/without.js create mode 100644 website/www/node_modules/lodash/fp/words.js create mode 100644 website/www/node_modules/lodash/fp/wrap.js create mode 100644 website/www/node_modules/lodash/fp/wrapperAt.js create mode 100644 website/www/node_modules/lodash/fp/wrapperChain.js create mode 100644 website/www/node_modules/lodash/fp/wrapperLodash.js create mode 100644 website/www/node_modules/lodash/fp/wrapperReverse.js create mode 100644 website/www/node_modules/lodash/fp/wrapperValue.js create mode 100644 website/www/node_modules/lodash/fp/xor.js create mode 100644 website/www/node_modules/lodash/fp/xorBy.js create mode 100644 website/www/node_modules/lodash/fp/xorWith.js create mode 100644 website/www/node_modules/lodash/fp/zip.js create mode 100644 website/www/node_modules/lodash/fp/zipAll.js create mode 100644 website/www/node_modules/lodash/fp/zipObj.js create mode 100644 website/www/node_modules/lodash/fp/zipObject.js create mode 100644 website/www/node_modules/lodash/fp/zipObjectDeep.js create mode 100644 website/www/node_modules/lodash/fp/zipWith.js create mode 100644 website/www/node_modules/lodash/fromPairs.js create mode 100644 website/www/node_modules/lodash/function.js create mode 100644 website/www/node_modules/lodash/functions.js create mode 100644 website/www/node_modules/lodash/functionsIn.js create mode 100644 website/www/node_modules/lodash/get.js create mode 100644 website/www/node_modules/lodash/groupBy.js create mode 100644 website/www/node_modules/lodash/gt.js create mode 100644 website/www/node_modules/lodash/gte.js create mode 100644 website/www/node_modules/lodash/has.js create mode 100644 website/www/node_modules/lodash/hasIn.js create mode 100644 website/www/node_modules/lodash/head.js create mode 100644 website/www/node_modules/lodash/identity.js create mode 100644 website/www/node_modules/lodash/inRange.js create mode 100644 website/www/node_modules/lodash/includes.js create mode 100644 website/www/node_modules/lodash/index.js create mode 100644 website/www/node_modules/lodash/indexOf.js create mode 100644 website/www/node_modules/lodash/initial.js create mode 100644 website/www/node_modules/lodash/intersection.js create mode 100644 website/www/node_modules/lodash/intersectionBy.js create mode 100644 website/www/node_modules/lodash/intersectionWith.js create mode 100644 website/www/node_modules/lodash/invert.js create mode 100644 website/www/node_modules/lodash/invertBy.js create mode 100644 website/www/node_modules/lodash/invoke.js create mode 100644 website/www/node_modules/lodash/invokeMap.js create mode 100644 website/www/node_modules/lodash/isArguments.js create mode 100644 website/www/node_modules/lodash/isArray.js create mode 100644 website/www/node_modules/lodash/isArrayBuffer.js create mode 100644 website/www/node_modules/lodash/isArrayLike.js create mode 100644 website/www/node_modules/lodash/isArrayLikeObject.js create mode 100644 website/www/node_modules/lodash/isBoolean.js create mode 100644 website/www/node_modules/lodash/isBuffer.js create mode 100644 website/www/node_modules/lodash/isDate.js create mode 100644 website/www/node_modules/lodash/isElement.js create mode 100644 website/www/node_modules/lodash/isEmpty.js create mode 100644 website/www/node_modules/lodash/isEqual.js create mode 100644 website/www/node_modules/lodash/isEqualWith.js create mode 100644 website/www/node_modules/lodash/isError.js create mode 100644 website/www/node_modules/lodash/isFinite.js create mode 100644 website/www/node_modules/lodash/isFunction.js create mode 100644 website/www/node_modules/lodash/isInteger.js create mode 100644 website/www/node_modules/lodash/isLength.js create mode 100644 website/www/node_modules/lodash/isMap.js create mode 100644 website/www/node_modules/lodash/isMatch.js create mode 100644 website/www/node_modules/lodash/isMatchWith.js create mode 100644 website/www/node_modules/lodash/isNaN.js create mode 100644 website/www/node_modules/lodash/isNative.js create mode 100644 website/www/node_modules/lodash/isNil.js create mode 100644 website/www/node_modules/lodash/isNull.js create mode 100644 website/www/node_modules/lodash/isNumber.js create mode 100644 website/www/node_modules/lodash/isObject.js create mode 100644 website/www/node_modules/lodash/isObjectLike.js create mode 100644 website/www/node_modules/lodash/isPlainObject.js create mode 100644 website/www/node_modules/lodash/isRegExp.js create mode 100644 website/www/node_modules/lodash/isSafeInteger.js create mode 100644 website/www/node_modules/lodash/isSet.js create mode 100644 website/www/node_modules/lodash/isString.js create mode 100644 website/www/node_modules/lodash/isSymbol.js create mode 100644 website/www/node_modules/lodash/isTypedArray.js create mode 100644 website/www/node_modules/lodash/isUndefined.js create mode 100644 website/www/node_modules/lodash/isWeakMap.js create mode 100644 website/www/node_modules/lodash/isWeakSet.js create mode 100644 website/www/node_modules/lodash/iteratee.js create mode 100644 website/www/node_modules/lodash/join.js create mode 100644 website/www/node_modules/lodash/kebabCase.js create mode 100644 website/www/node_modules/lodash/keyBy.js create mode 100644 website/www/node_modules/lodash/keys.js create mode 100644 website/www/node_modules/lodash/keysIn.js create mode 100644 website/www/node_modules/lodash/lang.js create mode 100644 website/www/node_modules/lodash/last.js create mode 100644 website/www/node_modules/lodash/lastIndexOf.js create mode 100644 website/www/node_modules/lodash/lodash.js create mode 100644 website/www/node_modules/lodash/lodash.min.js create mode 100644 website/www/node_modules/lodash/lowerCase.js create mode 100644 website/www/node_modules/lodash/lowerFirst.js create mode 100644 website/www/node_modules/lodash/lt.js create mode 100644 website/www/node_modules/lodash/lte.js create mode 100644 website/www/node_modules/lodash/map.js create mode 100644 website/www/node_modules/lodash/mapKeys.js create mode 100644 website/www/node_modules/lodash/mapValues.js create mode 100644 website/www/node_modules/lodash/matches.js create mode 100644 website/www/node_modules/lodash/matchesProperty.js create mode 100644 website/www/node_modules/lodash/math.js create mode 100644 website/www/node_modules/lodash/max.js create mode 100644 website/www/node_modules/lodash/maxBy.js create mode 100644 website/www/node_modules/lodash/mean.js create mode 100644 website/www/node_modules/lodash/meanBy.js create mode 100644 website/www/node_modules/lodash/memoize.js create mode 100644 website/www/node_modules/lodash/merge.js create mode 100644 website/www/node_modules/lodash/mergeWith.js create mode 100644 website/www/node_modules/lodash/method.js create mode 100644 website/www/node_modules/lodash/methodOf.js create mode 100644 website/www/node_modules/lodash/min.js create mode 100644 website/www/node_modules/lodash/minBy.js create mode 100644 website/www/node_modules/lodash/mixin.js create mode 100644 website/www/node_modules/lodash/multiply.js create mode 100644 website/www/node_modules/lodash/negate.js create mode 100644 website/www/node_modules/lodash/next.js create mode 100644 website/www/node_modules/lodash/noop.js create mode 100644 website/www/node_modules/lodash/now.js create mode 100644 website/www/node_modules/lodash/nth.js create mode 100644 website/www/node_modules/lodash/nthArg.js create mode 100644 website/www/node_modules/lodash/number.js create mode 100644 website/www/node_modules/lodash/object.js create mode 100644 website/www/node_modules/lodash/omit.js create mode 100644 website/www/node_modules/lodash/omitBy.js create mode 100644 website/www/node_modules/lodash/once.js create mode 100644 website/www/node_modules/lodash/orderBy.js create mode 100644 website/www/node_modules/lodash/over.js create mode 100644 website/www/node_modules/lodash/overArgs.js create mode 100644 website/www/node_modules/lodash/overEvery.js create mode 100644 website/www/node_modules/lodash/overSome.js create mode 100644 website/www/node_modules/lodash/package.json create mode 100644 website/www/node_modules/lodash/pad.js create mode 100644 website/www/node_modules/lodash/padEnd.js create mode 100644 website/www/node_modules/lodash/padStart.js create mode 100644 website/www/node_modules/lodash/parseInt.js create mode 100644 website/www/node_modules/lodash/partial.js create mode 100644 website/www/node_modules/lodash/partialRight.js create mode 100644 website/www/node_modules/lodash/partition.js create mode 100644 website/www/node_modules/lodash/pick.js create mode 100644 website/www/node_modules/lodash/pickBy.js create mode 100644 website/www/node_modules/lodash/plant.js create mode 100644 website/www/node_modules/lodash/property.js create mode 100644 website/www/node_modules/lodash/propertyOf.js create mode 100644 website/www/node_modules/lodash/pull.js create mode 100644 website/www/node_modules/lodash/pullAll.js create mode 100644 website/www/node_modules/lodash/pullAllBy.js create mode 100644 website/www/node_modules/lodash/pullAllWith.js create mode 100644 website/www/node_modules/lodash/pullAt.js create mode 100644 website/www/node_modules/lodash/random.js create mode 100644 website/www/node_modules/lodash/range.js create mode 100644 website/www/node_modules/lodash/rangeRight.js create mode 100644 website/www/node_modules/lodash/rearg.js create mode 100644 website/www/node_modules/lodash/reduce.js create mode 100644 website/www/node_modules/lodash/reduceRight.js create mode 100644 website/www/node_modules/lodash/reject.js create mode 100644 website/www/node_modules/lodash/remove.js create mode 100644 website/www/node_modules/lodash/repeat.js create mode 100644 website/www/node_modules/lodash/replace.js create mode 100644 website/www/node_modules/lodash/rest.js create mode 100644 website/www/node_modules/lodash/result.js create mode 100644 website/www/node_modules/lodash/reverse.js create mode 100644 website/www/node_modules/lodash/round.js create mode 100644 website/www/node_modules/lodash/sample.js create mode 100644 website/www/node_modules/lodash/sampleSize.js create mode 100644 website/www/node_modules/lodash/seq.js create mode 100644 website/www/node_modules/lodash/set.js create mode 100644 website/www/node_modules/lodash/setWith.js create mode 100644 website/www/node_modules/lodash/shuffle.js create mode 100644 website/www/node_modules/lodash/size.js create mode 100644 website/www/node_modules/lodash/slice.js create mode 100644 website/www/node_modules/lodash/snakeCase.js create mode 100644 website/www/node_modules/lodash/some.js create mode 100644 website/www/node_modules/lodash/sortBy.js create mode 100644 website/www/node_modules/lodash/sortedIndex.js create mode 100644 website/www/node_modules/lodash/sortedIndexBy.js create mode 100644 website/www/node_modules/lodash/sortedIndexOf.js create mode 100644 website/www/node_modules/lodash/sortedLastIndex.js create mode 100644 website/www/node_modules/lodash/sortedLastIndexBy.js create mode 100644 website/www/node_modules/lodash/sortedLastIndexOf.js create mode 100644 website/www/node_modules/lodash/sortedUniq.js create mode 100644 website/www/node_modules/lodash/sortedUniqBy.js create mode 100644 website/www/node_modules/lodash/split.js create mode 100644 website/www/node_modules/lodash/spread.js create mode 100644 website/www/node_modules/lodash/startCase.js create mode 100644 website/www/node_modules/lodash/startsWith.js create mode 100644 website/www/node_modules/lodash/string.js create mode 100644 website/www/node_modules/lodash/stubArray.js create mode 100644 website/www/node_modules/lodash/stubFalse.js create mode 100644 website/www/node_modules/lodash/stubObject.js create mode 100644 website/www/node_modules/lodash/stubString.js create mode 100644 website/www/node_modules/lodash/stubTrue.js create mode 100644 website/www/node_modules/lodash/subtract.js create mode 100644 website/www/node_modules/lodash/sum.js create mode 100644 website/www/node_modules/lodash/sumBy.js create mode 100644 website/www/node_modules/lodash/tail.js create mode 100644 website/www/node_modules/lodash/take.js create mode 100644 website/www/node_modules/lodash/takeRight.js create mode 100644 website/www/node_modules/lodash/takeRightWhile.js create mode 100644 website/www/node_modules/lodash/takeWhile.js create mode 100644 website/www/node_modules/lodash/tap.js create mode 100644 website/www/node_modules/lodash/template.js create mode 100644 website/www/node_modules/lodash/templateSettings.js create mode 100644 website/www/node_modules/lodash/throttle.js create mode 100644 website/www/node_modules/lodash/thru.js create mode 100644 website/www/node_modules/lodash/times.js create mode 100644 website/www/node_modules/lodash/toArray.js create mode 100644 website/www/node_modules/lodash/toFinite.js create mode 100644 website/www/node_modules/lodash/toInteger.js create mode 100644 website/www/node_modules/lodash/toIterator.js create mode 100644 website/www/node_modules/lodash/toJSON.js create mode 100644 website/www/node_modules/lodash/toLength.js create mode 100644 website/www/node_modules/lodash/toLower.js create mode 100644 website/www/node_modules/lodash/toNumber.js create mode 100644 website/www/node_modules/lodash/toPairs.js create mode 100644 website/www/node_modules/lodash/toPairsIn.js create mode 100644 website/www/node_modules/lodash/toPath.js create mode 100644 website/www/node_modules/lodash/toPlainObject.js create mode 100644 website/www/node_modules/lodash/toSafeInteger.js create mode 100644 website/www/node_modules/lodash/toString.js create mode 100644 website/www/node_modules/lodash/toUpper.js create mode 100644 website/www/node_modules/lodash/transform.js create mode 100644 website/www/node_modules/lodash/trim.js create mode 100644 website/www/node_modules/lodash/trimEnd.js create mode 100644 website/www/node_modules/lodash/trimStart.js create mode 100644 website/www/node_modules/lodash/truncate.js create mode 100644 website/www/node_modules/lodash/unary.js create mode 100644 website/www/node_modules/lodash/unescape.js create mode 100644 website/www/node_modules/lodash/union.js create mode 100644 website/www/node_modules/lodash/unionBy.js create mode 100644 website/www/node_modules/lodash/unionWith.js create mode 100644 website/www/node_modules/lodash/uniq.js create mode 100644 website/www/node_modules/lodash/uniqBy.js create mode 100644 website/www/node_modules/lodash/uniqWith.js create mode 100644 website/www/node_modules/lodash/uniqueId.js create mode 100644 website/www/node_modules/lodash/unset.js create mode 100644 website/www/node_modules/lodash/unzip.js create mode 100644 website/www/node_modules/lodash/unzipWith.js create mode 100644 website/www/node_modules/lodash/update.js create mode 100644 website/www/node_modules/lodash/updateWith.js create mode 100644 website/www/node_modules/lodash/upperCase.js create mode 100644 website/www/node_modules/lodash/upperFirst.js create mode 100644 website/www/node_modules/lodash/util.js create mode 100644 website/www/node_modules/lodash/value.js create mode 100644 website/www/node_modules/lodash/valueOf.js create mode 100644 website/www/node_modules/lodash/values.js create mode 100644 website/www/node_modules/lodash/valuesIn.js create mode 100644 website/www/node_modules/lodash/without.js create mode 100644 website/www/node_modules/lodash/words.js create mode 100644 website/www/node_modules/lodash/wrap.js create mode 100644 website/www/node_modules/lodash/wrapperAt.js create mode 100644 website/www/node_modules/lodash/wrapperChain.js create mode 100644 website/www/node_modules/lodash/wrapperLodash.js create mode 100644 website/www/node_modules/lodash/wrapperReverse.js create mode 100644 website/www/node_modules/lodash/wrapperValue.js create mode 100644 website/www/node_modules/lodash/xor.js create mode 100644 website/www/node_modules/lodash/xorBy.js create mode 100644 website/www/node_modules/lodash/xorWith.js create mode 100644 website/www/node_modules/lodash/zip.js create mode 100644 website/www/node_modules/lodash/zipObject.js create mode 100644 website/www/node_modules/lodash/zipObjectDeep.js create mode 100644 website/www/node_modules/lodash/zipWith.js create mode 100644 website/www/node_modules/log-symbols/browser.js create mode 100644 website/www/node_modules/log-symbols/index.js create mode 100644 website/www/node_modules/log-symbols/license create mode 100644 website/www/node_modules/log-symbols/package.json create mode 100644 website/www/node_modules/log-symbols/readme.md create mode 100644 website/www/node_modules/merge2/LICENSE create mode 100644 website/www/node_modules/merge2/README.md create mode 100644 website/www/node_modules/merge2/index.js create mode 100644 website/www/node_modules/merge2/package.json create mode 100644 website/www/node_modules/micromatch/CHANGELOG.md create mode 100755 website/www/node_modules/micromatch/LICENSE create mode 100644 website/www/node_modules/micromatch/README.md create mode 100644 website/www/node_modules/micromatch/index.js create mode 100644 website/www/node_modules/micromatch/package.json create mode 100644 website/www/node_modules/node-releases/LICENSE create mode 100644 website/www/node_modules/node-releases/README.md create mode 100644 website/www/node_modules/node-releases/data/processed/envs.json create mode 100644 website/www/node_modules/node-releases/data/raw/iojs.json create mode 100644 website/www/node_modules/node-releases/data/raw/nodejs.json create mode 100644 website/www/node_modules/node-releases/data/release-schedule/release-schedule.json create mode 100644 website/www/node_modules/node-releases/package.json create mode 100644 website/www/node_modules/normalize-path/LICENSE create mode 100644 website/www/node_modules/normalize-path/README.md create mode 100644 website/www/node_modules/normalize-path/index.js create mode 100644 website/www/node_modules/normalize-path/package.json create mode 100644 website/www/node_modules/normalize-range/index.js create mode 100644 website/www/node_modules/normalize-range/license create mode 100644 website/www/node_modules/normalize-range/package.json create mode 100644 website/www/node_modules/normalize-range/readme.md create mode 100644 website/www/node_modules/num2fraction/.editorconfig create mode 100644 website/www/node_modules/num2fraction/.npmignore create mode 100644 website/www/node_modules/num2fraction/LICENSE create mode 100644 website/www/node_modules/num2fraction/README.md create mode 100644 website/www/node_modules/num2fraction/index.js create mode 100644 website/www/node_modules/num2fraction/package.json create mode 100644 website/www/node_modules/p-limit/index.d.ts create mode 100644 website/www/node_modules/p-limit/index.js create mode 100644 website/www/node_modules/p-limit/license create mode 100644 website/www/node_modules/p-limit/package.json create mode 100644 website/www/node_modules/p-limit/readme.md create mode 100644 website/www/node_modules/p-locate/index.d.ts create mode 100644 website/www/node_modules/p-locate/index.js create mode 100644 website/www/node_modules/p-locate/license create mode 100644 website/www/node_modules/p-locate/package.json create mode 100644 website/www/node_modules/p-locate/readme.md create mode 100644 website/www/node_modules/p-try/index.d.ts create mode 100644 website/www/node_modules/p-try/index.js create mode 100644 website/www/node_modules/p-try/license create mode 100644 website/www/node_modules/p-try/package.json create mode 100644 website/www/node_modules/p-try/readme.md create mode 100644 website/www/node_modules/parse-json/index.js create mode 100644 website/www/node_modules/parse-json/license create mode 100644 website/www/node_modules/parse-json/package.json create mode 100644 website/www/node_modules/parse-json/readme.md create mode 100644 website/www/node_modules/path-exists/index.d.ts create mode 100644 website/www/node_modules/path-exists/index.js create mode 100644 website/www/node_modules/path-exists/license create mode 100644 website/www/node_modules/path-exists/package.json create mode 100644 website/www/node_modules/path-exists/readme.md create mode 100644 website/www/node_modules/path-key/index.d.ts create mode 100644 website/www/node_modules/path-key/index.js create mode 100644 website/www/node_modules/path-key/license create mode 100644 website/www/node_modules/path-key/package.json create mode 100644 website/www/node_modules/path-key/readme.md create mode 100644 website/www/node_modules/path-type/index.d.ts create mode 100644 website/www/node_modules/path-type/index.js create mode 100644 website/www/node_modules/path-type/license create mode 100644 website/www/node_modules/path-type/package.json create mode 100644 website/www/node_modules/path-type/readme.md create mode 100755 website/www/node_modules/picomatch/CHANGELOG.md create mode 100755 website/www/node_modules/picomatch/LICENSE create mode 100755 website/www/node_modules/picomatch/README.md create mode 100755 website/www/node_modules/picomatch/index.js create mode 100755 website/www/node_modules/picomatch/lib/constants.js create mode 100755 website/www/node_modules/picomatch/lib/parse.js create mode 100755 website/www/node_modules/picomatch/lib/picomatch.js create mode 100755 website/www/node_modules/picomatch/lib/scan.js create mode 100755 website/www/node_modules/picomatch/lib/utils.js create mode 100755 website/www/node_modules/picomatch/package.json create mode 100644 website/www/node_modules/pify/index.js create mode 100644 website/www/node_modules/pify/license create mode 100644 website/www/node_modules/pify/package.json create mode 100644 website/www/node_modules/pify/readme.md create mode 100644 website/www/node_modules/pkg-up/index.js create mode 100644 website/www/node_modules/pkg-up/license create mode 100644 website/www/node_modules/pkg-up/node_modules/find-up/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/find-up/license create mode 100644 website/www/node_modules/pkg-up/node_modules/find-up/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/find-up/readme.md create mode 100644 website/www/node_modules/pkg-up/node_modules/locate-path/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/locate-path/license create mode 100644 website/www/node_modules/pkg-up/node_modules/locate-path/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/locate-path/readme.md create mode 100644 website/www/node_modules/pkg-up/node_modules/p-limit/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/p-limit/license create mode 100644 website/www/node_modules/pkg-up/node_modules/p-limit/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/p-limit/readme.md create mode 100644 website/www/node_modules/pkg-up/node_modules/p-locate/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/p-locate/license create mode 100644 website/www/node_modules/pkg-up/node_modules/p-locate/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/p-locate/readme.md create mode 100644 website/www/node_modules/pkg-up/node_modules/p-try/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/p-try/license create mode 100644 website/www/node_modules/pkg-up/node_modules/p-try/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/p-try/readme.md create mode 100644 website/www/node_modules/pkg-up/node_modules/path-exists/index.js create mode 100644 website/www/node_modules/pkg-up/node_modules/path-exists/license create mode 100644 website/www/node_modules/pkg-up/node_modules/path-exists/package.json create mode 100644 website/www/node_modules/pkg-up/node_modules/path-exists/readme.md create mode 100644 website/www/node_modules/pkg-up/package.json create mode 100644 website/www/node_modules/pkg-up/readme.md create mode 100644 website/www/node_modules/postcss-cli/CHANGELOG.md create mode 100644 website/www/node_modules/postcss-cli/LICENSE create mode 100644 website/www/node_modules/postcss-cli/README.md create mode 100644 website/www/node_modules/postcss-cli/index.js create mode 100644 website/www/node_modules/postcss-cli/lib/args.js create mode 100644 website/www/node_modules/postcss-cli/lib/depGraph.js create mode 100644 website/www/node_modules/postcss-cli/lib/getMapfile.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/index.d.ts create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/license create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/package.json create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/readme.md create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/source/index.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/source/templates.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/chalk/source/util.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/has-flag/index.d.ts create mode 100644 website/www/node_modules/postcss-cli/node_modules/has-flag/index.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/has-flag/license create mode 100644 website/www/node_modules/postcss-cli/node_modules/has-flag/package.json create mode 100644 website/www/node_modules/postcss-cli/node_modules/has-flag/readme.md create mode 100644 website/www/node_modules/postcss-cli/node_modules/supports-color/browser.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/supports-color/index.js create mode 100644 website/www/node_modules/postcss-cli/node_modules/supports-color/license create mode 100644 website/www/node_modules/postcss-cli/node_modules/supports-color/package.json create mode 100644 website/www/node_modules/postcss-cli/node_modules/supports-color/readme.md create mode 100644 website/www/node_modules/postcss-cli/package.json create mode 100644 website/www/node_modules/postcss-load-config/CHANGELOG.md create mode 100644 website/www/node_modules/postcss-load-config/LICENSE create mode 100644 website/www/node_modules/postcss-load-config/README.md create mode 100644 website/www/node_modules/postcss-load-config/package.json create mode 100644 website/www/node_modules/postcss-load-config/src/index.js create mode 100644 website/www/node_modules/postcss-load-config/src/options.js create mode 100644 website/www/node_modules/postcss-load-config/src/plugins.js create mode 100644 website/www/node_modules/postcss-reporter/CHANGELOG.md create mode 100644 website/www/node_modules/postcss-reporter/LICENSE create mode 100644 website/www/node_modules/postcss-reporter/README.md create mode 100644 website/www/node_modules/postcss-reporter/index.js create mode 100644 website/www/node_modules/postcss-reporter/lib/formatter.js create mode 100644 website/www/node_modules/postcss-reporter/lib/reporter.js create mode 100644 website/www/node_modules/postcss-reporter/lib/util.js create mode 100644 website/www/node_modules/postcss-reporter/package.json create mode 100644 website/www/node_modules/postcss-value-parser/LICENSE create mode 100644 website/www/node_modules/postcss-value-parser/README.md create mode 100644 website/www/node_modules/postcss-value-parser/lib/index.d.ts create mode 100644 website/www/node_modules/postcss-value-parser/lib/index.js create mode 100644 website/www/node_modules/postcss-value-parser/lib/parse.js create mode 100644 website/www/node_modules/postcss-value-parser/lib/stringify.js create mode 100644 website/www/node_modules/postcss-value-parser/lib/unit.js create mode 100644 website/www/node_modules/postcss-value-parser/lib/walk.js create mode 100644 website/www/node_modules/postcss-value-parser/package.json create mode 100644 website/www/node_modules/postcss/CHANGELOG.md create mode 100644 website/www/node_modules/postcss/LICENSE create mode 100644 website/www/node_modules/postcss/README.md create mode 100644 website/www/node_modules/postcss/docs/api/assets/scripts.min.js create mode 100644 website/www/node_modules/postcss/docs/api/assets/styles.min.css create mode 100644 website/www/node_modules/postcss/docs/api/index.html create mode 100644 website/www/node_modules/postcss/docs/architecture.md create mode 100644 website/www/node_modules/postcss/docs/guidelines/plugin.md create mode 100644 website/www/node_modules/postcss/docs/guidelines/runner.md create mode 100644 website/www/node_modules/postcss/docs/source-maps.md create mode 100644 website/www/node_modules/postcss/docs/syntax.md create mode 100644 website/www/node_modules/postcss/lib/at-rule.js create mode 100644 website/www/node_modules/postcss/lib/comment.js create mode 100644 website/www/node_modules/postcss/lib/container.js create mode 100644 website/www/node_modules/postcss/lib/css-syntax-error.js create mode 100644 website/www/node_modules/postcss/lib/declaration.js create mode 100644 website/www/node_modules/postcss/lib/input.js create mode 100644 website/www/node_modules/postcss/lib/lazy-result.js create mode 100644 website/www/node_modules/postcss/lib/list.js create mode 100644 website/www/node_modules/postcss/lib/map-generator.js create mode 100644 website/www/node_modules/postcss/lib/node.js create mode 100644 website/www/node_modules/postcss/lib/parse.js create mode 100644 website/www/node_modules/postcss/lib/parser.js create mode 100644 website/www/node_modules/postcss/lib/postcss.d.ts create mode 100644 website/www/node_modules/postcss/lib/postcss.js create mode 100644 website/www/node_modules/postcss/lib/previous-map.js create mode 100644 website/www/node_modules/postcss/lib/processor.js create mode 100644 website/www/node_modules/postcss/lib/result.js create mode 100644 website/www/node_modules/postcss/lib/root.js create mode 100644 website/www/node_modules/postcss/lib/rule.js create mode 100644 website/www/node_modules/postcss/lib/stringifier.js create mode 100644 website/www/node_modules/postcss/lib/stringify.js create mode 100644 website/www/node_modules/postcss/lib/terminal-highlight.js create mode 100644 website/www/node_modules/postcss/lib/tokenize.js create mode 100644 website/www/node_modules/postcss/lib/vendor.js create mode 100644 website/www/node_modules/postcss/lib/warn-once.js create mode 100644 website/www/node_modules/postcss/lib/warning.js create mode 100644 website/www/node_modules/postcss/node_modules/supports-color/browser.js create mode 100644 website/www/node_modules/postcss/node_modules/supports-color/index.js create mode 100644 website/www/node_modules/postcss/node_modules/supports-color/license create mode 100644 website/www/node_modules/postcss/node_modules/supports-color/package.json create mode 100644 website/www/node_modules/postcss/node_modules/supports-color/readme.md create mode 100644 website/www/node_modules/postcss/package.json create mode 100644 website/www/node_modules/pretty-hrtime/.jshintignore create mode 100644 website/www/node_modules/pretty-hrtime/.npmignore create mode 100644 website/www/node_modules/pretty-hrtime/LICENSE create mode 100644 website/www/node_modules/pretty-hrtime/README.md create mode 100644 website/www/node_modules/pretty-hrtime/index.js create mode 100644 website/www/node_modules/pretty-hrtime/package.json create mode 100644 website/www/node_modules/read-cache/LICENSE create mode 100644 website/www/node_modules/read-cache/README.md create mode 100644 website/www/node_modules/read-cache/index.js create mode 100644 website/www/node_modules/read-cache/package.json create mode 100644 website/www/node_modules/readdirp/LICENSE create mode 100644 website/www/node_modules/readdirp/README.md create mode 100644 website/www/node_modules/readdirp/index.d.ts create mode 100644 website/www/node_modules/readdirp/index.js create mode 100644 website/www/node_modules/readdirp/package.json create mode 100644 website/www/node_modules/require-directory/.jshintrc create mode 100644 website/www/node_modules/require-directory/.npmignore create mode 100644 website/www/node_modules/require-directory/.travis.yml create mode 100644 website/www/node_modules/require-directory/LICENSE create mode 100644 website/www/node_modules/require-directory/README.markdown create mode 100644 website/www/node_modules/require-directory/index.js create mode 100644 website/www/node_modules/require-directory/package.json create mode 100644 website/www/node_modules/require-main-filename/CHANGELOG.md create mode 100644 website/www/node_modules/require-main-filename/LICENSE.txt create mode 100644 website/www/node_modules/require-main-filename/README.md create mode 100644 website/www/node_modules/require-main-filename/index.js create mode 100644 website/www/node_modules/require-main-filename/package.json create mode 100644 website/www/node_modules/resolve-from/index.js create mode 100644 website/www/node_modules/resolve-from/license create mode 100644 website/www/node_modules/resolve-from/package.json create mode 100644 website/www/node_modules/resolve-from/readme.md create mode 100644 website/www/node_modules/reusify/.coveralls.yml create mode 100644 website/www/node_modules/reusify/.travis.yml create mode 100644 website/www/node_modules/reusify/LICENSE create mode 100644 website/www/node_modules/reusify/README.md create mode 100644 website/www/node_modules/reusify/benchmarks/createNoCodeFunction.js create mode 100644 website/www/node_modules/reusify/benchmarks/fib.js create mode 100644 website/www/node_modules/reusify/benchmarks/reuseNoCodeFunction.js create mode 100644 website/www/node_modules/reusify/package.json create mode 100644 website/www/node_modules/reusify/reusify.js create mode 100644 website/www/node_modules/reusify/test.js create mode 100644 website/www/node_modules/run-parallel/LICENSE create mode 100644 website/www/node_modules/run-parallel/README.md create mode 100644 website/www/node_modules/run-parallel/index.js create mode 100644 website/www/node_modules/run-parallel/package.json create mode 100644 website/www/node_modules/set-blocking/CHANGELOG.md create mode 100644 website/www/node_modules/set-blocking/LICENSE.txt create mode 100644 website/www/node_modules/set-blocking/README.md create mode 100644 website/www/node_modules/set-blocking/index.js create mode 100644 website/www/node_modules/set-blocking/package.json create mode 100644 website/www/node_modules/shebang-command/index.js create mode 100644 website/www/node_modules/shebang-command/license create mode 100644 website/www/node_modules/shebang-command/package.json create mode 100644 website/www/node_modules/shebang-command/readme.md create mode 100644 website/www/node_modules/shebang-regex/index.d.ts create mode 100644 website/www/node_modules/shebang-regex/index.js create mode 100644 website/www/node_modules/shebang-regex/license create mode 100644 website/www/node_modules/shebang-regex/package.json create mode 100644 website/www/node_modules/shebang-regex/readme.md create mode 100644 website/www/node_modules/slash/index.d.ts create mode 100644 website/www/node_modules/slash/index.js create mode 100644 website/www/node_modules/slash/license create mode 100644 website/www/node_modules/slash/package.json create mode 100644 website/www/node_modules/slash/readme.md create mode 100644 website/www/node_modules/source-map/CHANGELOG.md create mode 100644 website/www/node_modules/source-map/LICENSE create mode 100644 website/www/node_modules/source-map/README.md create mode 100644 website/www/node_modules/source-map/lib/array-set.js create mode 100644 website/www/node_modules/source-map/lib/base64-vlq.js create mode 100644 website/www/node_modules/source-map/lib/base64.js create mode 100644 website/www/node_modules/source-map/lib/binary-search.js create mode 100644 website/www/node_modules/source-map/lib/mapping-list.js create mode 100644 website/www/node_modules/source-map/lib/quick-sort.js create mode 100644 website/www/node_modules/source-map/lib/source-map-consumer.js create mode 100644 website/www/node_modules/source-map/lib/source-map-generator.js create mode 100644 website/www/node_modules/source-map/lib/source-node.js create mode 100644 website/www/node_modules/source-map/lib/util.js create mode 100644 website/www/node_modules/source-map/package.json create mode 100644 website/www/node_modules/source-map/source-map.d.ts create mode 100644 website/www/node_modules/source-map/source-map.js create mode 100644 website/www/node_modules/sprintf-js/.npmignore create mode 100644 website/www/node_modules/sprintf-js/LICENSE create mode 100644 website/www/node_modules/sprintf-js/README.md create mode 100644 website/www/node_modules/sprintf-js/bower.json create mode 100644 website/www/node_modules/sprintf-js/demo/angular.html create mode 100644 website/www/node_modules/sprintf-js/gruntfile.js create mode 100644 website/www/node_modules/sprintf-js/package.json create mode 100644 website/www/node_modules/sprintf-js/src/angular-sprintf.js create mode 100644 website/www/node_modules/sprintf-js/src/sprintf.js create mode 100644 website/www/node_modules/sprintf-js/test/test.js create mode 100644 website/www/node_modules/string-width/index.d.ts create mode 100644 website/www/node_modules/string-width/index.js create mode 100644 website/www/node_modules/string-width/license create mode 100644 website/www/node_modules/string-width/package.json create mode 100644 website/www/node_modules/string-width/readme.md create mode 100644 website/www/node_modules/strip-ansi/index.d.ts create mode 100644 website/www/node_modules/strip-ansi/index.js create mode 100644 website/www/node_modules/strip-ansi/license create mode 100644 website/www/node_modules/strip-ansi/package.json create mode 100644 website/www/node_modules/strip-ansi/readme.md create mode 100644 website/www/node_modules/supports-color/browser.js create mode 100644 website/www/node_modules/supports-color/index.js create mode 100644 website/www/node_modules/supports-color/license create mode 100644 website/www/node_modules/supports-color/package.json create mode 100644 website/www/node_modules/supports-color/readme.md create mode 100644 website/www/node_modules/to-regex-range/LICENSE create mode 100644 website/www/node_modules/to-regex-range/README.md create mode 100644 website/www/node_modules/to-regex-range/index.js create mode 100644 website/www/node_modules/to-regex-range/package.json create mode 100644 website/www/node_modules/universalify/LICENSE create mode 100644 website/www/node_modules/universalify/README.md create mode 100644 website/www/node_modules/universalify/index.js create mode 100644 website/www/node_modules/universalify/package.json create mode 100644 website/www/node_modules/which-module/CHANGELOG.md create mode 100644 website/www/node_modules/which-module/LICENSE create mode 100644 website/www/node_modules/which-module/README.md create mode 100644 website/www/node_modules/which-module/index.js create mode 100644 website/www/node_modules/which-module/package.json create mode 100644 website/www/node_modules/which/CHANGELOG.md create mode 100644 website/www/node_modules/which/LICENSE create mode 100644 website/www/node_modules/which/README.md create mode 100644 website/www/node_modules/which/package.json create mode 100644 website/www/node_modules/which/which.js create mode 100755 website/www/node_modules/wrap-ansi/index.js create mode 100644 website/www/node_modules/wrap-ansi/license create mode 100644 website/www/node_modules/wrap-ansi/package.json create mode 100644 website/www/node_modules/wrap-ansi/readme.md create mode 100644 website/www/node_modules/y18n/CHANGELOG.md create mode 100644 website/www/node_modules/y18n/LICENSE create mode 100644 website/www/node_modules/y18n/README.md create mode 100644 website/www/node_modules/y18n/index.js create mode 100644 website/www/node_modules/y18n/package.json create mode 100644 website/www/node_modules/yargs-parser/CHANGELOG.md create mode 100644 website/www/node_modules/yargs-parser/LICENSE.txt create mode 100644 website/www/node_modules/yargs-parser/README.md create mode 100644 website/www/node_modules/yargs-parser/index.js create mode 100644 website/www/node_modules/yargs-parser/lib/tokenize-arg-string.js create mode 100644 website/www/node_modules/yargs-parser/package.json create mode 100644 website/www/node_modules/yargs/CHANGELOG.md create mode 100644 website/www/node_modules/yargs/LICENSE create mode 100644 website/www/node_modules/yargs/README.md create mode 100644 website/www/node_modules/yargs/index.js create mode 100644 website/www/node_modules/yargs/lib/apply-extends.js create mode 100644 website/www/node_modules/yargs/lib/argsert.js create mode 100644 website/www/node_modules/yargs/lib/command.js create mode 100644 website/www/node_modules/yargs/lib/completion-templates.js create mode 100644 website/www/node_modules/yargs/lib/completion.js create mode 100644 website/www/node_modules/yargs/lib/is-promise.js create mode 100644 website/www/node_modules/yargs/lib/levenshtein.js create mode 100644 website/www/node_modules/yargs/lib/middleware.js create mode 100644 website/www/node_modules/yargs/lib/obj-filter.js create mode 100644 website/www/node_modules/yargs/lib/process-argv.js create mode 100644 website/www/node_modules/yargs/lib/usage.js create mode 100644 website/www/node_modules/yargs/lib/validation.js create mode 100644 website/www/node_modules/yargs/lib/yerror.js create mode 100644 website/www/node_modules/yargs/locales/be.json create mode 100644 website/www/node_modules/yargs/locales/de.json create mode 100644 website/www/node_modules/yargs/locales/en.json create mode 100644 website/www/node_modules/yargs/locales/es.json create mode 100644 website/www/node_modules/yargs/locales/fi.json create mode 100644 website/www/node_modules/yargs/locales/fr.json create mode 100644 website/www/node_modules/yargs/locales/hi.json create mode 100644 website/www/node_modules/yargs/locales/hu.json create mode 100644 website/www/node_modules/yargs/locales/id.json create mode 100644 website/www/node_modules/yargs/locales/it.json create mode 100644 website/www/node_modules/yargs/locales/ja.json create mode 100644 website/www/node_modules/yargs/locales/ko.json create mode 100644 website/www/node_modules/yargs/locales/nb.json create mode 100644 website/www/node_modules/yargs/locales/nl.json create mode 100644 website/www/node_modules/yargs/locales/nn.json create mode 100644 website/www/node_modules/yargs/locales/pirate.json create mode 100644 website/www/node_modules/yargs/locales/pl.json create mode 100644 website/www/node_modules/yargs/locales/pt.json create mode 100644 website/www/node_modules/yargs/locales/pt_BR.json create mode 100644 website/www/node_modules/yargs/locales/ru.json create mode 100644 website/www/node_modules/yargs/locales/th.json create mode 100644 website/www/node_modules/yargs/locales/tr.json create mode 100644 website/www/node_modules/yargs/locales/zh_CN.json create mode 100644 website/www/node_modules/yargs/locales/zh_TW.json create mode 100644 website/www/node_modules/yargs/package.json create mode 100644 website/www/node_modules/yargs/yargs.js rename website/www/site/assets/icons/{calendar-icon.svg => close-icon.svg} (65%) rename website/www/site/assets/icons/{youtube-icon.svg => edit-icon.svg} (62%) delete mode 100644 website/www/site/assets/icons/extensive-icon.svg delete mode 100644 website/www/site/assets/icons/github-icon.svg delete mode 100644 website/www/site/assets/icons/open-source-icon.svg delete mode 100644 website/www/site/assets/icons/portable-icon.svg create mode 100644 website/www/site/assets/icons/search-icon.svg delete mode 100644 website/www/site/assets/icons/twitter-icon.svg delete mode 100644 website/www/site/assets/icons/unified-icon.svg create mode 100644 website/www/site/assets/scss/_blog.scss delete mode 100644 website/www/site/assets/scss/_cards.sass rename website/www/site/assets/scss/{_table-wrapper.sass => _hero-mobile.scss} (53%) delete mode 100644 website/www/site/assets/scss/_hero.sass create mode 100644 website/www/site/assets/scss/_hero.scss create mode 100644 website/www/site/assets/scss/_keen-slider.scss create mode 100644 website/www/site/assets/scss/_lists.scss create mode 100644 website/www/site/assets/scss/_navbar-desktop.scss rename website/www/site/assets/scss/{_navbar.sass => _navbar-mobile.sass} (71%) create mode 100644 website/www/site/assets/scss/_quotes.scss create mode 100644 website/www/site/assets/scss/_search.scss create mode 100644 website/www/site/assets/scss/_table-wrapper.scss create mode 100644 website/www/site/assets/scss/_traits.scss create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_complete_game_GameStats.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_complete_game_HourlyTeamScore.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_complete_game_LeaderBoard.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_complete_game_UserScore.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_Snippets.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQueryReadFromQuery.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQueryReadFromTable.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQueryReadFromTableWithBigQueryStorageAPI.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQuerySchemaCreate.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQueryTableRowCreate.java create mode 100644 website/www/site/code_samples/examples_java_src_main_java_org_apache_beam_examples_snippets_transforms_io_gcp_bigquery_BigQueryWriteToTable.java create mode 100644 website/www/site/code_samples/examples_java_src_test_java_org_apache_beam_examples_snippets_SnippetsTest.java create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_complete_game_game_stats.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_complete_game_hourly_team_score.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_complete_game_leader_board.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_complete_game_user_score.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_snippets.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_snippets_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_snippets_test_py3.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_cogroupbykey.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_cogroupbykey_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combineglobally.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combineglobally_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combineperkey.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combineperkey_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combinevalues.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_combinevalues_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_count.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_count_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_distinct.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_distinct_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_groupby_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_groupbykey.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_groupbykey_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_groupintobatches.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_groupintobatches_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_latest.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_latest_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_max.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_max_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_mean.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_mean_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_min.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_min_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_sample.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_sample_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_sum.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_sum_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_top.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_aggregation_top_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_filter.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_filter_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_flatmap.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_flatmap_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_keys.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_keys_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_kvswap.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_kvswap_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_map.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_map_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_pardo.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_pardo_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_partition.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_partition_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_regex.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_regex_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_tostring.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_tostring_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_values.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_values_test.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_withtimestamps.py create mode 100644 website/www/site/code_samples/sdks_python_apache_beam_examples_snippets_transforms_elementwise_withtimestamps_test.py create mode 100644 website/www/site/content/en/blog/beam-2.26.0.md create mode 100644 website/www/site/content/en/blog/dataframe-api-preview-available.md create mode 100644 website/www/site/content/en/blog/splittable-do-fn-is-available.md create mode 100644 website/www/site/content/en/community/join-beam.md create mode 100644 website/www/site/content/en/documentation/dsls/dataframes/overview.md create mode 100644 website/www/site/content/en/get-started/from-spark.md delete mode 100644 website/www/site/data/en/calendar_events.yaml rename website/www/site/{i18n/home/logos/en.yaml => data/en/join_beam.yaml} (61%) delete mode 100644 website/www/site/data/en/pillars_social.yaml delete mode 100644 website/www/site/i18n/home/calendar/en.yaml delete mode 100644 website/www/site/i18n/home/pillars/en.yaml delete mode 100644 website/www/site/layouts/partials/calendar/calendar-events.html delete mode 100644 website/www/site/layouts/partials/pillars/pillars-item.html delete mode 100644 website/www/site/layouts/partials/pillars/pillars-social.html create mode 100644 website/www/site/layouts/shortcodes/community/join_beam_columns.html create mode 100644 website/www/site/resources/_gen/assets/scss/scss/main.scss_60afefe949d523e83b9759c49b47fc3a.content create mode 100644 website/www/site/resources/_gen/assets/scss/scss/main.scss_60afefe949d523e83b9759c49b47fc3a.json create mode 100644 website/www/site/static/images/arrow-expandable.svg create mode 100644 website/www/site/static/images/beam_logo_navbar_mobile.png create mode 100644 website/www/site/static/images/elipse.svg diff --git a/sdks/go/build.gradle b/sdks/go/build.gradle index fa3f9ad39803..f5d1864be2ad 100644 --- a/sdks/go/build.gradle +++ b/sdks/go/build.gradle @@ -33,7 +33,7 @@ golang { go 'build -o ./build/bin/beamctl github.com/apache/beam/sdks/go/cmd/beamctl' // Build integration test driver - go 'build -o ./build/bin/integration github.com/apache/beam/sdks/go/test/integration' + go 'build -o ./build/bin/integration/driver github.com/apache/beam/sdks/go/test/integration/driver' } // Ignore spurious vet errors during check for [BEAM-4831]. diff --git a/sdks/go/container/build.gradle b/sdks/go/container/build.gradle index 74ca6c181aee..31fcee8ba5fd 100644 --- a/sdks/go/container/build.gradle +++ b/sdks/go/container/build.gradle @@ -53,6 +53,8 @@ docker { root: project.rootProject.hasProperty(["docker-repository-root"]) ? project.rootProject["docker-repository-root"] : project.docker_image_default_repo_root) + // tags used by dockerTag task + tags containerImageTags() files "./build/" buildArgs(['pull_licenses': project.rootProject.hasProperty(["docker-pull-licenses"]) || project.rootProject.hasProperty(["isRelease"])]) diff --git a/sdks/go/pkg/beam/core/graph/coder/map_test.go b/sdks/go/pkg/beam/core/graph/coder/map_test.go index 0b825c2d5105..b3441af14126 100644 --- a/sdks/go/pkg/beam/core/graph/coder/map_test.go +++ b/sdks/go/pkg/beam/core/graph/coder/map_test.go @@ -22,15 +22,16 @@ import ( "reflect" "testing" - "github.com/apache/beam/sdks/go/pkg/beam/core/util/reflectx" "github.com/google/go-cmp/cmp" ) func TestEncodeDecodeMap(t *testing.T) { - byteEnc := containerEncoderForType(reflectx.Uint8) - byteDec := containerDecoderForType(reflectx.Uint8) - bytePtrEnc := containerEncoderForType(reflect.PtrTo(reflectx.Uint8)) - bytePtrDec := containerDecoderForType(reflect.PtrTo(reflectx.Uint8)) + byteEnc := func(v reflect.Value, w io.Writer) error { + return EncodeByte(byte(v.Uint()), w) + } + byteDec := reflectDecodeByte + bytePtrEnc := containerNilEncoder(byteEnc) + bytePtrDec := containerNilDecoder(byteDec) ptrByte := byte(42) diff --git a/sdks/go/pkg/beam/core/graph/coder/row.go b/sdks/go/pkg/beam/core/graph/coder/row.go index 714e1500c1f5..6ee1b8b25959 100644 --- a/sdks/go/pkg/beam/core/graph/coder/row.go +++ b/sdks/go/pkg/beam/core/graph/coder/row.go @@ -30,10 +30,7 @@ import ( // Returns an error if the given type is invalid or not encodable to a beam // schema row. func RowEncoderForStruct(rt reflect.Type) (func(interface{}, io.Writer) error, error) { - if err := rowTypeValidation(rt, true); err != nil { - return nil, err - } - return encoderForType(rt), nil + return (&RowEncoderBuilder{}).Build(rt) } // RowDecoderForStruct returns a decoding function that decodes the beam row encoding @@ -42,10 +39,7 @@ func RowEncoderForStruct(rt reflect.Type) (func(interface{}, io.Writer) error, e // Returns an error if the given type is invalid or not decodable from a beam // schema row. func RowDecoderForStruct(rt reflect.Type) (func(io.Reader) (interface{}, error), error) { - if err := rowTypeValidation(rt, true); err != nil { - return nil, err - } - return decoderForType(rt), nil + return (&RowDecoderBuilder{}).Build(rt) } func rowTypeValidation(rt reflect.Type, strictExportedFields bool) error { @@ -58,277 +52,6 @@ func rowTypeValidation(rt reflect.Type, strictExportedFields bool) error { return nil } -// decoderForType returns a decoder function for the struct or pointer to struct type. -func decoderForType(t reflect.Type) func(io.Reader) (interface{}, error) { - var isPtr bool - // Pointers become the value type for decomposition. - if t.Kind() == reflect.Ptr { - isPtr = true - t = t.Elem() - } - dec := decoderForStructReflect(t) - - if isPtr { - return func(r io.Reader) (interface{}, error) { - rv := reflect.New(t) - err := dec(rv.Elem(), r) - return rv.Interface(), err - } - } - return func(r io.Reader) (interface{}, error) { - rv := reflect.New(t) - err := dec(rv.Elem(), r) - return rv.Elem().Interface(), err - } -} - -// decoderForSingleTypeReflect returns a reflection based decoder function for the -// given type. -func decoderForSingleTypeReflect(t reflect.Type) func(reflect.Value, io.Reader) error { - switch t.Kind() { - case reflect.Struct: - return decoderForStructReflect(t) - case reflect.Bool: - return func(rv reflect.Value, r io.Reader) error { - v, err := DecodeBool(r) - if err != nil { - return errors.Wrap(err, "error decoding bool field") - } - rv.SetBool(v) - return nil - } - case reflect.Uint8: - return func(rv reflect.Value, r io.Reader) error { - b, err := DecodeByte(r) - if err != nil { - return errors.Wrap(err, "error decoding single byte field") - } - rv.SetUint(uint64(b)) - return nil - } - case reflect.String: - return func(rv reflect.Value, r io.Reader) error { - v, err := DecodeStringUTF8(r) - if err != nil { - return errors.Wrap(err, "error decoding string field") - } - rv.SetString(v) - return nil - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return func(rv reflect.Value, r io.Reader) error { - v, err := DecodeVarInt(r) - if err != nil { - return errors.Wrap(err, "error decoding varint field") - } - rv.SetInt(v) - return nil - } - case reflect.Float32, reflect.Float64: - return func(rv reflect.Value, r io.Reader) error { - v, err := DecodeDouble(r) - if err != nil { - return errors.Wrap(err, "error decoding double field") - } - rv.SetFloat(v) - return nil - } - case reflect.Ptr: - decf := decoderForSingleTypeReflect(t.Elem()) - return func(rv reflect.Value, r io.Reader) error { - nv := reflect.New(t.Elem()) - rv.Set(nv) - return decf(nv.Elem(), r) - } - case reflect.Slice: - // Special case handling for byte slices. - if t.Elem().Kind() == reflect.Uint8 { - return func(rv reflect.Value, r io.Reader) error { - b, err := DecodeBytes(r) - if err != nil { - return errors.Wrap(err, "error decoding []byte field") - } - rv.SetBytes(b) - return nil - } - } - decf := containerDecoderForType(t.Elem()) - return iterableDecoderForSlice(t, decf) - case reflect.Array: - decf := containerDecoderForType(t.Elem()) - return iterableDecoderForArray(t, decf) - case reflect.Map: - decK := containerDecoderForType(t.Key()) - decV := containerDecoderForType(t.Elem()) - return mapDecoder(t, decK, decV) - } - panic(fmt.Sprintf("unimplemented type to decode: %v", t)) -} - -func containerDecoderForType(t reflect.Type) func(reflect.Value, io.Reader) error { - if t.Kind() == reflect.Ptr { - return containerNilDecoder(decoderForSingleTypeReflect(t.Elem())) - } - return decoderForSingleTypeReflect(t) -} - -type typeDecoderReflect struct { - typ reflect.Type - fields []func(reflect.Value, io.Reader) error -} - -// decoderForStructReflect returns a reflection based decoder function for the -// given struct type. -func decoderForStructReflect(t reflect.Type) func(reflect.Value, io.Reader) error { - var coder typeDecoderReflect - for i := 0; i < t.NumField(); i++ { - i := i // avoid alias issues in the closures. - dec := decoderForSingleTypeReflect(t.Field(i).Type) - coder.fields = append(coder.fields, func(rv reflect.Value, r io.Reader) error { - return dec(rv.Field(i), r) - }) - } - - return func(rv reflect.Value, r io.Reader) error { - nf, nils, err := readRowHeader(rv, r) - if err != nil { - return err - } - if nf != len(coder.fields) { - return errors.Errorf("schema[%v] changed: got %d fields, want %d fields", "TODO", nf, len(coder.fields)) - } - for i, f := range coder.fields { - if isFieldNil(nils, i) { - continue - } - if err := f(rv, r); err != nil { - return err - } - } - return nil - } -} - -// isFieldNil examines the passed in packed bits nils buffer -// and returns true if the field at that index wasn't encoded -// and can be skipped in decoding. -func isFieldNil(nils []byte, f int) bool { - i, b := f/8, f%8 - return len(nils) != 0 && (nils[i]>>uint8(b))&0x1 == 1 -} - -// encoderForType returns an encoder function for the struct or pointer to struct type. -func encoderForType(t reflect.Type) func(interface{}, io.Writer) error { - var isPtr bool - // Pointers become the value type for decomposition. - if t.Kind() == reflect.Ptr { - isPtr = true - t = t.Elem() - } - enc := encoderForStructReflect(t) - - if isPtr { - return func(v interface{}, w io.Writer) error { - return enc(reflect.ValueOf(v).Elem(), w) - } - } - return func(v interface{}, w io.Writer) error { - return enc(reflect.ValueOf(v), w) - } -} - -// Generates coder using reflection for -func encoderForSingleTypeReflect(t reflect.Type) func(reflect.Value, io.Writer) error { - switch t.Kind() { - case reflect.Struct: - return encoderForStructReflect(t) - case reflect.Bool: - return func(rv reflect.Value, w io.Writer) error { - return EncodeBool(rv.Bool(), w) - } - case reflect.Uint8: - return func(rv reflect.Value, w io.Writer) error { - return EncodeByte(byte(rv.Uint()), w) - } - case reflect.String: - return func(rv reflect.Value, w io.Writer) error { - return EncodeStringUTF8(rv.String(), w) - } - case reflect.Int, reflect.Int64, reflect.Int16, reflect.Int32, reflect.Int8: - return func(rv reflect.Value, w io.Writer) error { - return EncodeVarInt(int64(rv.Int()), w) - } - case reflect.Float32, reflect.Float64: - return func(rv reflect.Value, w io.Writer) error { - return EncodeDouble(float64(rv.Float()), w) - } - case reflect.Ptr: - // Nils are handled at the struct field level. - encf := encoderForSingleTypeReflect(t.Elem()) - return func(rv reflect.Value, w io.Writer) error { - return encf(rv.Elem(), w) - } - case reflect.Slice: - // Special case handling for byte slices. - if t.Elem().Kind() == reflect.Uint8 { - return func(rv reflect.Value, w io.Writer) error { - return EncodeBytes(rv.Bytes(), w) - } - } - encf := containerEncoderForType(t.Elem()) - return iterableEncoder(t, encf) - case reflect.Array: - encf := containerEncoderForType(t.Elem()) - return iterableEncoder(t, encf) - case reflect.Map: - encK := containerEncoderForType(t.Key()) - encV := containerEncoderForType(t.Elem()) - return mapEncoder(t, encK, encV) - } - panic(fmt.Sprintf("unimplemented type to encode: %v", t)) -} - -func containerEncoderForType(t reflect.Type) func(reflect.Value, io.Writer) error { - if t.Kind() == reflect.Ptr { - return containerNilEncoder(encoderForSingleTypeReflect(t.Elem())) - } - return encoderForSingleTypeReflect(t) -} - -type typeEncoderReflect struct { - debug []string - fields []func(reflect.Value, io.Writer) error -} - -// encoderForStructReflect generates reflection field access closures for structs. -func encoderForStructReflect(t reflect.Type) func(reflect.Value, io.Writer) error { - var coder typeEncoderReflect - for i := 0; i < t.NumField(); i++ { - coder.debug = append(coder.debug, t.Field(i).Type.Name()) - coder.fields = append(coder.fields, encoderForSingleTypeReflect(t.Field(i).Type)) - } - - return func(rv reflect.Value, w io.Writer) error { - // Row/Structs are prefixed with the number of fields that are encoded in total. - if err := writeRowHeader(rv, w); err != nil { - return err - } - for i, f := range coder.fields { - rvf := rv.Field(i) - switch rvf.Kind() { - case reflect.Ptr, reflect.Map, reflect.Slice: - if rvf.IsNil() { - continue - } - } - if err := f(rvf, w); err != nil { - return errors.Wrapf(err, "encoding %v, expected: %v", rvf.Type(), coder.debug[i]) - } - } - return nil - } -} - // writeRowHeader handles the field header for row encodings. func writeRowHeader(rv reflect.Value, w io.Writer) error { // Row/Structs are prefixed with the number of fields that are encoded in total. @@ -370,11 +93,15 @@ func writeRowHeader(rv reflect.Value, w io.Writer) error { return nil } -// readRowHeader handles the field header for row decodings. +// ReadRowHeader handles the field header for row decodings. +// +// This returns the number of encoded fileds, the raw bitpacked bytes and +// any error during decoding. Each bit only needs only needs to be +// examined once during decoding using the IsFieldNil helper function. // -// This returns the raw bitpacked byte slice because we only need to -// examine each bit once, so we may as well do so inline with field checking. -func readRowHeader(rv reflect.Value, r io.Reader) (int, []byte, error) { +// If there are no nil fields encoded,the byte array will be nil, and no +// encoded fields will be nil. +func ReadRowHeader(r io.Reader) (int, []byte, error) { nf, err := DecodeVarInt(r) // is for checksum purposes (old vs new versions of a schemas) if err != nil { return 0, nil, err @@ -394,3 +121,47 @@ func readRowHeader(rv reflect.Value, r io.Reader) (int, []byte, error) { } return int(nf), nils, nil } + +// IsFieldNil examines the passed in packed bits nils buffer +// and returns true if the field at that index wasn't encoded +// and can be skipped in decoding. +func IsFieldNil(nils []byte, f int) bool { + i, b := f/8, f%8 + return len(nils) != 0 && (nils[i]>>uint8(b))&0x1 == 1 +} + +// WriteSimpleRowHeader is a convenience function to write Beam Schema Row Headers +// for values that do not have any nil fields. Writes the number of fields total +// and a 0 len byte slice to indicate no fields are nil. +func WriteSimpleRowHeader(fields int, w io.Writer) error { + if err := EncodeVarInt(int64(fields), w); err != nil { + return err + } + // Never nils, so we write the 0 byte header. + if err := EncodeVarInt(0, w); err != nil { + return fmt.Errorf("WriteSimpleRowHeader a 0 length nils bit field: %v", err) + } + return nil +} + +// ReadSimpleRowHeader is a convenience function to read Beam Schema Row Headers +// for values that do not have any nil fields. Reads and validates the number of +// fields total (returning an error for mismatches, and checks that there are +// no nils encoded as a bit field. +func ReadSimpleRowHeader(fields int, r io.Reader) error { + n, err := DecodeVarInt(r) + if err != nil { + return fmt.Errorf("ReadSimpleRowHeader field count: %v, %v", n, err) + } + if int(n) != fields { + return fmt.Errorf("ReadSimpleRowHeader field count mismatch, got %v, want %v", n, fields) + } + n, err = DecodeVarInt(r) + if err != nil { + return fmt.Errorf("ReadSimpleRowHeader reading nils count: %v, %v", n, err) + } + if n != 0 { + return fmt.Errorf("ReadSimpleRowHeader expected no nils encoded count, got %v", n) + } + return nil +} diff --git a/sdks/go/pkg/beam/core/graph/coder/row_decoder.go b/sdks/go/pkg/beam/core/graph/coder/row_decoder.go new file mode 100644 index 000000000000..c9500138cf4f --- /dev/null +++ b/sdks/go/pkg/beam/core/graph/coder/row_decoder.go @@ -0,0 +1,308 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package coder + +import ( + "fmt" + "io" + "reflect" + + "github.com/apache/beam/sdks/go/pkg/beam/internal/errors" +) + +// RowDecoderBuilder allows one to build Beam Schema row encoders for provided types. +type RowDecoderBuilder struct { + allFuncs map[reflect.Type]decoderProvider + ifaceFuncs []reflect.Type +} + +type decoderProvider = func(reflect.Type) (func(io.Reader) (interface{}, error), error) + +// Register accepts a provider to decode schema encoded values +// of that type. +// +// When decoding values, decoder functions produced by this builder will +// first check for exact type matches, then interfaces implemented by +// the type in recency order of registration, and then finally the +// default Beam Schema encoding behavior. +// +// TODO(BEAM-9615): Add final factory types. This interface is subject to change. +// Currently f must be a function func(reflect.Type) (func(io.Reader) (interface{}, error), error) +func (b *RowDecoderBuilder) Register(rt reflect.Type, f interface{}) { + fd, ok := f.(decoderProvider) + if !ok { + panic(fmt.Sprintf("%T isn't a supported decoder function type (passed with %v)", f, rt)) + } + + if rt.Kind() == reflect.Interface && rt.NumMethod() == 0 { + panic(fmt.Sprintf("interface type %v must have methods", rt)) + } + + if b.allFuncs == nil { + b.allFuncs = make(map[reflect.Type]decoderProvider) + } + b.allFuncs[rt] = fd + if rt.Kind() == reflect.Interface { + b.ifaceFuncs = append(b.ifaceFuncs, rt) + } +} + +// Build constructs a Beam Schema coder for the given type, using any providers registered for +// itself or it's fields. +func (b *RowDecoderBuilder) Build(rt reflect.Type) (func(io.Reader) (interface{}, error), error) { + if err := rowTypeValidation(rt, true); err != nil { + return nil, err + } + return b.decoderForType(rt) +} + +// decoderForType returns a decoder function for the struct or pointer to struct type. +func (b *RowDecoderBuilder) decoderForType(t reflect.Type) (func(io.Reader) (interface{}, error), error) { + // Check if there are any providers registered for this type, or that this type adheres to any interfaces. + f, err := b.customFunc(t) + if err != nil { + return nil, err + } + if f != nil { + return f, nil + } + + var isPtr bool + // Pointers become the value type for decomposition. + if t.Kind() == reflect.Ptr { + isPtr = true + t = t.Elem() + } + dec, err := b.decoderForStructReflect(t) + if err != nil { + return nil, err + } + + if isPtr { + return func(r io.Reader) (interface{}, error) { + rv := reflect.New(t) + err := dec(rv.Elem(), r) + return rv.Interface(), err + }, nil + } + return func(r io.Reader) (interface{}, error) { + rv := reflect.New(t) + err := dec(rv.Elem(), r) + return rv.Elem().Interface(), err + }, nil +} + +// decoderForStructReflect returns a reflection based decoder function for the +// given struct type. +func (b *RowDecoderBuilder) decoderForStructReflect(t reflect.Type) (func(reflect.Value, io.Reader) error, error) { + var coder typeDecoderReflect + for i := 0; i < t.NumField(); i++ { + i := i // avoid alias issues in the closures. + dec, err := b.decoderForSingleTypeReflect(t.Field(i).Type) + if err != nil { + return nil, err + } + coder.fields = append(coder.fields, func(rv reflect.Value, r io.Reader) error { + return dec(rv.Field(i), r) + }) + } + return func(rv reflect.Value, r io.Reader) error { + nf, nils, err := ReadRowHeader(r) + if err != nil { + return err + } + if nf != len(coder.fields) { + return errors.Errorf("schema[%v] changed: got %d fields, want %d fields", "TODO", nf, len(coder.fields)) + } + for i, f := range coder.fields { + if IsFieldNil(nils, i) { + continue + } + if err := f(rv, r); err != nil { + return err + } + } + return nil + }, nil +} + +func reflectDecodeBool(rv reflect.Value, r io.Reader) error { + v, err := DecodeBool(r) + if err != nil { + return errors.Wrap(err, "error decoding bool field") + } + rv.SetBool(v) + return nil +} + +func reflectDecodeByte(rv reflect.Value, r io.Reader) error { + b, err := DecodeByte(r) + if err != nil { + return errors.Wrap(err, "error decoding single byte field") + } + rv.SetUint(uint64(b)) + return nil +} + +func reflectDecodeString(rv reflect.Value, r io.Reader) error { + v, err := DecodeStringUTF8(r) + if err != nil { + return errors.Wrap(err, "error decoding string field") + } + rv.SetString(v) + return nil +} + +func reflectDecodeInt(rv reflect.Value, r io.Reader) error { + v, err := DecodeVarInt(r) + if err != nil { + return errors.Wrap(err, "error decoding varint field") + } + rv.SetInt(v) + return nil +} + +func reflectDecodeFloat(rv reflect.Value, r io.Reader) error { + v, err := DecodeDouble(r) + if err != nil { + return errors.Wrap(err, "error decoding double field") + } + rv.SetFloat(v) + return nil +} + +func reflectDecodeByteSlice(rv reflect.Value, r io.Reader) error { + b, err := DecodeBytes(r) + if err != nil { + return errors.Wrap(err, "error decoding []byte field") + } + rv.SetBytes(b) + return nil +} + +// customFunc returns nil if no custom func exists for this type. +// If an error is returned, coder construction should be aborted. +func (b *RowDecoderBuilder) customFunc(t reflect.Type) (func(io.Reader) (interface{}, error), error) { + if fact, ok := b.allFuncs[t]; ok { + f, err := fact(t) + + if err != nil { + return nil, err + } + return f, nil + } + // Check satisfaction of interface types in reverse registration order. + for i := len(b.ifaceFuncs) - 1; i >= 0; i-- { + it := b.ifaceFuncs[i] + if ok := t.AssignableTo(it); ok { + if fact, ok := b.allFuncs[it]; ok { + f, err := fact(t) + if err != nil { + return nil, err + } + return f, nil + } + } + } + return nil, nil +} + +// decoderForSingleTypeReflect returns a reflection based decoder function for the +// given type. +func (b *RowDecoderBuilder) decoderForSingleTypeReflect(t reflect.Type) (func(reflect.Value, io.Reader) error, error) { + // Check if there are any providers registered for this type, or that this type adheres to any interfaces. + dec, err := b.customFunc(t) + if err != nil { + return nil, err + } + if dec != nil { + return func(v reflect.Value, r io.Reader) error { + elm, err := dec(r) + if err != nil { + return err + } + v.Set(reflect.ValueOf(elm)) + return nil + }, nil + } + switch t.Kind() { + case reflect.Struct: + return b.decoderForStructReflect(t) + case reflect.Bool: + return reflectDecodeBool, nil + case reflect.Uint8: + return reflectDecodeByte, nil + case reflect.String: + return reflectDecodeString, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return reflectDecodeInt, nil + case reflect.Float32, reflect.Float64: + return reflectDecodeFloat, nil + case reflect.Ptr: + decf, err := b.decoderForSingleTypeReflect(t.Elem()) + if err != nil { + return nil, err + } + return func(rv reflect.Value, r io.Reader) error { + nv := reflect.New(t.Elem()) + rv.Set(nv) + return decf(nv.Elem(), r) + }, nil + case reflect.Slice: + // Special case handling for byte slices. + if t.Elem().Kind() == reflect.Uint8 { + return reflectDecodeByteSlice, nil + } + decf, err := b.containerDecoderForType(t.Elem()) + if err != nil { + return nil, err + } + return iterableDecoderForSlice(t, decf), nil + case reflect.Array: + decf, err := b.containerDecoderForType(t.Elem()) + if err != nil { + return nil, err + } + return iterableDecoderForArray(t, decf), nil + case reflect.Map: + decK, err := b.containerDecoderForType(t.Key()) + if err != nil { + return nil, err + } + decV, err := b.containerDecoderForType(t.Elem()) + if err != nil { + return nil, err + } + return mapDecoder(t, decK, decV), nil + } + panic(fmt.Sprintf("unimplemented type to decode: %v", t)) +} + +func (b *RowDecoderBuilder) containerDecoderForType(t reflect.Type) (func(reflect.Value, io.Reader) error, error) { + if t.Kind() == reflect.Ptr { + dec, err := b.decoderForSingleTypeReflect(t.Elem()) + if err != nil { + return nil, err + } + return containerNilDecoder(dec), nil + } + return b.decoderForSingleTypeReflect(t) +} + +type typeDecoderReflect struct { + typ reflect.Type + fields []func(reflect.Value, io.Reader) error +} diff --git a/sdks/go/pkg/beam/core/graph/coder/row_encoder.go b/sdks/go/pkg/beam/core/graph/coder/row_encoder.go new file mode 100644 index 000000000000..bfb872d02489 --- /dev/null +++ b/sdks/go/pkg/beam/core/graph/coder/row_encoder.go @@ -0,0 +1,271 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package coder + +import ( + "fmt" + "io" + "reflect" + + "github.com/apache/beam/sdks/go/pkg/beam/internal/errors" +) + +// RowEncoderBuilder allows one to build Beam Schema row encoders for provided types. +type RowEncoderBuilder struct { + allFuncs map[reflect.Type]encoderProvider + ifaceFuncs []reflect.Type +} + +type encoderProvider = func(reflect.Type) (func(interface{}, io.Writer) error, error) + +// Register accepts a provider for the given type to schema encode values of that type. +// +// When generating encoding functions, this builder will first check for exact type +// matches, then against interfaces with registered factories in recency order of +// registration, and then finally use the default Beam Schema encoding behavior. +// +// TODO(BEAM-9615): Add final factory types. This interface is subject to change. +// Currently f must be a function of the type func(reflect.Type) func(T, io.Writer) (error). +func (b *RowEncoderBuilder) Register(rt reflect.Type, f interface{}) { + fe, ok := f.(encoderProvider) + if !ok { + panic(fmt.Sprintf("%T isn't a supported encoder function type (passed with %v)", f, rt)) + } + + if rt.Kind() == reflect.Interface && rt.NumMethod() == 0 { + panic(fmt.Sprintf("interface type %v must have methods", rt)) + } + if b.allFuncs == nil { + b.allFuncs = make(map[reflect.Type]encoderProvider) + } + b.allFuncs[rt] = fe + if rt.Kind() == reflect.Interface { + b.ifaceFuncs = append(b.ifaceFuncs, rt) + } +} + +// Build constructs a Beam Schema coder for the given type, using any providers registered for +// itself or it's fields. +func (b *RowEncoderBuilder) Build(rt reflect.Type) (func(interface{}, io.Writer) error, error) { + if err := rowTypeValidation(rt, true); err != nil { + return nil, err + } + return b.encoderForType(rt) +} + +// customFunc returns nil if no custom func exists for this type. +// If an error is returned, coder construction should be aborted. +func (b *RowEncoderBuilder) customFunc(t reflect.Type) (func(interface{}, io.Writer) error, error) { + if fact, ok := b.allFuncs[t]; ok { + f, err := fact(t) + + if err != nil { + return nil, err + } + return f, err + } + // Check satisfaction of interface types in reverse registration order. + for i := len(b.ifaceFuncs) - 1; i >= 0; i-- { + it := b.ifaceFuncs[i] + if ok := t.AssignableTo(it); ok { + if fact, ok := b.allFuncs[it]; ok { + f, err := fact(t) + // TODO handle errors? + if err != nil { + return nil, err + } + return f, nil + } + } + } + return nil, nil +} + +// encoderForType returns an encoder function for the struct or pointer to struct type. +func (b *RowEncoderBuilder) encoderForType(t reflect.Type) (func(interface{}, io.Writer) error, error) { + // Check if there are any providers registered for this type, or that this type adheres to any interfaces. + var isPtr bool + // Pointers become the value type for decomposition. + if t.Kind() == reflect.Ptr { + // If we have something for the pointer version already, we're done. + enc, err := b.customFunc(t) + if err != nil { + return nil, err + } + if enc != nil { + return enc, nil + } + isPtr = true + t = t.Elem() + } + + { + enc, err := b.customFunc(t) + if err != nil { + return nil, err + } + if enc != nil { + if isPtr { + // We have the value version, but not a pointer version, so we jump through reflect to + // get the right type to pass in. + return func(v interface{}, w io.Writer) error { + return enc(reflect.ValueOf(v).Elem().Interface(), w) + }, nil + } + return enc, nil + } + } + + enc, err := b.encoderForStructReflect(t) + if err != nil { + return nil, err + } + + if isPtr { + return func(v interface{}, w io.Writer) error { + return enc(reflect.ValueOf(v).Elem(), w) + }, nil + } + return func(v interface{}, w io.Writer) error { + return enc(reflect.ValueOf(v), w) + }, nil +} + +// Generates coder using reflection for +func (b *RowEncoderBuilder) encoderForSingleTypeReflect(t reflect.Type) (func(reflect.Value, io.Writer) error, error) { + // Check if there are any providers registered for this type, or that this type adheres to any interfaces. + enc, err := b.customFunc(t) + if err != nil { + return nil, err + } + if enc != nil { + return func(v reflect.Value, w io.Writer) error { + return enc(v.Interface(), w) + }, nil + } + + switch t.Kind() { + case reflect.Struct: + return b.encoderForStructReflect(t) + case reflect.Bool: + return func(rv reflect.Value, w io.Writer) error { + return EncodeBool(rv.Bool(), w) + }, nil + case reflect.Uint8: + return func(rv reflect.Value, w io.Writer) error { + return EncodeByte(byte(rv.Uint()), w) + }, nil + case reflect.String: + return func(rv reflect.Value, w io.Writer) error { + return EncodeStringUTF8(rv.String(), w) + }, nil + case reflect.Int, reflect.Int64, reflect.Int16, reflect.Int32, reflect.Int8: + return func(rv reflect.Value, w io.Writer) error { + return EncodeVarInt(int64(rv.Int()), w) + }, nil + case reflect.Float32, reflect.Float64: + return func(rv reflect.Value, w io.Writer) error { + return EncodeDouble(float64(rv.Float()), w) + }, nil + case reflect.Ptr: + // Nils are handled at the struct field level. + encf, err := b.encoderForSingleTypeReflect(t.Elem()) + if err != nil { + return nil, err + } + return func(rv reflect.Value, w io.Writer) error { + return encf(rv.Elem(), w) + }, nil + case reflect.Slice: + // Special case handling for byte slices. + if t.Elem().Kind() == reflect.Uint8 { + return func(rv reflect.Value, w io.Writer) error { + return EncodeBytes(rv.Bytes(), w) + }, nil + } + encf, err := b.containerEncoderForType(t.Elem()) + if err != nil { + return nil, err + } + return iterableEncoder(t, encf), nil + case reflect.Array: + encf, err := b.containerEncoderForType(t.Elem()) + if err != nil { + return nil, err + } + return iterableEncoder(t, encf), nil + case reflect.Map: + encK, err := b.containerEncoderForType(t.Key()) + if err != nil { + return nil, err + } + encV, err := b.containerEncoderForType(t.Elem()) + if err != nil { + return nil, err + } + return mapEncoder(t, encK, encV), nil + } + panic(fmt.Sprintf("unimplemented type to encode: %v", t)) +} + +func (b *RowEncoderBuilder) containerEncoderForType(t reflect.Type) (func(reflect.Value, io.Writer) error, error) { + if t.Kind() == reflect.Ptr { + encf, err := b.encoderForSingleTypeReflect(t.Elem()) + if err != nil { + return nil, err + } + return containerNilEncoder(encf), nil + } + return b.encoderForSingleTypeReflect(t) +} + +type typeEncoderReflect struct { + debug []string + fields []func(reflect.Value, io.Writer) error +} + +// encoderForStructReflect generates reflection field access closures for structs. +func (b *RowEncoderBuilder) encoderForStructReflect(t reflect.Type) (func(reflect.Value, io.Writer) error, error) { + var coder typeEncoderReflect + for i := 0; i < t.NumField(); i++ { + coder.debug = append(coder.debug, t.Field(i).Type.Name()) + enc, err := b.encoderForSingleTypeReflect(t.Field(i).Type) + if err != nil { + return nil, err + } + coder.fields = append(coder.fields, enc) + } + + return func(rv reflect.Value, w io.Writer) error { + // Row/Structs are prefixed with the number of fields that are encoded in total. + if err := writeRowHeader(rv, w); err != nil { + return err + } + for i, f := range coder.fields { + rvf := rv.Field(i) + switch rvf.Kind() { + case reflect.Ptr, reflect.Map, reflect.Slice: + if rvf.IsNil() { + continue + } + } + if err := f(rvf, w); err != nil { + return errors.Wrapf(err, "encoding %v, expected: %v", rvf.Type(), coder.debug[i]) + } + } + return nil + }, nil +} diff --git a/sdks/go/pkg/beam/core/graph/coder/row_test.go b/sdks/go/pkg/beam/core/graph/coder/row_test.go index 38b7c5dfb1f9..9a5b9002d2c8 100644 --- a/sdks/go/pkg/beam/core/graph/coder/row_test.go +++ b/sdks/go/pkg/beam/core/graph/coder/row_test.go @@ -18,9 +18,11 @@ package coder import ( "bytes" "fmt" + "io" "reflect" "testing" + "github.com/apache/beam/sdks/go/pkg/beam/core/util/jsonx" "github.com/google/go-cmp/cmp" ) @@ -28,113 +30,123 @@ func TestReflectionRowCoderGeneration(t *testing.T) { num := 35 tests := []struct { want interface{} - }{{ - // Top level value check - want: UserType1{ - A: "cats", - B: 24, - C: "pjamas", - }, - }, { - // Top level pointer check - want: &UserType1{ - A: "marmalade", - B: 24, - C: "jam", - }, - }, { - // Inner pointer check. - want: UserType2{ - A: "dogs", - B: &UserType1{ + }{ + { + // Top level value check + want: UserType1{ A: "cats", B: 24, C: "pjamas", }, - C: &num, - }, - }, { - // nil pointer check. - want: UserType2{ - A: "dogs", - B: nil, - C: nil, - }, - }, { - // All zeroes - want: struct { - V00 bool - V01 byte // unsupported by spec (same as uint8) - V02 uint8 // unsupported by spec - V03 int16 - // V04 uint16 // unsupported by spec - V05 int32 - // V06 uint32 // unsupported by spec - V07 int64 - // V08 uint64 // unsupported by spec - V09 int - V10 struct{} - V11 *struct{} - V12 [0]int - V13 [2]int - V14 []int - V15 map[string]int - V16 float32 - V17 float64 - V18 []byte - V19 [2]*int - V20 map[*string]*int - }{}, - }, { - want: struct { - V00 bool - V01 byte // unsupported by spec (same as uint8) - V02 uint8 // unsupported by spec - V03 int16 - // V04 uint16 // unsupported by spec - V05 int32 - // V06 uint32 // unsupported by spec - V07 int64 - // V08 uint64 // unsupported by spec - V09 int - V10 struct{} - V11 *struct{} - V12 [0]int - V13 [2]int - V14 []int - V15 map[string]int - V16 float32 - V17 float64 - V18 []byte - V19 [2]*int - V20 map[string]*int - V21 []*int - }{ - V00: true, - V01: 1, - V02: 2, - V03: 3, - V05: 5, - V07: 7, - V09: 9, - V10: struct{}{}, - V11: &struct{}{}, - V12: [0]int{}, - V13: [2]int{72, 908}, - V14: []int{12, 9326, 641346, 6}, - V15: map[string]int{"pants": 42}, - V16: 3.14169, - V17: 2.6e100, - V18: []byte{21, 17, 65, 255, 0, 16}, - V19: [2]*int{nil, &num}, - V20: map[string]*int{ - "notnil": &num, - "nil": nil, - }, - V21: []*int{nil, &num, nil}, + }, { + // Top level pointer check + want: &UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + }, { + // Inner pointer check. + want: UserType2{ + A: "dogs", + B: &UserType1{ + A: "cats", + B: 24, + C: "pjamas", + }, + C: &num, + }, + }, { + // nil pointer check. + want: UserType2{ + A: "dogs", + B: nil, + C: nil, + }, + }, { + // nested struct check + want: UserType3{ + A: UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + }, + }, { + // All zeroes + want: struct { + V00 bool + V01 byte // unsupported by spec (same as uint8) + V02 uint8 // unsupported by spec + V03 int16 + // V04 uint16 // unsupported by spec + V05 int32 + // V06 uint32 // unsupported by spec + V07 int64 + // V08 uint64 // unsupported by spec + V09 int + V10 struct{} + V11 *struct{} + V12 [0]int + V13 [2]int + V14 []int + V15 map[string]int + V16 float32 + V17 float64 + V18 []byte + V19 [2]*int + V20 map[*string]*int + }{}, + }, { + want: struct { + V00 bool + V01 byte // unsupported by spec (same as uint8) + V02 uint8 // unsupported by spec + V03 int16 + // V04 uint16 // unsupported by spec + V05 int32 + // V06 uint32 // unsupported by spec + V07 int64 + // V08 uint64 // unsupported by spec + V09 int + V10 struct{} + V11 *struct{} + V12 [0]int + V13 [2]int + V14 []int + V15 map[string]int + V16 float32 + V17 float64 + V18 []byte + V19 [2]*int + V20 map[string]*int + V21 []*int + }{ + V00: true, + V01: 1, + V02: 2, + V03: 3, + V05: 5, + V07: 7, + V09: 9, + V10: struct{}{}, + V11: &struct{}{}, + V12: [0]int{}, + V13: [2]int{72, 908}, + V14: []int{12, 9326, 641346, 6}, + V15: map[string]int{"pants": 42}, + V16: 3.14169, + V17: 2.6e100, + V18: []byte{21, 17, 65, 255, 0, 16}, + V19: [2]*int{nil, &num}, + V20: map[string]*int{ + "notnil": &num, + "nil": nil, + }, + V21: []*int{nil, &num, nil}, + }, + // TODO add custom types such as protocol buffers. }, - // TODO add custom types such as protocol buffers. - }, } for _, test := range tests { t.Run(fmt.Sprintf("%+v", test.want), func(t *testing.T) { @@ -162,7 +174,6 @@ func TestReflectionRowCoderGeneration(t *testing.T) { } }) } - } type UserType1 struct { @@ -176,3 +187,274 @@ type UserType2 struct { B *UserType1 C *int } + +type UserType3 struct { + A UserType1 +} + +func ut1Enc(val interface{}, w io.Writer) error { + if err := WriteSimpleRowHeader(3, w); err != nil { + return err + } + elm := val.(UserType1) + if err := EncodeStringUTF8(elm.A, w); err != nil { + return err + } + if err := EncodeVarInt(int64(elm.B), w); err != nil { + return err + } + if err := EncodeStringUTF8(elm.C, w); err != nil { + return err + } + return nil +} + +func ut1Dec(r io.Reader) (interface{}, error) { + if err := ReadSimpleRowHeader(3, r); err != nil { + return nil, err + } + a, err := DecodeStringUTF8(r) + if err != nil { + return nil, fmt.Errorf("decoding string field A: %v", err) + } + b, err := DecodeVarInt(r) + if err != nil { + return nil, fmt.Errorf("decoding int field B: %v", err) + } + c, err := DecodeStringUTF8(r) + if err != nil { + return nil, fmt.Errorf("decoding string field C: %v, %v", c, err) + } + return UserType1{ + A: a, + B: int(b), + C: c, + }, nil +} + +func TestRowCoder_CustomCoder(t *testing.T) { + customRT := reflect.TypeOf(UserType1{}) + customEnc := ut1Enc + customDec := ut1Dec + + num := 35 + tests := []struct { + want interface{} + }{ + { + // Top level value check + want: UserType1{ + A: "cats", + B: 24, + C: "pjamas", + }, + }, { + // Top level pointer check + want: &UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + }, { + // Inner pointer check. + want: UserType2{ + A: "dogs", + B: &UserType1{ + A: "cats", + B: 24, + C: "pjamas", + }, + C: &num, + }, + }, { + // nil pointer check. + want: UserType2{ + A: "dogs", + B: nil, + C: nil, + }, + }, { + // nested struct check + want: UserType3{ + A: UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + }, + }, + } + for _, test := range tests { + t.Run(fmt.Sprintf("%+v", test.want), func(t *testing.T) { + rt := reflect.TypeOf(test.want) + var encB RowEncoderBuilder + encB.Register(customRT, func(reflect.Type) (func(interface{}, io.Writer) error, error) { return customEnc, nil }) + enc, err := encB.Build(rt) + if err != nil { + t.Fatalf("RowEncoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + var decB RowDecoderBuilder + decB.Register(customRT, func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return customDec, nil }) + dec, err := decB.Build(rt) + if err != nil { + t.Fatalf("RowDecoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + var buf bytes.Buffer + if err := enc(test.want, &buf); err != nil { + t.Fatalf("enc(%v) = err, want nil error", err) + } + _, err = dec(&buf) + if err != nil { + t.Fatalf("BuildDecoder(%v) = %v, want nil error", rt, err) + } + }) + } +} + +func BenchmarkRowCoder_RoundTrip(b *testing.B) { + + num := 35 + benches := []struct { + want interface{} + customRT reflect.Type + customEnc func(interface{}, io.Writer) error + customDec func(io.Reader) (interface{}, error) + }{ + { + // Top level value check + want: UserType1{ + A: "cats", + B: 24, + C: "pjamas", + }, + customRT: reflect.TypeOf(UserType1{}), + customEnc: ut1Enc, + customDec: ut1Dec, + }, { + // Top level pointer check + want: &UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + customRT: reflect.TypeOf(UserType1{}), + customEnc: ut1Enc, + customDec: ut1Dec, + }, { + // Inner pointer check. + want: UserType2{ + A: "dogs", + B: &UserType1{ + A: "cats", + B: 24, + C: "pjamas", + }, + C: &num, + }, + customRT: reflect.TypeOf(UserType1{}), + customEnc: ut1Enc, + customDec: ut1Dec, + }, { + // nil pointer check. + want: UserType2{ + A: "dogs", + B: nil, + C: nil, + }, + customRT: reflect.TypeOf(UserType1{}), + customEnc: ut1Enc, + customDec: ut1Dec, + }, { + // nested struct check + want: UserType3{ + A: UserType1{ + A: "marmalade", + B: 24, + C: "jam", + }, + }, + customRT: reflect.TypeOf(UserType1{}), + customEnc: ut1Enc, + customDec: ut1Dec, + }, + } + for _, bench := range benches { + rt := reflect.TypeOf(bench.want) + { + enc, err := RowEncoderForStruct(rt) + if err != nil { + b.Fatalf("BuildEncoder(%v) = %v, want nil error", rt, err) + } + dec, err := RowDecoderForStruct(rt) + if err != nil { + b.Fatalf("BuildDecoder(%v) = %v, want nil error", rt, err) + } + var buf bytes.Buffer + b.Run(fmt.Sprintf("SCHEMA %+v", bench.want), func(b *testing.B) { + for i := 0; i < b.N; i++ { + if err := enc(bench.want, &buf); err != nil { + b.Fatalf("enc(%v) = err, want nil error", err) + } + _, err := dec(&buf) + if err != nil { + b.Fatalf("BuildDecoder(%v) = %v, want nil error", rt, err) + } + } + }) + } + if bench.customEnc != nil && bench.customDec != nil && rt == bench.customRT { + var buf bytes.Buffer + b.Run(fmt.Sprintf("CUSTOM %+v", bench.want), func(b *testing.B) { + for i := 0; i < b.N; i++ { + if err := bench.customEnc(bench.want, &buf); err != nil { + b.Fatalf("enc(%v) = err, want nil error", err) + } + _, err := bench.customDec(&buf) + if err != nil { + b.Fatalf("BuildDecoder(%v) = %v, want nil error", rt, err) + } + } + }) + } + if bench.customEnc != nil && bench.customDec != nil { + var encB RowEncoderBuilder + encB.Register(bench.customRT, func(reflect.Type) (func(interface{}, io.Writer) error, error) { return bench.customEnc, nil }) + enc, err := encB.Build(rt) + if err != nil { + b.Fatalf("RowEncoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + var decB RowDecoderBuilder + decB.Register(bench.customRT, func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return bench.customDec, nil }) + dec, err := decB.Build(rt) + if err != nil { + b.Fatalf("RowDecoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + var buf bytes.Buffer + b.Run(fmt.Sprintf("REGISTERED %+v", bench.want), func(b *testing.B) { + for i := 0; i < b.N; i++ { + if err := enc(bench.want, &buf); err != nil { + b.Fatalf("enc(%v) = err, want nil error", err) + } + _, err := dec(&buf) + if err != nil { + b.Fatalf("BuildDecoder(%v) = %v, want nil error", rt, err) + } + } + }) + } + { + b.Run(fmt.Sprintf("JSON %+v", bench.want), func(b *testing.B) { + for i := 0; i < b.N; i++ { + data, err := jsonx.Marshal(bench.want) + if err != nil { + b.Fatalf("jsonx.Marshal(%v) = err, want nil error", err) + } + val := reflect.New(rt) + if err := jsonx.Unmarshal(val.Interface(), data); err != nil { + b.Fatalf("jsonx.Unmarshal(%v) = %v, want nil error; type: %v", rt, err, val.Type()) + } + } + }) + } + } +} diff --git a/sdks/go/pkg/beam/core/graph/coder/testutil/testutil.go b/sdks/go/pkg/beam/core/graph/coder/testutil/testutil.go new file mode 100644 index 000000000000..3942be5f0a15 --- /dev/null +++ b/sdks/go/pkg/beam/core/graph/coder/testutil/testutil.go @@ -0,0 +1,154 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package testutil contains helpers to test and validate custom Beam Schema coders. +package testutil + +import ( + "bytes" + "fmt" + "reflect" + "testing" + + "github.com/apache/beam/sdks/go/pkg/beam/core/graph/coder" + "github.com/google/go-cmp/cmp" +) + +// SchemaCoder helps validate custom schema coders. +type SchemaCoder struct { + encBldUT, encBldSchema coder.RowEncoderBuilder + decBldUT, decBldSchema coder.RowDecoderBuilder + + // CmpOptions to pass into the round trip comparison + CmpOptions cmp.Options +} + +// Register adds additional custom types not under test to both the under test +// and default schema coders. +func (v *SchemaCoder) Register(rt reflect.Type, encF, decF interface{}) { + v.encBldUT.Register(rt, encF) + v.encBldSchema.Register(rt, encF) + v.decBldUT.Register(rt, decF) + v.decBldSchema.Register(rt, decF) +} + +// T is an interface to facilitate testing the tester. The methods need +// to match the one's we're using of *testing.T. +type T interface { + Helper() + Run(string, func(*testing.T)) bool + Errorf(string, ...interface{}) + Failed() bool + FailNow() +} + +// Validate is a test utility to validate custom schema coders generate +// beam schema encoded bytes. +// +// Validate accepts the reflect.Type to register, factory functions for +// encoding and decoding, an anonymous struct type equivalent to the encoded +// format produced and consumed by the factory produced functions and test +// values. Test values must be either a struct, pointer to struct, or a slice +// where each element is a struct or pointer to struct. +// +// TODO(lostluck): Improve documentation. +// TODO(lostluck): Abstract into a configurable struct, to handle +// +// Validate will register the under test factories and generate an encoder and +// decoder function. These functions will be re-used for all test values. This +// emulates coders being re-used for all elements within a bundle. +// +// Validate mutates the SchemaCoderValidator, so the SchemaCoderValidator may not be used more than once. +func (v *SchemaCoder) Validate(t T, rt reflect.Type, encF, decF, schema interface{}, values interface{}) { + t.Helper() + testValues := reflect.ValueOf(values) + // Check whether we have a slice type or not. + if testValues.Type().Kind() != reflect.Slice { + vs := reflect.MakeSlice(reflect.SliceOf(testValues.Type()), 0, 1) + testValues = reflect.Append(vs, testValues) + } + if testValues.Len() == 0 { + t.Errorf("No test values provided for ValidateSchemaCoder(%v)", rt) + } + // We now have non empty slice of test values! + + v.encBldUT.Register(rt, encF) + v.decBldUT.Register(rt, decF) + + testRt := testValues.Type().Elem() + encUT, err := v.encBldUT.Build(testRt) + if err != nil { + t.Errorf("Unable to build encoder function with given factory: coder.RowEncoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + decUT, err := v.decBldUT.Build(testRt) + if err != nil { + t.Errorf("Unable to build decoder function with given factory: coder.RowDecoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + + schemaRt := reflect.TypeOf(schema) + encSchema, err := v.encBldSchema.Build(schemaRt) + if err != nil { + t.Errorf("Unable to build encoder function for schema equivalent type: coder.RowEncoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + decSchema, err := v.decBldSchema.Build(schemaRt) + if err != nil { + t.Errorf("Unable to build decoder function for schema equivalent type: coder.RowDecoderBuilder.Build(%v) = %v, want nil error", rt, err) + } + // We use error messages instead of fatals to allow all the cases to be + // checked. None of the coder functions are used until the per value runs + // so a user can get additional information per run. + if t.Failed() { + t.FailNow() + } + for i := 0; i < testValues.Len(); i++ { + t.Run(fmt.Sprintf("%v[%d]", rt, i), func(t *testing.T) { + var buf bytes.Buffer + want := testValues.Index(i).Interface() + if err := encUT(want, &buf); err != nil { + t.Fatalf("error calling Under Test encoder[%v](%v) = %v", testRt, want, err) + } + initialBytes := clone(buf.Bytes()) + + bufSchema := bytes.NewBuffer(clone(initialBytes)) + + schemaV, err := decSchema(bufSchema) + if err != nil { + t.Fatalf("error calling Equivalent Schema decoder[%v]() = %v", schemaRt, err) + } + err = encSchema(schemaV, bufSchema) + if err != nil { + t.Fatalf("error calling Equivalent Schema encoder[%v](%v) = %v, want nil error", schemaRt, schemaV, err) + } + roundTripBytes := clone(bufSchema.Bytes()) + + if d := cmp.Diff(initialBytes, roundTripBytes); d != "" { + t.Errorf("round trip through equivalent schema type didn't produce equivalent byte slices (-initial,+roundTrip): \n%v", d) + } + got, err := decUT(bufSchema) + if err != nil { + t.Fatalf("Under Test decoder(%v) = %v, want nil error", rt, err) + } + if d := cmp.Diff(want, got, v.CmpOptions); d != "" { + t.Fatalf("round trip through custom coder produced diff: (-want, +got):\n%v", d) + } + }) + } +} + +func clone(b []byte) []byte { + c := make([]byte, len(b)) + copy(c, b) + return c +} diff --git a/sdks/go/pkg/beam/core/graph/coder/testutil/testutil_test.go b/sdks/go/pkg/beam/core/graph/coder/testutil/testutil_test.go new file mode 100644 index 000000000000..7305e7ac51b2 --- /dev/null +++ b/sdks/go/pkg/beam/core/graph/coder/testutil/testutil_test.go @@ -0,0 +1,201 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package testutil + +import ( + "fmt" + "io" + "reflect" + "strings" + "testing" + + "github.com/apache/beam/sdks/go/pkg/beam/core/graph/coder" +) + +type UserInterface interface { + mark() +} + +type UserType1 struct { + A string + B int + C string +} + +func (UserType1) mark() {} + +func ut1EncDropB(val interface{}, w io.Writer) error { + if err := coder.WriteSimpleRowHeader(2, w); err != nil { + return err + } + elm := val.(UserType1) + if err := coder.EncodeStringUTF8(elm.A, w); err != nil { + return err + } + if err := coder.EncodeStringUTF8(elm.C, w); err != nil { + return err + } + return nil +} + +func ut1DecDropB(r io.Reader) (interface{}, error) { + if err := coder.ReadSimpleRowHeader(2, r); err != nil { + return nil, err + } + a, err := coder.DecodeStringUTF8(r) + if err != nil { + return nil, fmt.Errorf("decoding string field A: %v", err) + } + c, err := coder.DecodeStringUTF8(r) + if err != nil { + return nil, fmt.Errorf("decoding string field C: %v, %v", c, err) + } + return UserType1{ + A: a, + B: 42, + C: c, + }, nil +} + +type UserType2 struct { + A UserType1 +} + +func TestValidateCoder(t *testing.T) { + // Validates a custom UserType1 encoding, which drops encoding the "B" field, + // always setting it to a constant value. + t.Run("SingleValue", func(t *testing.T) { + (&SchemaCoder{}).Validate(t, reflect.TypeOf((*UserType1)(nil)).Elem(), + func(reflect.Type) (func(interface{}, io.Writer) error, error) { return ut1EncDropB, nil }, + func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return ut1DecDropB, nil }, + struct{ A, C string }{}, + UserType1{ + A: "cats", + B: 42, + C: "pjamas", + }, + ) + }) + t.Run("SliceOfValues", func(t *testing.T) { + (&SchemaCoder{}).Validate(t, reflect.TypeOf((*UserType1)(nil)).Elem(), + func(reflect.Type) (func(interface{}, io.Writer) error, error) { return ut1EncDropB, nil }, + func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return ut1DecDropB, nil }, + struct{ A, C string }{}, + []UserType1{ + { + A: "cats", + B: 42, + C: "pjamas", + }, { + A: "dogs", + B: 42, + C: "breakfast", + }, { + A: "fish", + B: 42, + C: "plenty of", + }, + }, + ) + }) + t.Run("InterfaceCoder", func(t *testing.T) { + (&SchemaCoder{}).Validate(t, reflect.TypeOf((*UserInterface)(nil)).Elem(), + func(rt reflect.Type) (func(interface{}, io.Writer) error, error) { + return ut1EncDropB, nil + }, + func(rt reflect.Type) (func(io.Reader) (interface{}, error), error) { + return ut1DecDropB, nil + }, + struct{ A, C string }{}, + UserType1{ + A: "cats", + B: 42, + C: "pjamas", + }, + ) + }) + t.Run("FailureCases", func(t *testing.T) { + var c checker + err := fmt.Errorf("FactoryError") + var v SchemaCoder + // Register the pointer type to the default encoder too. + v.Register(reflect.TypeOf((*UserType2)(nil)), + func(reflect.Type) (func(interface{}, io.Writer) error, error) { return nil, err }, + func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return nil, err }, + ) + v.Validate(&c, reflect.TypeOf((*UserType1)(nil)).Elem(), + func(reflect.Type) (func(interface{}, io.Writer) error, error) { return ut1EncDropB, err }, + func(reflect.Type) (func(io.Reader) (interface{}, error), error) { return ut1DecDropB, err }, + struct { + A, C string + B *UserType2 // To trigger the bad factory registered earlier. + }{}, + []UserType1{}, + ) + if got, want := len(c.errors), 5; got != want { + t.Fatalf("SchemaCoder.Validate did not fail as expected. Got %v errors logged, but want %v", got, want) + } + if !strings.Contains(c.errors[0].fmt, "No test values") { + t.Fatalf("SchemaCoder.Validate with no values did not fail. fmt: %q", c.errors[0].fmt) + } + if !strings.Contains(c.errors[1].fmt, "Unable to build encoder function with given factory") { + t.Fatalf("SchemaCoder.Validate with no values did not fail. fmt: %q", c.errors[1].fmt) + } + if !strings.Contains(c.errors[2].fmt, "Unable to build decoder function with given factory") { + t.Fatalf("SchemaCoder.Validate with no values did not fail. fmt: %q", c.errors[2].fmt) + } + if !strings.Contains(c.errors[3].fmt, "Unable to build encoder function for schema equivalent type") { + t.Fatalf("SchemaCoder.Validate with no values did not fail. fmt: %q", c.errors[3].fmt) + } + if !strings.Contains(c.errors[4].fmt, "Unable to build decoder function for schema equivalent type") { + t.Fatalf("SchemaCoder.Validate with no values did not fail. fmt: %q", c.errors[4].fmt) + } + }) +} + +type msg struct { + fmt string + params []interface{} +} + +type checker struct { + errors []msg + + runCount int + failNowCalled bool +} + +func (c *checker) Helper() {} + +func (c *checker) Run(string, func(*testing.T)) bool { + c.runCount++ + return true +} + +func (c *checker) Errorf(fmt string, params ...interface{}) { + c.errors = append(c.errors, msg{ + fmt: fmt, + params: params, + }) +} + +func (c *checker) Failed() bool { + return len(c.errors) > 0 +} + +func (c *checker) FailNow() { + c.failNowCalled = true +} diff --git a/sdks/go/pkg/beam/core/metrics/metrics.go b/sdks/go/pkg/beam/core/metrics/metrics.go index 33b8ef2a26e4..841bcdf6ad41 100644 --- a/sdks/go/pkg/beam/core/metrics/metrics.go +++ b/sdks/go/pkg/beam/core/metrics/metrics.go @@ -528,6 +528,19 @@ func (r CounterResult) Result() int64 { return r.Attempted } +// MergeCounters combines counter metrics that share a common key. +func MergeCounters( + attempted map[StepKey]int64, + committed map[StepKey]int64) []CounterResult { + res := make([]CounterResult, 0) + + for k := range attempted { + v := committed[k] + res = append(res, CounterResult{Attempted: attempted[k], Committed: v, Key: k}) + } + return res +} + // DistributionResult is an attempted and a commited value of a distribution // metric plus key. type DistributionResult struct { @@ -545,6 +558,19 @@ func (r DistributionResult) Result() DistributionValue { return r.Attempted } +// MergeDistributions combines distribution metrics that share a common key. +func MergeDistributions( + attempted map[StepKey]DistributionValue, + committed map[StepKey]DistributionValue) []DistributionResult { + res := make([]DistributionResult, 0) + + for k := range attempted { + v := committed[k] + res = append(res, DistributionResult{Attempted: attempted[k], Committed: v, Key: k}) + } + return res +} + // GaugeResult is an attempted and a commited value of a gauge metric plus // key. type GaugeResult struct { @@ -566,3 +592,16 @@ func (r GaugeResult) Result() GaugeValue { type StepKey struct { Step, Name, Namespace string } + +// MergeGauges combines gauge metrics that share a common key. +func MergeGauges( + attempted map[StepKey]GaugeValue, + committed map[StepKey]GaugeValue) []GaugeResult { + res := make([]GaugeResult, 0) + + for k := range attempted { + v := committed[k] + res = append(res, GaugeResult{Attempted: attempted[k], Committed: v, Key: k}) + } + return res +} diff --git a/sdks/go/pkg/beam/core/runtime/graphx/xlang.go b/sdks/go/pkg/beam/core/runtime/graphx/xlang.go index fb25a181c9bb..5e064a0efa74 100644 --- a/sdks/go/pkg/beam/core/runtime/graphx/xlang.go +++ b/sdks/go/pkg/beam/core/runtime/graphx/xlang.go @@ -110,7 +110,7 @@ func purgeOutputInput(edges []*graph.MultiEdge, p *pipepb.Pipeline) { } } - // Updating all input ids to reflect the correct sources + // Updating all input and output ids to reflect the correct PCollections for _, t := range components.GetTransforms() { inputs := t.GetInputs() for tag, nodeID := range inputs { @@ -118,8 +118,13 @@ func purgeOutputInput(edges []*graph.MultiEdge, p *pipepb.Pipeline) { inputs[tag] = pcolID } } + outputs := t.GetOutputs() + for tag, nodeID := range outputs { + if pcolID, exists := idxMap[nodeID]; exists { + outputs[tag] = pcolID + } + } } - } // VerifyNamedOutputs ensures the expanded outputs correspond to the correct and expected named outputs diff --git a/sdks/go/pkg/beam/core/runtime/metricsx/metricsx.go b/sdks/go/pkg/beam/core/runtime/metricsx/metricsx.go index 6cd10b4e9a35..2bc62d2ebf74 100644 --- a/sdks/go/pkg/beam/core/runtime/metricsx/metricsx.go +++ b/sdks/go/pkg/beam/core/runtime/metricsx/metricsx.go @@ -32,7 +32,7 @@ func FromMonitoringInfos(attempted []*pipepb.MonitoringInfo, committed []*pipepb ac, ad, ag := groupByType(attempted) cc, cd, cg := groupByType(committed) - return metrics.NewResults(mergeCounters(ac, cc), mergeDistributions(ad, cd), mergeGauges(ag, cg)) + return metrics.NewResults(metrics.MergeCounters(ac, cc), metrics.MergeDistributions(ad, cd), metrics.MergeGauges(ag, cg)) } func groupByType(minfos []*pipepb.MonitoringInfo) ( @@ -84,42 +84,6 @@ func groupByType(minfos []*pipepb.MonitoringInfo) ( return counters, distributions, gauges } -func mergeCounters( - attempted map[metrics.StepKey]int64, - committed map[metrics.StepKey]int64) []metrics.CounterResult { - res := make([]metrics.CounterResult, 0) - - for k := range attempted { - v := committed[k] - res = append(res, metrics.CounterResult{Attempted: attempted[k], Committed: v, Key: k}) - } - return res -} - -func mergeDistributions( - attempted map[metrics.StepKey]metrics.DistributionValue, - committed map[metrics.StepKey]metrics.DistributionValue) []metrics.DistributionResult { - res := make([]metrics.DistributionResult, 0) - - for k := range attempted { - v := committed[k] - res = append(res, metrics.DistributionResult{Attempted: attempted[k], Committed: v, Key: k}) - } - return res -} - -func mergeGauges( - attempted map[metrics.StepKey]metrics.GaugeValue, - committed map[metrics.StepKey]metrics.GaugeValue) []metrics.GaugeResult { - res := make([]metrics.GaugeResult, 0) - - for k := range attempted { - v := committed[k] - res = append(res, metrics.GaugeResult{Attempted: attempted[k], Committed: v, Key: k}) - } - return res -} - func extractKey(mi *pipepb.MonitoringInfo) (metrics.StepKey, error) { labels := newLabels(mi.GetLabels()) stepName := labels.Transform() diff --git a/sdks/go/pkg/beam/pipeline.go b/sdks/go/pkg/beam/pipeline.go index 26087d483c3d..50135a3bcd38 100644 --- a/sdks/go/pkg/beam/pipeline.go +++ b/sdks/go/pkg/beam/pipeline.go @@ -90,4 +90,5 @@ func (p *Pipeline) String() string { // PipelineResult is the result of beamx.RunWithMetrics. type PipelineResult interface { Metrics() metrics.Results + JobID() string } diff --git a/sdks/go/pkg/beam/runners/dataflow/dataflow.go b/sdks/go/pkg/beam/runners/dataflow/dataflow.go index e29b17582a86..474fb7adcdd9 100644 --- a/sdks/go/pkg/beam/runners/dataflow/dataflow.go +++ b/sdks/go/pkg/beam/runners/dataflow/dataflow.go @@ -52,6 +52,7 @@ var ( serviceAccountEmail = flag.String("service_account_email", "", "Service account email (optional).") numWorkers = flag.Int64("num_workers", 0, "Number of workers (optional).") maxNumWorkers = flag.Int64("max_num_workers", 0, "Maximum number of workers during scaling (optional).") + diskSizeGb = flag.Int64("disk_size_gb", 0, "Size of root disk for VMs, in GB (optional).") autoscalingAlgorithm = flag.String("autoscaling_algorithm", "", "Autoscaling mode to use (optional).") zone = flag.String("zone", "", "GCP zone (optional)") network = flag.String("network", "", "GCP network (optional)") @@ -155,6 +156,7 @@ func Execute(ctx context.Context, p *beam.Pipeline) (beam.PipelineResult, error) NoUsePublicIPs: *noUsePublicIPs, NumWorkers: *numWorkers, MaxNumWorkers: *maxNumWorkers, + DiskSizeGb: *diskSizeGb, Algorithm: *autoscalingAlgorithm, MachineType: *machineType, Labels: jobLabels, @@ -204,8 +206,7 @@ func Execute(ctx context.Context, p *beam.Pipeline) (beam.PipelineResult, error) return nil, nil } - _, err = dataflowlib.Execute(ctx, model, opts, workerURL, jarURL, modelURL, *endpoint, *executeAsync) - return nil, err + return dataflowlib.Execute(ctx, model, opts, workerURL, jarURL, modelURL, *endpoint, *executeAsync) } func gcsRecorderHook(opts []string) perf.CaptureHook { bucket, prefix, err := gcsx.ParseObject(opts[0]) diff --git a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/execute.go b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/execute.go index 784059c02834..3a25ba715e76 100644 --- a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/execute.go +++ b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/execute.go @@ -22,7 +22,9 @@ import ( "encoding/json" "os" + "github.com/apache/beam/sdks/go/pkg/beam/core/metrics" "github.com/apache/beam/sdks/go/pkg/beam/core/util/protox" + "github.com/apache/beam/sdks/go/pkg/beam/internal/errors" "github.com/apache/beam/sdks/go/pkg/beam/log" pipepb "github.com/apache/beam/sdks/go/pkg/beam/model/pipeline_v1" "github.com/apache/beam/sdks/go/pkg/beam/runners/universal/runnerlib" @@ -31,8 +33,9 @@ import ( ) // Execute submits a pipeline as a Dataflow job. -func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, workerURL, jarURL, modelURL, endpoint string, async bool) (string, error) { +func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, workerURL, jarURL, modelURL, endpoint string, async bool) (*dataflowPipelineResult, error) { // (1) Upload Go binary to GCS. + presult := &dataflowPipelineResult{} bin := opts.Worker if bin == "" { @@ -44,7 +47,7 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker worker, err := runnerlib.BuildTempWorkerBinary(ctx) if err != nil { - return "", err + return presult, err } defer os.Remove(worker) @@ -57,7 +60,7 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker log.Infof(ctx, "Staging worker binary: %v", bin) if err := StageFile(ctx, opts.Project, workerURL, bin); err != nil { - return "", err + return presult, err } log.Infof(ctx, "Staged worker binary: %v", workerURL) @@ -65,7 +68,7 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker log.Infof(ctx, "Staging Dataflow worker jar: %v", opts.WorkerJar) if err := StageFile(ctx, opts.Project, jarURL, opts.WorkerJar); err != nil { - return "", err + return presult, err } log.Infof(ctx, "Staged worker jar: %v", jarURL) } @@ -74,12 +77,12 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker p, err := Fixup(raw) if err != nil { - return "", err + return presult, err } log.Info(ctx, proto.MarshalTextString(p)) if err := StageModel(ctx, opts.Project, modelURL, protox.MustEncode(p)); err != nil { - return "", err + return presult, err } log.Infof(ctx, "Staged model pipeline: %v", modelURL) @@ -87,17 +90,17 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker job, err := Translate(ctx, p, opts, workerURL, jarURL, modelURL) if err != nil { - return "", err + return presult, err } PrintJob(ctx, job) client, err := NewClient(ctx, endpoint) if err != nil { - return "", err + return presult, err } upd, err := Submit(ctx, client, opts.Project, opts.Region, job) if err != nil { - return "", err + return presult, err } log.Infof(ctx, "Submitted job: %v", upd.Id) if endpoint == "" { @@ -105,13 +108,23 @@ func Execute(ctx context.Context, raw *pipepb.Pipeline, opts *JobOptions, worker } log.Infof(ctx, "Logs: https://console.cloud.google.com/logs/viewer?project=%v&resource=dataflow_step%%2Fjob_id%%2F%v", opts.Project, upd.Id) + presult.jobID = upd.Id + if async { - return upd.Id, nil + return presult, nil } // (4) Wait for completion. + err = WaitForCompletion(ctx, client, opts.Project, opts.Region, upd.Id) - return upd.Id, WaitForCompletion(ctx, client, opts.Project, opts.Region, upd.Id) + res, presultErr := newDataflowPipelineResult(ctx, client, job, opts.Project, opts.Region, upd.Id) + if presultErr != nil { + if err != nil { + return presult, errors.Wrap(err, presultErr.Error()) + } + return presult, presultErr + } + return res, err } // PrintJob logs the Dataflow job. @@ -122,3 +135,25 @@ func PrintJob(ctx context.Context, job *df.Job) { } log.Info(ctx, string(str)) } + +type dataflowPipelineResult struct { + jobID string + metrics *metrics.Results +} + +func newDataflowPipelineResult(ctx context.Context, client *df.Service, job *df.Job, project, region, jobID string) (*dataflowPipelineResult, error) { + res, err := GetMetrics(ctx, client, project, region, jobID) + if err != nil { + return &dataflowPipelineResult{jobID, nil}, errors.Wrap(err, "failed to get metrics") + } + + return &dataflowPipelineResult{jobID, FromMetricUpdates(res.Metrics, job)}, nil +} + +func (pr dataflowPipelineResult) Metrics() metrics.Results { + return *pr.metrics +} + +func (pr dataflowPipelineResult) JobID() string { + return pr.jobID +} diff --git a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/job.go b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/job.go index b9e913edc38b..ddf1c2d235d2 100644 --- a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/job.go +++ b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/job.go @@ -48,6 +48,7 @@ type JobOptions struct { Subnetwork string NoUsePublicIPs bool NumWorkers int64 + DiskSizeGb int64 MachineType string Labels map[string]string ServiceAccountEmail string @@ -144,6 +145,7 @@ func Translate(ctx context.Context, p *pipepb.Pipeline, opts *JobOptions, worker AutoscalingSettings: &df.AutoscalingSettings{ MaxNumWorkers: opts.MaxNumWorkers, }, + DiskSizeGb: opts.DiskSizeGb, IpConfiguration: ipConfiguration, Kind: "harness", Packages: packages, @@ -240,6 +242,12 @@ func NewClient(ctx context.Context, endpoint string) (*df.Service, error) { return client, nil } +// GetMetrics returns a collection of metrics describing the progress of a +// job by making a call to Cloud Monitoring service. +func GetMetrics(ctx context.Context, client *df.Service, project, region, jobID string) (*df.JobMetrics, error) { + return client.Projects.Locations.Jobs.GetMetrics(project, region, jobID).Do() +} + type dataflowOptions struct { Experiments []string `json:"experiments,omitempty"` PipelineURL string `json:"pipelineUrl"` diff --git a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics.go b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics.go new file mode 100644 index 000000000000..ae72b644ceb5 --- /dev/null +++ b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics.go @@ -0,0 +1,124 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package dataflowlib translates a Beam pipeline model to the +// Dataflow API job model, for submission to Google Cloud Dataflow. + +package dataflowlib + +import ( + "encoding/json" + "fmt" + + "github.com/apache/beam/sdks/go/pkg/beam/core/metrics" + df "google.golang.org/api/dataflow/v1b3" +) + +// FromMetricUpdates extracts metrics from a slice of MetricUpdate objects and +// groups them into counters, distributions and gauges. +// +// Dataflow currently only reports Counter and Distribution metrics to Cloud +// Monitoring. Gauge metrics are not supported. The output metrics.Results will +// not contain any gauges. +func FromMetricUpdates(allMetrics []*df.MetricUpdate, job *df.Job) *metrics.Results { + ac, ad := groupByType(allMetrics, job, true) + cc, cd := groupByType(allMetrics, job, false) + + return metrics.NewResults(metrics.MergeCounters(ac, cc), metrics.MergeDistributions(ad, cd), make([]metrics.GaugeResult, 0)) +} + +func groupByType(allMetrics []*df.MetricUpdate, job *df.Job, tentative bool) ( + map[metrics.StepKey]int64, + map[metrics.StepKey]metrics.DistributionValue) { + counters := make(map[metrics.StepKey]int64) + distributions := make(map[metrics.StepKey]metrics.DistributionValue) + + for _, metric := range allMetrics { + isTentative := metric.Name.Context["tentative"] == "true" + if isTentative != tentative { + continue + } + + key, err := extractKey(metric, job) + if err != nil { + continue + } + + if metric.Scalar != nil { + v, err := extractCounterValue(metric.Scalar) + if err != nil { + continue + } + counters[key] = v + } else if metric.Distribution != nil { + v, err := extractDistributionValue(metric.Distribution) + if err != nil { + continue + } + distributions[key] = v + } + } + return counters, distributions +} + +func extractKey(metric *df.MetricUpdate, job *df.Job) (metrics.StepKey, error) { + stepName, ok := metric.Name.Context["step"] + if !ok { + return metrics.StepKey{}, fmt.Errorf("could not find the internal step name") + } + userStepName := "" + + for _, step := range job.Steps { + if step.Name == stepName { + properties := make(map[string]string) + json.Unmarshal(step.Properties, &properties) + userStepName = properties["user_name"] + break + } + } + if userStepName == "" { + return metrics.StepKey{}, fmt.Errorf("could not translate the internal step name %v", stepName) + } + + namespace := metric.Name.Context["namespace"] + if namespace == "" { + namespace = "dataflow/v1b3" + } + + return metrics.StepKey{Step: userStepName, Name: metric.Name.Name, Namespace: namespace}, nil +} + +func extractCounterValue(obj interface{}) (int64, error) { + v, ok := obj.(float64) + if !ok { + return -1, fmt.Errorf("expected float64, got data of type %T instead", obj) + } + return int64(v), nil +} + +func extractDistributionValue(obj interface{}) (metrics.DistributionValue, error) { + m := obj.(map[string]interface{}) + propertiesToVisit := []string{"count", "sum", "min", "max"} + var values [4]int64 + + for i, p := range propertiesToVisit { + v, ok := m[p].(float64) + if !ok { + return metrics.DistributionValue{}, fmt.Errorf("expected float64, got data of type %T instead", m[p]) + } + values[i] = int64(v) + } + return metrics.DistributionValue{Count: values[0], Sum: values[1], Min: values[2], Max: values[3]}, nil +} diff --git a/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics_test.go b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics_test.go new file mode 100644 index 000000000000..b0396d1d8acc --- /dev/null +++ b/sdks/go/pkg/beam/runners/dataflow/dataflowlib/metrics_test.go @@ -0,0 +1,133 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dataflowlib + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/apache/beam/sdks/go/pkg/beam/core/metrics" + "github.com/google/go-cmp/cmp" + df "google.golang.org/api/dataflow/v1b3" +) + +func TestFromMetricUpdates_Counters(t *testing.T) { + want := metrics.CounterResult{ + Attempted: 15, + Committed: 15, + Key: metrics.StepKey{ + Step: "main.customDoFn", + Name: "customCounter", + Namespace: "customDoFn", + }} + cName := newMetricStructuredName("customCounter", "customDoFn", false) + committed := df.MetricUpdate{Name: &cName, Scalar: 15.0} + + aName := newMetricStructuredName("customCounter", "customDoFn", true) + attempted := df.MetricUpdate{Name: &aName, Scalar: 15.0} + + job, err := newJob("main.customDoFn") + if err != nil { + t.Fatal(err) + } + + got := FromMetricUpdates([]*df.MetricUpdate{&attempted, &committed}, &job).AllMetrics().Counters() + size := len(got) + if size < 1 { + t.Fatalf("Invalid array's size: got: %v, want: %v", size, 1) + } + if d := cmp.Diff(want, got[0]); d != "" { + t.Fatalf("Invalid counter: got: %v, want: %v, diff(-want,+got):\n %v", + got[0], want, d) + } +} + +func TestFromMetricUpdates_Distributions(t *testing.T) { + want := metrics.DistributionResult{ + Attempted: metrics.DistributionValue{ + Count: 100, + Sum: 5, + Min: -12, + Max: 30, + }, + Committed: metrics.DistributionValue{ + Count: 100, + Sum: 5, + Min: -12, + Max: 30, + }, + Key: metrics.StepKey{ + Step: "main.customDoFn", + Name: "customDist", + Namespace: "customDoFn", + }} + distribution := map[string]interface{}{ + "count": 100.0, + "sum": 5.0, + "min": -12.0, + "max": 30.0, + } + cName := newMetricStructuredName("customDist", "customDoFn", false) + committed := df.MetricUpdate{Name: &cName, Distribution: distribution} + + aName := newMetricStructuredName("customDist", "customDoFn", true) + attempted := df.MetricUpdate{Name: &aName, Distribution: distribution} + + job, err := newJob("main.customDoFn") + if err != nil { + t.Fatal(err) + } + + got := FromMetricUpdates([]*df.MetricUpdate{&attempted, &committed}, &job).AllMetrics().Distributions() + size := len(got) + if size < 1 { + t.Fatalf("Invalid array's size: got: %v, want: %v", size, 1) + } + if d := cmp.Diff(want, got[0]); d != "" { + t.Fatalf("Invalid distribution: got: %v, want: %v, diff(-want,+got):\n %v", + got[0], want, d) + } +} + +func newMetricStructuredName(name, namespace string, attempted bool) df.MetricStructuredName { + context := map[string]string{ + "step": "e5", + "namespace": namespace, + } + if attempted { + context["tentative"] = "true" + } + return df.MetricStructuredName{Context: context, Name: name} +} + +func newJob(stepName string) (df.Job, error) { + stepRepr := map[string]interface{}{ + "name": "e5", + "properties": map[string]string{ + "user_name": stepName, + }, + } + stepJson, err := json.Marshal(&stepRepr) + if err != nil { + return df.Job{}, fmt.Errorf("Could not create Step object: %v", err) + } + step := df.Step{} + if err := json.Unmarshal(stepJson, &step); err != nil { + return df.Job{}, fmt.Errorf("Could not create Step object: %v", err) + } + return df.Job{Steps: []*df.Step{&step}}, nil +} diff --git a/sdks/go/pkg/beam/runners/universal/runnerlib/compile.go b/sdks/go/pkg/beam/runners/universal/runnerlib/compile.go index 3a5709bca38a..6510ad38fe51 100644 --- a/sdks/go/pkg/beam/runners/universal/runnerlib/compile.go +++ b/sdks/go/pkg/beam/runners/universal/runnerlib/compile.go @@ -61,10 +61,14 @@ func BuildTempWorkerBinary(ctx context.Context) (string, error) { // /usr/local/go/src/runtime/asm_amd64.s (skip: 4 or 5) func BuildWorkerBinary(ctx context.Context, filename string) error { program := "" + var isTest bool for i := 3; ; i++ { _, file, _, ok := runtime.Caller(i) if !ok || !strings.HasSuffix(file, ".go") || strings.HasSuffix(file, "runtime/proc.go") { break + } else if strings.HasSuffix(file, "testing/testing.go") { + isTest = true + break } program = file } @@ -75,7 +79,14 @@ func BuildWorkerBinary(ctx context.Context, filename string) error { log.Infof(ctx, "Cross-compiling %v as %v", program, filename) // Cross-compile given go program. Not awesome. - build := []string{"go", "build", "-o", filename, program} + var build []string + if isTest { + program = program[:strings.LastIndex(program, "/")+1] + program = program + "." + build = []string{"go", "test", "-c", "-o", filename, program} + } else { + build = []string{"go", "build", "-o", filename, program} + } cmd := exec.Command(build[0], build[1:]...) cmd.Env = append(os.Environ(), "GOOS=linux", "GOARCH=amd64") diff --git a/sdks/go/pkg/beam/runners/universal/runnerlib/execute.go b/sdks/go/pkg/beam/runners/universal/runnerlib/execute.go index 38d7a757d36d..fd33feb04c24 100644 --- a/sdks/go/pkg/beam/runners/universal/runnerlib/execute.go +++ b/sdks/go/pkg/beam/runners/universal/runnerlib/execute.go @@ -33,7 +33,7 @@ import ( // Convenience function. func Execute(ctx context.Context, p *pipepb.Pipeline, endpoint string, opt *JobOptions, async bool) (*universalPipelineResult, error) { // (1) Prepare job to obtain artifact staging instructions. - presult := &universalPipelineResult{JobID: ""} + presult := &universalPipelineResult{} cc, err := grpcx.Dial(ctx, endpoint, 2*time.Minute) if err != nil { @@ -94,17 +94,18 @@ func Execute(ctx context.Context, p *pipepb.Pipeline, endpoint string, opt *JobO } err = WaitForCompletion(ctx, client, jobID) - res, err := newUniversalPipelineResult(ctx, jobID, client) - if err != nil { - return presult, err + res, presultErr := newUniversalPipelineResult(ctx, jobID, client) + if presultErr != nil { + if err != nil { + return presult, errors.Wrap(err, presultErr.Error()) + } + return presult, presultErr } - presult = res - - return presult, err + return res, err } type universalPipelineResult struct { - JobID string + jobID string metrics *metrics.Results } @@ -123,3 +124,7 @@ func newUniversalPipelineResult(ctx context.Context, jobID string, client jobpb. func (pr universalPipelineResult) Metrics() metrics.Results { return *pr.metrics } + +func (pr universalPipelineResult) JobID() string { + return pr.jobID +} diff --git a/sdks/go/pkg/beam/runners/universal/universal.go b/sdks/go/pkg/beam/runners/universal/universal.go index e8d1bb060be7..d55d27001c6b 100644 --- a/sdks/go/pkg/beam/runners/universal/universal.go +++ b/sdks/go/pkg/beam/runners/universal/universal.go @@ -40,6 +40,7 @@ func init() { // Note that we also _ import harness/init to setup the remote execution hook. beam.RegisterRunner("universal", Execute) beam.RegisterRunner("PortableRunner", Execute) + beam.RegisterRunner("portable", Execute) } // Execute executes the pipeline on a universal beam runner. diff --git a/sdks/go/pkg/beam/testing/ptest/ptest.go b/sdks/go/pkg/beam/testing/ptest/ptest.go index 602303abcb94..bc6786384f90 100644 --- a/sdks/go/pkg/beam/testing/ptest/ptest.go +++ b/sdks/go/pkg/beam/testing/ptest/ptest.go @@ -25,7 +25,16 @@ import ( "github.com/apache/beam/sdks/go/pkg/beam" // ptest uses the direct runner to execute pipelines by default. + _ "github.com/apache/beam/sdks/go/pkg/beam/runners/dataflow" _ "github.com/apache/beam/sdks/go/pkg/beam/runners/direct" + _ "github.com/apache/beam/sdks/go/pkg/beam/runners/flink" + _ "github.com/apache/beam/sdks/go/pkg/beam/runners/spark" +) + +var ( + // expansionAddr is the endpoint for an expansion service for cross-language + // transforms. + ExpansionAddr = flag.String("expansion_addr", "", "Address of Expansion Service") ) // TODO(herohde) 7/10/2017: add hooks to verify counters, logs, etc. @@ -67,6 +76,10 @@ var ( defaultRunner = "direct" ) +func DefaultRunner() string { + return defaultRunner +} + // Run runs a pipeline for testing. The semantics of the pipeline is expected // to be verified through passert. func Run(p *beam.Pipeline) error { @@ -77,6 +90,14 @@ func Run(p *beam.Pipeline) error { return err } +// RunAndValidate runs a pipeline for testing and validates the result, failing +// the test if the pipeline fails. +func RunAndValidate(t *testing.T, p *beam.Pipeline) { + if err := Run(p); err != nil { + t.Fatalf("Failed to execute job: %v", err) + } +} + // Main is an implementation of testing's TestMain to permit testing // pipelines on runners other than the direct runner. // diff --git a/sdks/go/test/build.gradle b/sdks/go/test/build.gradle index a8d6d7f66ee4..e88316f629f6 100644 --- a/sdks/go/test/build.gradle +++ b/sdks/go/test/build.gradle @@ -46,18 +46,106 @@ golang { // script would otherwise have to figure out which arch/platform binary to invoke. targetPlatform = ['linux-amd64'] - go 'build -o ./build/bin/linux-amd64/worker github.com/apache/beam/sdks/go/test/integration' + go 'build -o ./build/bin/linux-amd64/worker github.com/apache/beam/sdks/go/test/integration/driver' + } +} + +// ValidatesRunner tests for Dataflow using an updated framework that supports +// cross-language tests. +// TODO(BEAM-11415): Merge this into existing ValidatesRunner gradle rules. +task dataflowXlangValidatesRunner() { + dependsOn ":sdks:go:test:goBuild" + dependsOn ":runners:google-cloud-dataflow-java:worker:shadowJar" + dependsOn ":sdks:java:testing:expansion-service:buildTestExpansionServiceJar" + + doLast { + def options = [ + "--runner dataflow", + "--dataflow_worker_jar ${project(":runners:google-cloud-dataflow-java:worker").shadowJar.archivePath}", + "--expansion_service_jar ${project(":sdks:java:testing:expansion-service").buildTestExpansionServiceJar.archivePath}", + ] + exec { + executable "sh" + args "-c", "./run_validatesrunner_tests.sh ${options.join(' ')}" + } + } +} + +// ValidatesRunner tests for Flink using an updated framework that supports +// cross-language tests. +// TODO(BEAM-11415): Merge this into existing ValidatesRunner gradle rules. +task flinkXlangValidatesRunner { + dependsOn ":sdks:go:test:goBuild" + dependsOn ":sdks:go:container:docker" + dependsOn ":runners:flink:${project.ext.latestFlinkVersion}:job-server:shadowJar" + dependsOn ":sdks:java:testing:expansion-service:buildTestExpansionServiceJar" + doLast { + def options = [ + "--runner flink", + "--flink_job_server_jar ${project(":runners:flink:${project.ext.latestFlinkVersion}:job-server").shadowJar.archivePath}", + "--expansion_service_jar ${project(":sdks:java:testing:expansion-service").buildTestExpansionServiceJar.archivePath}", + ] + exec { + executable "sh" + args "-c", "./run_validatesrunner_tests.sh ${options.join(' ')}" + } + } +} + +// ValidatesRunner tests for Spark using an updated framework that supports +// cross-language tests. +// TODO(BEAM-11415): Merge this into existing ValidatesRunner gradle rules. +task sparkXlangValidatesRunner { + dependsOn ":sdks:go:test:goBuild" + dependsOn ":runners:spark:job-server:shadowJar" + dependsOn ":sdks:java:testing:expansion-service:buildTestExpansionServiceJar" + doLast { + def options = [ + "--runner spark", + "--spark_job_server_jar ${project(":runners:spark:job-server").shadowJar.archivePath}", + "--expansion_service_jar ${project(":sdks:java:testing:expansion-service").buildTestExpansionServiceJar.archivePath}", + ] + exec { + executable "sh" + args "-c", "./run_validatesrunner_tests.sh ${options.join(' ')}" + } + } +} + +// ValidatesRunner tests for the Python Portable runner (aka. ULR) using an +// updated framework that supports cross-language tests. +// TODO(BEAM-11415): Merge this into existing ValidatesRunner gradle rules. +task ulrXlangValidatesRunner { + dependsOn ":sdks:go:test:goBuild" + dependsOn ":sdks:go:container:docker" + dependsOn "setupVirtualenv" + dependsOn ":sdks:python:buildPython" + dependsOn ":sdks:java:testing:expansion-service:buildTestExpansionServiceJar" + doLast { + def options = [ + "--runner portable", + "--expansion_service_jar ${project(":sdks:java:testing:expansion-service").buildTestExpansionServiceJar.archivePath}", + ] + exec { + executable "sh" + workingDir "${project.rootDir}/sdks/python" + args "-c", ". ${envdir}/bin/activate && pip install -e ." + } + exec { + executable "sh" + args "-c", ". ${envdir}/bin/activate && ./run_validatesrunner_tests.sh ${options.join(' ')}" + } } } task flinkValidatesRunner { dependsOn ":sdks:go:test:goBuild" - dependsOn ":runners:flink:1.10:job-server:shadowJar" + dependsOn ":runners:flink:${project.ext.latestFlinkVersion}:job-server:shadowJar" doLast { def options = [ "--runner flink", "--parallel 1", // prevent memory overuse - "--flink_job_server_jar ${project(":runners:flink:1.10:job-server").shadowJar.archivePath}", + "--flink_job_server_jar ${project(":runners:flink:${project.ext.latestFlinkVersion}:job-server").shadowJar.archivePath}", ] exec { executable "sh" diff --git a/sdks/go/test/integration/driver.go b/sdks/go/test/integration/driver/driver.go similarity index 100% rename from sdks/go/test/integration/driver.go rename to sdks/go/test/integration/driver/driver.go diff --git a/sdks/go/test/integration/integration.go b/sdks/go/test/integration/integration.go new file mode 100644 index 000000000000..a874a04179b5 --- /dev/null +++ b/sdks/go/test/integration/integration.go @@ -0,0 +1,147 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package integration provides functionality that needs to be shared between all +// integration tests. +// +// Integration tests are implemented through Go's test framework, as test +// functions that create and execute pipelines using the ptest package. Tests +// should be placed in appropriate sub-packages for organizational purposes, and +// to allow greater parallelism, since tests are only run in parallel across +// different packages. Integration tests should always begin with a call to +// CheckFilters to allow the test to be filtered. +// +// Running integration tests can be done with a go test call with any flags that +// are required by the test pipelines, such as --runner or --endpoint. +// Example: +// go test -v ./sdks/go/test/integration/... --runner=portable --endpoint=localhost:8099 +// +// Alternatively, tests can be executed by running the +// run_validatesrunner_tests.sh script, which also performs much of the +// environment setup, or by calling gradle commands in :sdks:go:test. +package integration + +import ( + "fmt" + "regexp" + "testing" + + "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" +) + +// Filters for temporarily skipping integration tests. All filters are regex +// matchers that must match the full name of a test at the point where +// CheckFilters is called. Multiple tests can be skipped by using regex +// wildcards. (ex. "TestXLang_.*" filters all tests starting with TestXLang_) +// +// It is strongly recommended to include, TODOs, Jira issues, or just comments +// describing why tests are being skipped. + +// sickbay filters tests that fail due to Go SDK errors. These tests will not +// execute on any runners. +var sickbay = []string{ + // TODO(BEAM-11418): These tests are currently failing with the Go SDK. + "TestXLang_CoGroupBy", + "TestXLang_Multi", + "TestXLang_Partition", +} + +// Runner-specific test filters, for features that are not yet supported on +// specific runners. + +var directFilters = []string{ + // The direct runner does not yet support cross-language. + "TestXLang.*", +} + +var portableFilters = []string{ + // TODO(BEAM-11499): XLang tests timing out. + "TestXLang.*", +} + +var flinkFilters = []string{ + // TODO(BEAM-11500): Flink tests timing out on reads. + "TestXLang_Combine.*", +} + +var sparkFilters = []string{ + // TODO(BEAM-11498): XLang tests broken with Spark runner. + "TestXLang.*", + "TestParDoSideInput", + "TestParDoKVSideInput", +} + +var dataflowFilters = []string{ + // TODO(BEAM-11574): XLang needs to be enabled for Dataflow. + "TestXLang.*", + // TODO(BEAM-11576): TestFlattenDup failing on this runner. + "TestFlattenDup", +} + +// CheckFilters checks if an integration test is filtered to be skipped, either +// because the intended runner does not support it, or the test is sickbayed. +// This method should be called at the beginning of any integration test. If +// t.Run is used, CheckFilters should be called within the t.Run callback, so +// that sub-tests can be skipped individually. +func CheckFilters(t *testing.T) { + // Check for sickbaying first. + n := t.Name() + for _, f := range sickbay { + // Add start and end of string regexp matchers so only a full match is + // counted. + f = fmt.Sprintf("^%v$", f) + match, err := regexp.MatchString(f, n) + if err != nil { + t.Errorf("Matching of regex '%v' with test '%v' failed: %v", f, n, err) + } + if match { + t.Skipf("Test %v is currently sickbayed on all runners", n) + } + } + + // Test for runner-specific skipping second. + var filters []string + runner := *ptest.Runner + if runner == "" { + runner = ptest.DefaultRunner() + } + switch runner { + case "direct", "DirectRunner": + filters = directFilters + case "portable", "PortableRunner": + filters = portableFilters + case "flink", "FlinkRunner": + filters = flinkFilters + case "spark", "SparkRunner": + filters = sparkFilters + case "dataflow", "DataflowRunner": + filters = dataflowFilters + default: + return + } + + for _, f := range filters { + // Add start and end of string regexp matchers so only a full match is + // counted. + f = fmt.Sprintf("^%v$", f) + match, err := regexp.MatchString(f, n) + if err != nil { + t.Errorf("Matching of regex '%v' with test '%v' failed: %v", f, n, err) + } + if match { + t.Skipf("Test %v is currently filtered for runner %v", n, runner) + } + } +} diff --git a/sdks/go/test/integration/primitives/cogbk_test.go b/sdks/go/test/integration/primitives/cogbk_test.go index 493ce8302b59..73974ef4252b 100644 --- a/sdks/go/test/integration/primitives/cogbk_test.go +++ b/sdks/go/test/integration/primitives/cogbk_test.go @@ -19,22 +19,20 @@ import ( "testing" "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" ) func TestCoGBK(t *testing.T) { - if err := ptest.Run(CoGBK()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, CoGBK()) } func TestReshuffle(t *testing.T) { - if err := ptest.Run(Reshuffle()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, Reshuffle()) } func TestReshuffleKV(t *testing.T) { - if err := ptest.Run(ReshuffleKV()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, ReshuffleKV()) } diff --git a/sdks/go/test/integration/primitives/flatten_test.go b/sdks/go/test/integration/primitives/flatten_test.go index 04710e48d46c..16d795f75404 100644 --- a/sdks/go/test/integration/primitives/flatten_test.go +++ b/sdks/go/test/integration/primitives/flatten_test.go @@ -19,16 +19,15 @@ import ( "testing" "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" ) func TestFlatten(t *testing.T) { - if err := ptest.Run(Flatten()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, Flatten()) } func TestFlattenDup(t *testing.T) { - if err := ptest.Run(FlattenDup()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, FlattenDup()) } diff --git a/sdks/go/test/integration/primitives/pardo_test.go b/sdks/go/test/integration/primitives/pardo_test.go index f837689868dc..6616c492b5ba 100644 --- a/sdks/go/test/integration/primitives/pardo_test.go +++ b/sdks/go/test/integration/primitives/pardo_test.go @@ -19,22 +19,20 @@ import ( "testing" "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" ) func TestParDoMultiOutput(t *testing.T) { - if err := ptest.Run(ParDoMultiOutput()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, ParDoMultiOutput()) } func TestParDoSideInput(t *testing.T) { - if err := ptest.Run(ParDoSideInput()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, ParDoSideInput()) } func TestParDoKVSideInput(t *testing.T) { - if err := ptest.Run(ParDoKVSideInput()); err != nil { - t.Error(err) - } + integration.CheckFilters(t) + ptest.RunAndValidate(t, ParDoKVSideInput()) } diff --git a/sdks/go/test/integration/synthetic/synthetic_test.go b/sdks/go/test/integration/synthetic/synthetic_test.go new file mode 100644 index 000000000000..1a5a7fbd19da --- /dev/null +++ b/sdks/go/test/integration/synthetic/synthetic_test.go @@ -0,0 +1,75 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package synthetic + +import ( + "testing" + + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/io/synthetic" + "github.com/apache/beam/sdks/go/pkg/beam/testing/passert" + "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" +) + +// TestSimplePipeline creates a very simple synthetic pipeline to test that +// basic synthetic pipelines work. +func TestSimplePipeline(t *testing.T) { + integration.CheckFilters(t) + + p, s := beam.NewPipelineWithRoot() + const size = 100 + + src := synthetic.SourceSingle(s, + synthetic.DefaultSourceConfig().NumElements(size).Build()) + step := synthetic.Step(s, synthetic.DefaultStepConfig().Build(), src) + passert.Count(s, step, "out", size) + + ptest.RunAndValidate(t, p) +} + +// TestSplittablePipeline creates a simple synthetic pipeline that exercises +// splitting-related behavior. +func TestSplittablePipeline(t *testing.T) { + integration.CheckFilters(t) + + p, s := beam.NewPipelineWithRoot() + const srcSize1 = 50 + const srcSize2 = 10 + const stepMult = 500 + const outCount = (srcSize1 + srcSize2) * stepMult + + configs := beam.Create(s, + synthetic.DefaultSourceConfig().NumElements(srcSize1).InitialSplits(3).Build(), + synthetic.DefaultSourceConfig().NumElements(srcSize2).InitialSplits(3).Build()) + src := synthetic.Source(s, configs) + step := synthetic.Step( + s, + synthetic. + DefaultStepConfig(). + OutputPerInput(stepMult). + Splittable(true). + InitialSplits(8). + Build(), + src) + passert.Count(s, step, "out", outCount) + + ptest.RunAndValidate(t, p) +} + +func TestMain(m *testing.M) { + ptest.Main(m) +} diff --git a/sdks/go/test/integration/wordcount/wordcount_test.go b/sdks/go/test/integration/wordcount/wordcount_test.go index e86810d63f04..11cddad57622 100644 --- a/sdks/go/test/integration/wordcount/wordcount_test.go +++ b/sdks/go/test/integration/wordcount/wordcount_test.go @@ -21,6 +21,7 @@ import ( "github.com/apache/beam/sdks/go/pkg/beam/io/filesystem/memfs" "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" ) func TestWordCount(t *testing.T) { @@ -74,6 +75,7 @@ func TestWordCount(t *testing.T) { } for _, test := range tests { + integration.CheckFilters(t) const filename = "memfs://input" memfs.Write(filename, []byte(strings.Join(test.lines, "\n"))) @@ -83,3 +85,7 @@ func TestWordCount(t *testing.T) { } } } + +func TestMain(m *testing.M) { + ptest.Main(m) +} diff --git a/sdks/go/test/integration/xlang/xlang_test.go b/sdks/go/test/integration/xlang/xlang_test.go new file mode 100644 index 000000000000..9f48cf80e0e7 --- /dev/null +++ b/sdks/go/test/integration/xlang/xlang_test.go @@ -0,0 +1,260 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package xlang + +import ( + "fmt" + "reflect" + "sort" + "testing" + + "github.com/apache/beam/sdks/go/examples/xlang" + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/testing/passert" + "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" + "github.com/apache/beam/sdks/go/test/integration" +) + +func init() { + beam.RegisterType(reflect.TypeOf((*IntString)(nil)).Elem()) + beam.RegisterType(reflect.TypeOf((*StringInt)(nil)).Elem()) + beam.RegisterFunction(formatIntStringsFn) + beam.RegisterFunction(formatStringIntFn) + beam.RegisterFunction(formatStringIntsFn) + beam.RegisterFunction(formatIntFn) + beam.RegisterFunction(getIntString) + beam.RegisterFunction(getStringInt) + beam.RegisterFunction(sumCounts) + beam.RegisterFunction(collectValues) +} + +// formatIntStringsFn is a DoFn that formats an int64 and a list of strings. +func formatIntStringsFn(i int64, s []string) string { + sort.Strings(s) + return fmt.Sprintf("%v:%v", i, s) +} + +// formatStringIntFn is a DoFn that formats a string and an int64. +func formatStringIntFn(s string, i int64) string { + return fmt.Sprintf("%s:%v", s, i) +} + +// formatStringIntsFn is a DoFn that formats a string and a list of ints. +func formatStringIntsFn(s string, i []int) string { + sort.Ints(i) + return fmt.Sprintf("%v:%v", s, i) +} + +// formatIntFn is a DoFn that formats an int64 as a string. +func formatIntFn(i int64) string { + return fmt.Sprintf("%v", i) +} + +// IntString used to represent KV PCollection values of int64, string. +type IntString struct { + X int64 + Y string +} + +func getIntString(kv IntString, emit func(int64, string)) { + emit(kv.X, kv.Y) +} + +// StringInt used to represent KV PCollection values of string, int64. +type StringInt struct { + X string + Y int64 +} + +func getStringInt(kv StringInt, emit func(string, int64)) { + emit(kv.X, kv.Y) +} + +func sumCounts(key int64, iter1 func(*string) bool) (int64, []string) { + var val string + var values []string + + for iter1(&val) { + values = append(values, val) + } + return key, values +} + +func collectValues(key string, iter func(*int64) bool) (string, []int) { + var count int64 + var values []int + for iter(&count) { + values = append(values, int(count)) + } + return key, values +} + +func TestXLang_CoGroupBy(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + // Using the cross-language transform + col1 := beam.ParDo(s, getIntString, beam.Create(s, IntString{X: 0, Y: "1"}, IntString{X: 0, Y: "2"}, IntString{X: 1, Y: "3"})) + col2 := beam.ParDo(s, getIntString, beam.Create(s, IntString{X: 0, Y: "4"}, IntString{X: 1, Y: "5"}, IntString{X: 1, Y: "6"})) + c := xlang.CoGroupByKey(s, *ptest.ExpansionAddr, col1, col2) + sums := beam.ParDo(s, sumCounts, c) + formatted := beam.ParDo(s, formatIntStringsFn, sums) + passert.Equals(s, formatted, "0:[1 2 4]", "1:[3 5 6]") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_Combine(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + // Using the cross-language transform + kvs := beam.Create(s, StringInt{X: "a", Y: 1}, StringInt{X: "a", Y: 2}, StringInt{X: "b", Y: 3}) + ins := beam.ParDo(s, getStringInt, kvs) + c := xlang.CombinePerKey(s, *ptest.ExpansionAddr, ins) + + formatted := beam.ParDo(s, formatStringIntFn, c) + passert.Equals(s, formatted, "a:3", "b:3") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_CombineGlobally(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + in := beam.CreateList(s, []int64{1, 2, 3}) + + // Using the cross-language transform + c := xlang.CombineGlobally(s, *ptest.ExpansionAddr, in) + + formatted := beam.ParDo(s, formatIntFn, c) + passert.Equals(s, formatted, "6") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_Flatten(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + col1 := beam.CreateList(s, []int64{1, 2, 3}) + col2 := beam.CreateList(s, []int64{4, 5, 6}) + + // Using the cross-language transform + c := xlang.Flatten(s, *ptest.ExpansionAddr, col1, col2) + + formatted := beam.ParDo(s, formatIntFn, c) + passert.Equals(s, formatted, "1", "2", "3", "4", "5", "6") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_GroupBy(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + // Using the cross-language transform + kvs := beam.Create(s, StringInt{X: "0", Y: 1}, StringInt{X: "0", Y: 2}, StringInt{X: "1", Y: 3}) + in := beam.ParDo(s, getStringInt, kvs) + out := xlang.GroupByKey(s, *ptest.ExpansionAddr, in) + + vals := beam.ParDo(s, collectValues, out) + formatted := beam.ParDo(s, formatStringIntsFn, vals) + passert.Equals(s, formatted, "0:[1 2]", "1:[3]") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_Multi(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + main1 := beam.CreateList(s, []string{"a", "bb"}) + main2 := beam.CreateList(s, []string{"x", "yy", "zzz"}) + side := beam.CreateList(s, []string{"s"}) + + // Using the cross-language transform + mainOut, sideOut := xlang.Multi(s, *ptest.ExpansionAddr, main1, main2, side) + + passert.Equals(s, mainOut, "as", "bbs", "xs", "yys", "zzzs") + passert.Equals(s, sideOut, "ss") + + ptest.RunAndValidate(t, p) +} + +func TestXLang_Partition(t *testing.T) { + integration.CheckFilters(t) + + if *ptest.ExpansionAddr == "" { + t.Fatal("No expansion address provided") + } + + p := beam.NewPipeline() + s := p.Root() + + col := beam.CreateList(s, []int64{1, 2, 3, 4, 5, 6}) + + // Using the cross-language transform + out0, out1 := xlang.Partition(s, *ptest.ExpansionAddr, col) + formatted0 := beam.ParDo(s, formatIntFn, out0) + formatted1 := beam.ParDo(s, formatIntFn, out1) + + passert.Equals(s, formatted0, "2", "4", "6") + passert.Equals(s, formatted1, "1", "3", "5") + + ptest.RunAndValidate(t, p) +} + +func TestMain(m *testing.M) { + ptest.Main(m) +} diff --git a/sdks/go/test/load/build.gradle b/sdks/go/test/load/build.gradle index 0dac992eb6a6..cb1c8db674e5 100644 --- a/sdks/go/test/load/build.gradle +++ b/sdks/go/test/load/build.gradle @@ -48,6 +48,10 @@ golang { targetPlatform = [getLocalPlatform(), 'linux-amd64'] // Build all the tests go 'build -o ./build/bin/${GOOS}_${GOARCH}/pardo github.com/apache/beam/sdks/go/test/load/pardo' + go 'build -o ./build/bin/${GOOS}_${GOARCH}/combine github.com/apache/beam/sdks/go/test/load/combine' + go 'build -o ./build/bin/${GOOS}_${GOARCH}/group_by_key github.com/apache/beam/sdks/go/test/load/group_by_key' + go 'build -o ./build/bin/${GOOS}_${GOARCH}/sideinput github.com/apache/beam/sdks/go/test/load/sideinput' + go 'build -o ./build/bin/${GOOS}_${GOARCH}/cogbk github.com/apache/beam/sdks/go/test/load/cogbk' } } diff --git a/sdks/go/test/load/cogbk/cogbk.go b/sdks/go/test/load/cogbk/cogbk.go new file mode 100644 index 000000000000..a3de69bc185a --- /dev/null +++ b/sdks/go/test/load/cogbk/cogbk.go @@ -0,0 +1,106 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "flag" + "reflect" + + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/io/synthetic" + "github.com/apache/beam/sdks/go/pkg/beam/log" + "github.com/apache/beam/sdks/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/go/test/load" +) + +var ( + iterations = flag.Int( + "iterations", + 1, + "A number of reiterations over per-key-grouped values to be performed.") + syntheticConfig = flag.String( + "input_options", + "", + "A JSON object that describes the configuration for the first synthetic source.") + coSyntheticConfig = flag.String( + "co_input_options", + "", + "A JSON object that describes the configuration for the second synthetic source.") +) + +func init() { + beam.RegisterType(reflect.TypeOf((*ungroupAndReiterateFn)(nil)).Elem()) +} + +// ungroupAndReiterateFn reiterates given number of times over CoGBK's output. +type ungroupAndReiterateFn struct { + Iterations int +} + +func (fn *ungroupAndReiterateFn) ProcessElement(key []byte, p1values, p2values func(*[]byte) bool, emit func([]byte, []byte)) { + var value []byte + for i := 0; i < fn.Iterations; i++ { + for p1values(&value) { + // emit output only once + if i == fn.Iterations-1 { + emit(key, value) + } + } + for p2values(&value) { + if i == fn.Iterations-1 { + emit(key, value) + } + } + } +} + +func parseSyntheticConfig(config string) synthetic.SourceConfig { + if config == "" { + panic("--input_options and --co_input_options not provided") + } else { + encoded := []byte(config) + return synthetic.DefaultSourceConfig().BuildFromJSON(encoded) + } +} + +func main() { + flag.Parse() + beam.Init() + ctx := context.Background() + + p, s := beam.NewPipelineWithRoot() + + src1 := synthetic.SourceSingle(s, parseSyntheticConfig(*syntheticConfig)) + pc1 := beam.ParDo(s, &load.RuntimeMonitor{}, src1) + + src2 := synthetic.SourceSingle(s, parseSyntheticConfig(*coSyntheticConfig)) + pc2 := beam.ParDo(s, &load.RuntimeMonitor{}, src2) + + joined := beam.CoGroupByKey(s, pc1, pc2) + pc := beam.ParDo(s, &ungroupAndReiterateFn{Iterations: *iterations}, joined) + beam.ParDo(s, &load.RuntimeMonitor{}, pc) + + presult, err := beamx.RunWithMetrics(ctx, p) + if err != nil { + log.Fatalf(ctx, "Failed to execute job: %v", err) + } + + if presult != nil { + metrics := presult.Metrics().AllMetrics() + load.PublishMetrics(metrics) + } +} diff --git a/sdks/go/test/load/combine/combine.go b/sdks/go/test/load/combine/combine.go new file mode 100644 index 000000000000..8027afc39d66 --- /dev/null +++ b/sdks/go/test/load/combine/combine.go @@ -0,0 +1,87 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bytes" + "context" + "flag" + + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/io/synthetic" + "github.com/apache/beam/sdks/go/pkg/beam/log" + "github.com/apache/beam/sdks/go/pkg/beam/transforms/top" + "github.com/apache/beam/sdks/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/go/test/load" +) + +var ( + fanout = flag.Int( + "fanout", + 1, + "A number of combine operations to perform in parallel.") + topCount = flag.Int( + "top_count", + 20, + "A number of greatest elements to extract from the PCollection.") + syntheticConfig = flag.String( + "input_options", + "", + "A JSON object that describes the configuration for synthetic source.") +) + +func parseSyntheticConfig() synthetic.SourceConfig { + if *syntheticConfig == "" { + panic("--input_options not provided") + } else { + encoded := []byte(*syntheticConfig) + return synthetic.DefaultSourceConfig().BuildFromJSON(encoded) + } +} + +func compareLess(key []byte, value []byte) bool { + return bytes.Compare(key, value) < 0 +} + +func getElement(key []byte, value [][]byte, emit func([]byte, []byte)) { + emit(key, value[0]) +} + +func main() { + flag.Parse() + beam.Init() + + ctx := context.Background() + + p, s := beam.NewPipelineWithRoot() + src := synthetic.SourceSingle(s, parseSyntheticConfig()) + src = beam.ParDo(s, &load.RuntimeMonitor{}, src) + for i := 0; i < *fanout; i++ { + pcoll := top.LargestPerKey(s, src, *topCount, compareLess) + pcoll = beam.ParDo(s, getElement, pcoll) + pcoll = beam.ParDo(s, &load.RuntimeMonitor{}, pcoll) + } + + presult, err := beamx.RunWithMetrics(ctx, p) + if err != nil { + log.Fatalf(ctx, "Failed to execute job: %v", err) + } + + if presult != nil { + metrics := presult.Metrics().AllMetrics() + load.PublishMetrics(metrics) + } +} diff --git a/sdks/go/test/load/group_by_key/group_by_key.go b/sdks/go/test/load/group_by_key/group_by_key.go new file mode 100644 index 000000000000..b32640f1a762 --- /dev/null +++ b/sdks/go/test/load/group_by_key/group_by_key.go @@ -0,0 +1,89 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This is GroupByKey load test with Synthetic Source. + +package main + +import ( + "context" + "flag" + + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/io/synthetic" + "github.com/apache/beam/sdks/go/pkg/beam/log" + "github.com/apache/beam/sdks/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/go/test/load" +) + +var ( + fanout = flag.Int( + "fanout", + 1, + "A number of GroupByKey operations to perform in parallel.") + iterations = flag.Int( + "iterations", + 1, + "A number of reiterations over per-key-grouped values to perform.") + syntheticConfig = flag.String( + "input_options", + "", + "A JSON object that describes the configuration for synthetic source.") +) + +func parseSyntheticConfig() synthetic.SourceConfig { + if *syntheticConfig == "" { + panic("--input_options not provided") + } else { + encoded := []byte(*syntheticConfig) + return synthetic.DefaultSourceConfig().BuildFromJSON(encoded) + } +} + +func main() { + flag.Parse() + beam.Init() + + ctx := context.Background() + + p, s := beam.NewPipelineWithRoot() + src := synthetic.SourceSingle(s, parseSyntheticConfig()) + src = beam.ParDo(s, &load.RuntimeMonitor{}, src) + for i := 0; i < *fanout; i++ { + pcoll := beam.GroupByKey(s, src) + pcoll = beam.ParDo(s, func(key []byte, values func(*[]byte) bool) ([]byte, []byte) { + for i := 0; i < *iterations; i++ { + var value []byte + for values(&value) { + if i == *iterations-1 { + return key, value + } + } + } + return key, []byte{0} + }, pcoll) + pcoll = beam.ParDo(s, &load.RuntimeMonitor{}, pcoll) + } + + presult, err := beamx.RunWithMetrics(ctx, p) + if err != nil { + log.Fatalf(ctx, "Failed to execute job: %v", err) + } + + if presult != nil { + metrics := presult.Metrics().AllMetrics() + load.PublishMetrics(metrics) + } +} diff --git a/sdks/go/test/load/sideinput/sideinput.go b/sdks/go/test/load/sideinput/sideinput.go new file mode 100644 index 000000000000..fac91ec9ae28 --- /dev/null +++ b/sdks/go/test/load/sideinput/sideinput.go @@ -0,0 +1,100 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "flag" + "reflect" + + "github.com/apache/beam/sdks/go/pkg/beam" + "github.com/apache/beam/sdks/go/pkg/beam/io/synthetic" + "github.com/apache/beam/sdks/go/pkg/beam/log" + "github.com/apache/beam/sdks/go/pkg/beam/x/beamx" + "github.com/apache/beam/sdks/go/test/load" +) + +func init() { + beam.RegisterDoFn(reflect.TypeOf((*doFn)(nil))) +} + +var ( + accessPercentage = flag.Int( + "access_percentage", + 100, + "Specifies the percentage of elements in the side input to be accessed.") + syntheticSourceConfig = flag.String( + "input_options", + "", + "A JSON object that describes the configuration for synthetic source") +) + +func parseSyntheticConfig() synthetic.SourceConfig { + if *syntheticSourceConfig == "" { + panic("--input_options not provided") + } else { + encoded := []byte(*syntheticSourceConfig) + return synthetic.DefaultSourceConfig().BuildFromJSON(encoded) + } +} + +type doFn struct { + ElementsToAccess int +} + +func (fn *doFn) ProcessElement(_ []byte, values func(*[]byte, *[]byte) bool, emit func([]byte, []byte)) { + var key []byte + var value []byte + i := 0 + for values(&key, &value) { + if i >= fn.ElementsToAccess { + break + } + emit(key, value) + i++ + } +} + +func main() { + flag.Parse() + beam.Init() + ctx := context.Background() + p, s := beam.NewPipelineWithRoot() + + syntheticConfig := parseSyntheticConfig() + elementsToAccess := syntheticConfig.NumElements * *accessPercentage / 100 + + src := synthetic.SourceSingle(s, syntheticConfig) + src = beam.ParDo(s, &load.RuntimeMonitor{}, src) + + src = beam.ParDo( + s, + &doFn{ElementsToAccess: elementsToAccess}, + beam.Impulse(s), + beam.SideInput{Input: src}) + + beam.ParDo(s, &load.RuntimeMonitor{}, src) + + presult, err := beamx.RunWithMetrics(ctx, p) + if err != nil { + log.Fatalf(ctx, "Failed to execute job: %v", err) + } + + if presult != nil { + metrics := presult.Metrics().AllMetrics() + load.PublishMetrics(metrics) + } +} diff --git a/sdks/go/test/run_integration_tests.sh b/sdks/go/test/run_integration_tests.sh index 11230638ded2..eff6c96cc704 100755 --- a/sdks/go/test/run_integration_tests.sh +++ b/sdks/go/test/run_integration_tests.sh @@ -202,7 +202,7 @@ s.close() fi echo ">>> RUNNING $RUNNER INTEGRATION TESTS" -./sdks/go/build/bin/integration \ +./sdks/go/build/bin/integration/driver \ --runner=$RUNNER \ --project=$DATAFLOW_PROJECT \ --region=$REGION \ diff --git a/sdks/go/test/run_validatesrunner_tests.sh b/sdks/go/test/run_validatesrunner_tests.sh new file mode 100755 index 000000000000..8d0014425084 --- /dev/null +++ b/sdks/go/test/run_validatesrunner_tests.sh @@ -0,0 +1,291 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script executes ValidatesRunner tests including launching any additional +# services needed, such as job services or expansion services. This script +# should be executed from the root of the Beam repository. +# +# The following runners are supported, and selected via a flag: +# --runner {portable|direct|flink} (default: portable) +# Select which runner to execute tests on. This flag also determines which +# services to start up and which tests may be skipped. +# direct - Go SDK Direct Runner +# portable - (default) Python Portable Runner (aka. Reference Runner or FnAPI Runner) +# flink - Java Flink Runner (local mode) +# spark - Java Spark Runner (local mode) +# dataflow - Dataflow Runner +# +# General flags: +# --timeout -> Timeout for the go test command, on a per-package level. +# --endpoint -> An endpoint for an existing job server outside the script. +# If present, job server jar flags are ignored. +# --expansion_service_jar -> Filepath to jar for expansion service, for +# runners that support cross-language. +# --expansion_addr -> An endpoint for an existing expansion service outside +# the script. If present, --expansion_service_jar is ignored. +# +# Runner-specific flags: +# Flink +# --flink_job_server_jar -> Filepath to jar, used if runner is Flink. +# Spark +# --spark_job_server_jar -> Filepath to jar, used if runner is Spark. +# Dataflow +# --dataflow_project -> GCP project to run Dataflow jobs on. +# --project -> Same project as --dataflow-project, but in URL format, for +# example in the format "us.gcr.io/". +# --region -> GCP region to run Dataflow jobs on. +# --gcs_location -> GCS URL for storing temporary files for Dataflow jobs. +# --dataflow_worker_jar -> The Dataflow worker jar to use when running jobs. +# If not specified, the script attempts to retrieve a previously built +# jar from the appropriate gradle module, which may not succeed. + +set -e +set -v + +# Default runner. +RUNNER=portable + +# Default timeout. This timeout is applied per-package, as tests in different +# packages are executed in parallel. +TIMEOUT=1h + +# Where to store integration test outputs. +GCS_LOCATION=gs://temp-storage-for-end-to-end-tests + +# Project for the container and integration test +PROJECT=apache-beam-testing +DATAFLOW_PROJECT=apache-beam-testing +REGION=us-central1 + +# Set up trap to close any running background processes when script ends. +exit_background_processes () { + if [[ ! -z "$JOBSERVER_PID" ]]; then + kill -9 $JOBSERVER_PID + fi + if [[ ! -z "$EXPANSION_PID" ]]; then + kill -9 $EXPANSION_PID + fi +} +trap exit_background_processes SIGINT SIGTERM EXIT + +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + --runner) + RUNNER="$2" + shift # past argument + shift # past value + ;; + --timeout) + TIMEOUT="$2" + shift # past argument + shift # past value + ;; + --project) + PROJECT="$2" + shift # past argument + shift # past value + ;; + --region) + REGION="$2" + shift # past argument + shift # past value + ;; + --dataflow_project) + DATAFLOW_PROJECT="$2" + shift # past argument + shift # past value + ;; + --gcs_location) + GCS_LOCATION="$2" + shift # past argument + shift # past value + ;; + --dataflow_worker_jar) + DATAFLOW_WORKER_JAR="$2" + shift # past argument + shift # past value + ;; + --flink_job_server_jar) + FLINK_JOB_SERVER_JAR="$2" + shift # past argument + shift # past value + ;; + --spark_job_server_jar) + SPARK_JOB_SERVER_JAR="$2" + shift # past argument + shift # past value + ;; + --endpoint) + ENDPOINT="$2" + shift # past argument + shift # past value + ;; + --expansion_service_jar) + EXPANSION_SERVICE_JAR="$2" + shift # past argument + shift # past value + ;; + --expansion_addr) + EXPANSION_ADDR="$2" + shift # past argument + shift # past value + ;; + *) # unknown option + echo "Unknown option: $1" + exit 1 + ;; +esac +done + +# Go to the root of the repository +cd $(git rev-parse --show-toplevel) + +# Verify in the root of the repository +test -d sdks/go/test + +# Hacky python script to find a free port. Note there is a small chance the chosen port could +# get taken before being claimed by the job server. +SOCKET_SCRIPT=" +import socket +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.bind(('localhost', 0)) +print(s.getsockname()[1]) +s.close() +" + +# Set up environment based on runner. +if [[ "$RUNNER" == "dataflow" ]]; then + if [[ -z "$DATAFLOW_WORKER_JAR" ]]; then + DATAFLOW_WORKER_JAR=$(find ./runners/google-cloud-dataflow-java/worker/build/libs/beam-runners-google-cloud-dataflow-java-fn-api-worker-*.jar) + fi + echo "Using Dataflow worker jar: $DATAFLOW_WORKER_JAR" + ARGS="-timeout 20m" + + if [[ -z "$EXPANSION_ADDR" ]]; then + EXPANSION_PORT=$(python -c "$SOCKET_SCRIPT") + EXPANSION_ADDR="localhost:$EXPANSION_PORT" + echo "No expansion address specified; starting a new expansion server on $EXPANSION_ADDR" + java -jar $EXPANSION_SERVICE_JAR $EXPANSION_PORT & + EXPANSION_PID=$! + fi +elif [[ "$RUNNER" == "flink" || "$RUNNER" == "spark" || "$RUNNER" == "portable" ]]; then + if [[ -z "$ENDPOINT" ]]; then + JOB_PORT=$(python -c "$SOCKET_SCRIPT") + ENDPOINT="localhost:$JOB_PORT" + echo "No endpoint specified; starting a new $RUNNER job server on $ENDPOINT" + if [[ "$RUNNER" == "flink" ]]; then + java \ + -jar $FLINK_JOB_SERVER_JAR \ + --flink-master [local] \ + --job-port $JOB_PORT \ + --expansion-port 0 \ + --artifact-port 0 & + elif [[ "$RUNNER" == "spark" ]]; then + java \ + -jar $SPARK_JOB_SERVER_JAR \ + --spark-master-url local \ + --job-port $JOB_PORT \ + --expansion-port 0 \ + --artifact-port 0 & + ARGS="-p 1" # Spark runner fails if jobs are run concurrently. + elif [[ "$RUNNER" == "portable" ]]; then + python \ + -m apache_beam.runners.portability.local_job_service_main \ + --port $JOB_PORT & + else + echo "Unknown runner: $RUNNER" + exit 1; + fi + JOBSERVER_PID=$! + fi + + if [[ -z "$EXPANSION_ADDR" ]]; then + EXPANSION_PORT=$(python -c "$SOCKET_SCRIPT") + EXPANSION_ADDR="localhost:$EXPANSION_PORT" + echo "No expansion address specified; starting a new expansion server on $EXPANSION_ADDR" + java -jar $EXPANSION_SERVICE_JAR $EXPANSION_PORT & + EXPANSION_PID=$! + fi +fi + +if [[ "$RUNNER" == "dataflow" ]]; then + # Verify docker and gcloud commands exist + command -v docker + docker -v + command -v gcloud + gcloud --version + + # ensure gcloud is version 186 or above + TMPDIR=$(mktemp -d) + gcloud_ver=$(gcloud -v | head -1 | awk '{print $4}') + if [[ "$gcloud_ver" < "186" ]] + then + pushd $TMPDIR + curl https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-186.0.0-linux-x86_64.tar.gz --output gcloud.tar.gz + tar xf gcloud.tar.gz + ./google-cloud-sdk/install.sh --quiet + . ./google-cloud-sdk/path.bash.inc + popd + gcloud components update --quiet || echo 'gcloud components update failed' + gcloud -v + fi + + # Build the container + TAG=$(date +%Y%m%d-%H%M%S) + CONTAINER=us.gcr.io/$PROJECT/$USER/beam_go_sdk + echo "Using container $CONTAINER" + ./gradlew :sdks:go:container:docker -Pdocker-repository-root=us.gcr.io/$PROJECT/$USER -Pdocker-tag=$TAG + + # Verify it exists + docker images | grep $TAG + + # Push the container + gcloud docker -- push $CONTAINER +else + TAG=dev + ./gradlew :sdks:go:container:docker -Pdocker-tag=$TAG + CONTAINER=apache/beam_go_sdk +fi + +echo ">>> RUNNING $RUNNER VALIDATESRUNNER TESTS" +go test -v ./sdks/go/test/integration/... $ARGS \ + --timeout=$TIMEOUT \ + --runner=$RUNNER \ + --project=$DATAFLOW_PROJECT \ + --region=$REGION \ + --environment_type=DOCKER \ + --environment_config=$CONTAINER:$TAG \ + --staging_location=$GCS_LOCATION/staging-validatesrunner-test \ + --temp_location=$GCS_LOCATION/temp-validatesrunner-test \ + --dataflow_worker_jar=$DATAFLOW_WORKER_JAR \ + --endpoint=$ENDPOINT \ + --expansion_addr=$EXPANSION_ADDR \ + || TEST_EXIT_CODE=$? # don't fail fast here; clean up environment before exiting + +if [[ "$RUNNER" == "dataflow" ]]; then + # Delete the container locally and remotely + docker rmi $CONTAINER:$TAG || echo "Failed to remove container" + gcloud --quiet container images delete $CONTAINER:$TAG || echo "Failed to delete container" + + # Clean up tempdir + rm -rf $TMPDIR +fi + +exit_background_processes +exit $TEST_EXIT_CODE diff --git a/sdks/java/build-tools/beam-linkage-check.sh b/sdks/java/build-tools/beam-linkage-check.sh index 0ed30c96f2a0..0672c6077ab5 100755 --- a/sdks/java/build-tools/beam-linkage-check.sh +++ b/sdks/java/build-tools/beam-linkage-check.sh @@ -36,46 +36,60 @@ set -o pipefail set -e # These default artifacts are common causes of linkage errors. -ARTIFACTS="beam-sdks-java-core - beam-sdks-java-io-google-cloud-platform - beam-runners-google-cloud-dataflow-java - beam-sdks-java-io-hadoop-format" - -if [ ! -z "$1" ]; then - ARTIFACTS=$1 +DEFAULT_ARTIFACT_LISTS=" \ + beam-sdks-java-core \ + beam-sdks-java-io-google-cloud-platform \ + beam-runners-google-cloud-dataflow-java \ + beam-sdks-java-io-hadoop-format \ +" + +BASELINE_REF=$1 +PROPOSED_REF=$2 +ARTIFACT_LISTS=$3 + +if [ -z "$ARTIFACT_LISTS" ]; then + ARTIFACT_LISTS=$DEFAULT_ARTIFACT_LISTS fi -BRANCH_NAME=$(git symbolic-ref --short HEAD) +if [ -z "$BASELINE_REF" ] || [ -z "$PROPOSED_REF" ] || [ -z "$ARTIFACT_LISTS" ] ; then + echo "Usage: $0 [artifact lists]" + exit 1 +fi if [ ! -d buildSrc ]; then - echo "Please run this script in the Beam project root:" - echo " /bin/bash sdks/java/build-tools/beam-linkage-check.sh" - exit 1 + echo "Directory 'buildSrc' not found. Please run this script from the root directory of a clone of the Beam git repo." fi -if [ "$BRANCH_NAME" = "master" ]; then - echo "Please run this script on a branch other than master" +if [ "$BASELINE_REF" = "$PROPOSED_REF" ]; then + echo "Baseline and proposed refs are identical; cannot compare their linkage errors!" exit 1 fi -OUTPUT_DIR=build/linkagecheck -mkdir -p $OUTPUT_DIR - if [ ! -z "$(git diff)" ]; then echo "Uncommited change detected. Please commit changes and ensure 'git diff' is empty." exit 1 fi +STARTING_REF=$(git rev-parse --abbrev-ref HEAD) +function cleanup() { + git checkout $STARTING_REF +} +trap cleanup EXIT + +echo "Comparing linkage of artifact lists $ARTIFACT_LISTS using baseline $BASELINE_REF and proposal $PROPOSED_REF" + +OUTPUT_DIR=build/linkagecheck +mkdir -p $OUTPUT_DIR + ACCUMULATED_RESULT=0 function runLinkageCheck () { - COMMIT=$1 - BRANCH=$2 - MODE=$3 # "baseline" or "validate" - for ARTIFACT in $ARTIFACTS; do - echo "`date`:" "Running linkage check (${MODE}) for ${ARTIFACT} in ${BRANCH}" + MODE=$1 # "baseline" or "validate" - BASELINE_FILE=${OUTPUT_DIR}/baseline-${ARTIFACT}.xml + for ARTIFACT_LIST in $ARTIFACT_LISTS; do + echo "`date`:" "Running linkage check (${MODE}) for ${ARTIFACT_LISTS}" + + BASELINE_FILE=${OUTPUT_DIR}/baseline-${ARTIFACT_LIST}.xml if [ "$MODE" = "baseline" ]; then BASELINE_OPTION="-PjavaLinkageWriteBaseline=${BASELINE_FILE}" echo "`date`:" "to create a baseline (existing errors before change) $BASELINE_FILE" @@ -88,9 +102,11 @@ function runLinkageCheck () { fi set +e - ./gradlew -Ppublishing -PjavaLinkageArtifactIds=$ARTIFACT ${BASELINE_OPTION} :checkJavaLinkage + set -x + ./gradlew -Ppublishing -PskipCheckerFramework -PjavaLinkageArtifactIds=$ARTIFACT_LIST ${BASELINE_OPTION} :checkJavaLinkage RESULT=$? set -e + set +x if [ "$MODE" = "validate" ]; then echo "`date`:" "Done: ${RESULT}" ACCUMULATED_RESULT=$((ACCUMULATED_RESULT | RESULT)) @@ -98,19 +114,13 @@ function runLinkageCheck () { done } +echo "Establishing baseline linkage for $(git rev-parse --abbrev-ref $BASELINE_REF)" +git -c advice.detachedHead=false checkout $BASELINE_REF +runLinkageCheck baseline -BRANCH_NAME=`git rev-parse --abbrev-ref HEAD` -BRANCH_COMMIT=`git rev-parse --short=8 HEAD` - -git fetch -MASTER_COMMIT=`git rev-parse --short=8 origin/master` -git -c advice.detachedHead=false checkout $MASTER_COMMIT -runLinkageCheck $MASTER_COMMIT master baseline - - -# Restore original branch -git checkout $BRANCH_NAME -runLinkageCheck $BRANCH_COMMIT $BRANCH_NAME validate +echo "Checking linkage for $(git rev-parse --abbrev-ref $PROPOSED_REF)" +git -c advice.detachedHEad=false checkout $PROPOSED_REF +runLinkageCheck validate if [ "${ACCUMULATED_RESULT}" = "0" ]; then echo "No new linkage errors" diff --git a/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml b/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml index c168453be8fd..0ccd87a806e2 100644 --- a/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml +++ b/sdks/java/build-tools/src/main/resources/beam/checkstyle.xml @@ -119,6 +119,14 @@ page at http://checkstyle.sourceforge.net/config.html --> + + + + + + + + @@ -135,6 +143,15 @@ page at http://checkstyle.sourceforge.net/config.html --> + + + + + + + + + diff --git a/sdks/java/build-tools/src/main/resources/beam/suppressions.xml b/sdks/java/build-tools/src/main/resources/beam/suppressions.xml index 0d7c3bfab130..ee03dc303924 100644 --- a/sdks/java/build-tools/src/main/resources/beam/suppressions.xml +++ b/sdks/java/build-tools/src/main/resources/beam/suppressions.xml @@ -98,6 +98,7 @@ + @@ -118,5 +119,8 @@ + + + diff --git a/sdks/java/container/common.gradle b/sdks/java/container/common.gradle index a18cdde44783..47fa8aca0983 100644 --- a/sdks/java/container/common.gradle +++ b/sdks/java/container/common.gradle @@ -84,6 +84,8 @@ docker { project.docker_image_default_repo_root, tag: project.rootProject.hasProperty(["docker-tag"]) ? project.rootProject["docker-tag"] : project.sdk_version) + // tags used by dockerTag task + tags containerImageTags() dockerfile project.file("../Dockerfile") files "./build/" buildArgs([ diff --git a/sdks/java/core/build.gradle b/sdks/java/core/build.gradle index e8b07f66acae..99264d000a10 100644 --- a/sdks/java/core/build.gradle +++ b/sdks/java/core/build.gradle @@ -54,7 +54,6 @@ processResources { 'pom.sdk_version': sdk_version, 'pom.docker_image_default_repo_root': docker_image_default_repo_root, 'pom.docker_image_default_repo_prefix': docker_image_default_repo_prefix, - 'timestamp': new Date().format("yyyy-MM-dd HH:mm") ] } diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/annotations/Experimental.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/annotations/Experimental.java index b9a5a49f9143..48ff40de5088 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/annotations/Experimental.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/annotations/Experimental.java @@ -74,13 +74,6 @@ enum Kind { /** Experimental APIs related to customizing the output time for computed values. */ OUTPUT_TIME, - /** - * Splittable DoFn. See capability matrix - * for runner support. - */ - SPLITTABLE_DO_FN, - /** Metrics-related experimental APIs. */ METRICS, diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/AvroIO.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/AvroIO.java index 97fd464561f6..17ecdb1aeb83 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/AvroIO.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/AvroIO.java @@ -44,11 +44,13 @@ import org.apache.beam.sdk.coders.StringUtf8Coder; import org.apache.beam.sdk.io.FileBasedSink.FilenamePolicy; import org.apache.beam.sdk.io.FileIO.MatchConfiguration; +import org.apache.beam.sdk.io.FileIO.ReadableFile; import org.apache.beam.sdk.io.fs.EmptyMatchTreatment; import org.apache.beam.sdk.io.fs.ResourceId; import org.apache.beam.sdk.options.ValueProvider; import org.apache.beam.sdk.options.ValueProvider.NestedValueProvider; import org.apache.beam.sdk.options.ValueProvider.StaticValueProvider; +import org.apache.beam.sdk.schemas.utils.AvroUtils; import org.apache.beam.sdk.transforms.Create; import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.transforms.SerializableFunction; @@ -58,7 +60,6 @@ import org.apache.beam.sdk.values.PBegin; import org.apache.beam.sdk.values.PCollection; import org.apache.beam.sdk.values.PDone; -import org.apache.beam.sdk.values.TypeDescriptor; import org.apache.beam.sdk.values.TypeDescriptors; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.annotations.VisibleForTesting; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Function; @@ -197,7 +198,7 @@ * *
{@code
  * PCollection records =
- *     p.apply(AvroIO.read(...).from(...).withBeamSchemas(true);
+ *     p.apply(AvroIO.read(...).from(...).withBeamSchemas(true));
  * }
* *

Inferring Beam schemas from Avro PCollections

@@ -346,8 +347,8 @@ public static Read read(Class recordClass) { } /** - * Like {@link #read}, but reads each file in a {@link PCollection} of {@link - * FileIO.ReadableFile}, returned by {@link FileIO#readMatches}. + * Like {@link #read}, but reads each file in a {@link PCollection} of {@link ReadableFile}, + * returned by {@link FileIO#readMatches}. * *

You can read {@link GenericRecord} by using {@code #readFiles(GenericRecord.class)} or * {@code #readFiles(new Schema.Parser().parse(schema))} if the schema is a String. @@ -392,7 +393,7 @@ public static Read readGenericRecords(Schema schema) { /** * Like {@link #readGenericRecords(Schema)}, but for a {@link PCollection} of {@link - * FileIO.ReadableFile}, for example, returned by {@link FileIO#readMatches}. + * ReadableFile}, for example, returned by {@link FileIO#readMatches}. */ public static ReadFiles readFilesGenericRecords(Schema schema) { return new AutoValue_AvroIO_ReadFiles.Builder() @@ -405,7 +406,7 @@ public static ReadFiles readFilesGenericRecords(Schema schema) { /** * Like {@link #readGenericRecords(Schema)}, but for a {@link PCollection} of {@link - * FileIO.ReadableFile}, for example, returned by {@link FileIO#readMatches}. + * ReadableFile}, for example, returned by {@link FileIO#readMatches}. * * @deprecated You can achieve The functionality of {@link #readAllGenericRecords(Schema)} using * {@link FileIO} matching plus {@link #readFilesGenericRecords(Schema)}. This is the @@ -431,7 +432,7 @@ public static Read readGenericRecords(String schema) { return readGenericRecords(new Schema.Parser().parse(schema)); } - /** Like {@link #readGenericRecords(String)}, but for {@link FileIO.ReadableFile} collections. */ + /** Like {@link #readGenericRecords(String)}, but for {@link ReadableFile} collections. */ public static ReadFiles readFilesGenericRecords(String schema) { return readFilesGenericRecords(new Schema.Parser().parse(schema)); } @@ -463,8 +464,8 @@ public static Parse parseGenericRecords(SerializableFunction ParseFiles parseFilesGenericRecords( SerializableFunction parseFn) { @@ -569,16 +570,7 @@ private static TypedWrite.Builder default @Experimental(Kind.SCHEMAS) private static PCollection setBeamSchema( PCollection pc, Class clazz, @Nullable Schema schema) { - org.apache.beam.sdk.schemas.Schema beamSchema = - org.apache.beam.sdk.schemas.utils.AvroUtils.getSchema(clazz, schema); - if (beamSchema != null) { - pc.setSchema( - beamSchema, - TypeDescriptor.of(clazz), - org.apache.beam.sdk.schemas.utils.AvroUtils.getToRowFunction(clazz, schema), - org.apache.beam.sdk.schemas.utils.AvroUtils.getFromRowFunction(clazz)); - } - return pc; + return pc.setCoder(AvroUtils.schemaCoder(clazz, schema)); } /** @@ -652,9 +644,9 @@ public Read withEmptyMatchTreatment(EmptyMatchTreatment treatment) { * interval, until the given termination condition is reached. The returned {@link PCollection} * is unbounded. * - *

This works only in runners supporting {@link Kind#SPLITTABLE_DO_FN}. + *

This works only in runners supporting splittable {@link + * org.apache.beam.sdk.transforms.DoFn}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public Read watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( @@ -755,7 +747,7 @@ private static AvroSource createSource( /** Implementation of {@link #readFiles}. */ @AutoValue public abstract static class ReadFiles - extends PTransform, PCollection> { + extends PTransform, PCollection> { abstract @Nullable Class getRecordClass(); @@ -803,7 +795,7 @@ public ReadFiles withDatumReaderFactory(AvroSource.DatumReaderFactory fact } @Override - public PCollection expand(PCollection input) { + public PCollection expand(PCollection input) { checkNotNull(getSchema(), "schema"); PCollection read = input.apply( @@ -877,7 +869,6 @@ public ReadAll withEmptyMatchTreatment(EmptyMatchTreatment treatment) { } /** Like {@link Read#watchForNewFiles}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public ReadAll watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( @@ -1009,7 +1000,6 @@ public Parse withEmptyMatchTreatment(EmptyMatchTreatment treatment) { } /** Like {@link Read#watchForNewFiles}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public Parse watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( @@ -1080,7 +1070,7 @@ public void populateDisplayData(DisplayData.Builder builder) { /** Implementation of {@link #parseFilesGenericRecords}. */ @AutoValue public abstract static class ParseFiles - extends PTransform, PCollection> { + extends PTransform, PCollection> { abstract SerializableFunction getParseFn(); abstract @Nullable Coder getCoder(); @@ -1111,7 +1101,7 @@ ParseFiles withDesiredBundleSizeBytes(long desiredBundleSizeBytes) { } @Override - public PCollection expand(PCollection input) { + public PCollection expand(PCollection input) { final Coder coder = Parse.inferCoder(getCoder(), getParseFn(), input.getPipeline().getCoderRegistry()); final SerializableFunction parseFn = getParseFn(); @@ -1189,7 +1179,6 @@ public ParseAll withEmptyMatchTreatment(EmptyMatchTreatment treatment) { } /** Like {@link Read#watchForNewFiles}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public ParseAll watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/FileIO.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/FileIO.java index 07e6b10067b1..8a1e12987906 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/FileIO.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/FileIO.java @@ -562,9 +562,9 @@ public Match withEmptyMatchTreatment(EmptyMatchTreatment treatment) { /** * See {@link MatchConfiguration#continuously}. The returned {@link PCollection} is unbounded. * - *

This works only in runners supporting {@link Experimental.Kind#SPLITTABLE_DO_FN}. + *

This works only in runners supporting splittable {@link + * org.apache.beam.sdk.transforms.DoFn}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public Match continuously( Duration pollInterval, TerminationCondition terminationCondition) { return withConfiguration(getConfiguration().continuously(pollInterval, terminationCondition)); @@ -613,7 +613,6 @@ public MatchAll withEmptyMatchTreatment(EmptyMatchTreatment treatment) { } /** Like {@link Match#continuously}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public MatchAll continuously( Duration pollInterval, TerminationCondition terminationCondition) { return withConfiguration(getConfiguration().continuously(pollInterval, terminationCondition)); diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/Read.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/Read.java index 35678d4aa0db..4982066642e2 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/Read.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/Read.java @@ -17,6 +17,7 @@ */ package org.apache.beam.sdk.io; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; import com.google.auto.value.AutoValue; @@ -27,6 +28,7 @@ import java.util.Arrays; import java.util.List; import java.util.NoSuchElementException; +import java.util.concurrent.TimeUnit; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.coders.CoderException; import org.apache.beam.sdk.coders.InstantCoder; @@ -60,6 +62,9 @@ import org.apache.beam.sdk.values.ValueWithRecordId; import org.apache.beam.sdk.values.ValueWithRecordId.StripIdsDoFn; import org.apache.beam.sdk.values.ValueWithRecordId.ValueWithRecordIdCoder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.Cache; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.CacheBuilder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.RemovalListener; import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Duration; import org.joda.time.Instant; @@ -439,6 +444,8 @@ static class UnboundedSourceAsSDFWrapperFn checkpointCoder; + private Cache> cachedReaders; + private Coder> restrictionCoder; private UnboundedSourceAsSDFWrapperFn(Coder checkpointCoder) { this.checkpointCoder = checkpointCoder; @@ -450,6 +457,27 @@ public UnboundedSourceRestriction initialRestriction( return UnboundedSourceRestriction.create(element, null, BoundedWindow.TIMESTAMP_MIN_VALUE); } + @Setup + public void setUp() throws Exception { + restrictionCoder = restrictionCoder(); + cachedReaders = + CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.MINUTES) + .maximumSize(100) + .removalListener( + (RemovalListener) + removalNotification -> { + if (removalNotification.wasEvicted()) { + try { + removalNotification.getValue().close(); + } catch (IOException e) { + LOG.warn("Failed to close UnboundedReader.", e); + } + } + }) + .build(); + } + @SplitRestriction public void splitRestriction( @Restriction UnboundedSourceRestriction restriction, @@ -477,6 +505,7 @@ public void splitRestriction( UnboundedSourceRestriction.create(split, null, restriction.getWatermark())); } } catch (Exception e) { + LOG.warn("Exception while splitting source. Source not split.", e); receiver.output(restriction); } } @@ -487,7 +516,10 @@ public void splitRestriction( restrictionTracker( @Restriction UnboundedSourceRestriction restriction, PipelineOptions pipelineOptions) { - return new UnboundedSourceAsSDFRestrictionTracker(restriction, pipelineOptions); + checkNotNull(restrictionCoder); + checkNotNull(cachedReaders); + return new UnboundedSourceAsSDFRestrictionTracker( + restriction, pipelineOptions, cachedReaders, restrictionCoder); } @ProcessElement @@ -755,22 +787,47 @@ private static class UnboundedSourceAsSDFRestrictionTracker< private final PipelineOptions pipelineOptions; private UnboundedSource.UnboundedReader currentReader; private boolean readerHasBeenStarted; + private Cache> cachedReaders; + private Coder> restrictionCoder; UnboundedSourceAsSDFRestrictionTracker( UnboundedSourceRestriction initialRestriction, - PipelineOptions pipelineOptions) { + PipelineOptions pipelineOptions, + Cache> cachedReaders, + Coder> restrictionCoder) { this.initialRestriction = initialRestriction; this.pipelineOptions = pipelineOptions; + this.cachedReaders = cachedReaders; + this.restrictionCoder = restrictionCoder; + } + + private Object createCacheKey( + UnboundedSource source, CheckpointT checkpoint) { + checkNotNull(restrictionCoder); + // For caching reader, we don't care about the watermark. + return restrictionCoder.structuralValue( + UnboundedSourceRestriction.create( + source, checkpoint, BoundedWindow.TIMESTAMP_MIN_VALUE)); } @Override public boolean tryClaim(UnboundedSourceValue[] position) { try { if (currentReader == null) { - currentReader = - initialRestriction - .getSource() - .createReader(pipelineOptions, initialRestriction.getCheckpoint()); + Object cacheKey = + createCacheKey(initialRestriction.getSource(), initialRestriction.getCheckpoint()); + currentReader = cachedReaders.getIfPresent(cacheKey); + if (currentReader == null) { + currentReader = + initialRestriction + .getSource() + .createReader(pipelineOptions, initialRestriction.getCheckpoint()); + } else { + // If the reader is from cache, then we know that the reader has been started. + // We also remove this cache entry to avoid eviction. + readerHasBeenStarted = true; + cachedReaders.invalidate(cacheKey); + } } if (currentReader instanceof EmptyUnboundedSource.EmptyUnboundedReader) { return false; @@ -803,17 +860,6 @@ public boolean tryClaim(UnboundedSourceValue[] position) { } } - @Override - protected void finalize() throws Throwable { - if (currentReader != null) { - try { - currentReader.close(); - } catch (IOException e) { - LOG.error("Failed to close UnboundedReader due to failure processing bundle.", e); - } - } - } - /** The value is invalid if {@link #tryClaim} has ever thrown an exception. */ @Override public UnboundedSourceRestriction currentRestriction() { @@ -857,14 +903,17 @@ public SplitResult> trySplit( UnboundedSourceRestriction.create( EmptyUnboundedSource.INSTANCE, null, BoundedWindow.TIMESTAMP_MAX_VALUE), currentRestriction); - try { - currentReader.close(); - } catch (IOException e) { - LOG.warn("Failed to close UnboundedReader.", e); - } finally { - currentReader = - EmptyUnboundedSource.INSTANCE.createReader(null, currentRestriction.getCheckpoint()); + + if (!(currentReader instanceof EmptyUnboundedSource.EmptyUnboundedReader)) { + // We only put the reader into the cache when we know it possibly will be reused by + // residuals. + cachedReaders.put( + createCacheKey(currentRestriction.getSource(), currentRestriction.getCheckpoint()), + currentReader); } + + currentReader = + EmptyUnboundedSource.INSTANCE.createReader(null, currentRestriction.getCheckpoint()); return result; } diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java index 4d04b1e0f1e4..baae9608219e 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java @@ -352,9 +352,9 @@ public Read withCompression(Compression compression) { /** * See {@link MatchConfiguration#continuously}. * - *

This works only in runners supporting {@link Kind#SPLITTABLE_DO_FN}. + *

This works only in runners supporting splittable {@link + * org.apache.beam.sdk.transforms.DoFn}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public Read watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( @@ -497,7 +497,6 @@ public ReadAll withEmptyMatchTreatment(EmptyMatchTreatment treatment) { } /** Same as {@link Read#watchForNewFiles(Duration, TerminationCondition)}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public ReadAll watchForNewFiles( Duration pollInterval, TerminationCondition terminationCondition) { return withMatchConfiguration( diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldValueTypeInformation.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldValueTypeInformation.java index e512a05484d6..022097052349 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldValueTypeInformation.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/FieldValueTypeInformation.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Map; +import java.util.stream.Stream; import org.apache.beam.sdk.schemas.annotations.SchemaCaseFormat; import org.apache.beam.sdk.schemas.annotations.SchemaFieldName; import org.apache.beam.sdk.schemas.logicaltypes.OneOfType; @@ -176,19 +177,12 @@ public static FieldValueTypeInformation forGetter(Method method) { } private static boolean hasNullableAnnotation(Field field) { - for (Annotation annotation : field.getAnnotations()) { - if (isNullableAnnotation(annotation)) { - return true; - } - } - - for (Annotation annotation : field.getAnnotatedType().getAnnotations()) { - if (isNullableAnnotation(annotation)) { - return true; - } - } + Stream annotations = + Stream.concat( + Stream.of(field.getAnnotations()), + Stream.of(field.getAnnotatedType().getAnnotations())); - return false; + return annotations.anyMatch(FieldValueTypeInformation::isNullableAnnotation); } /** @@ -196,19 +190,26 @@ private static boolean hasNullableAnnotation(Field field) { * field is nullable. */ private static boolean hasNullableReturnType(Method method) { - for (Annotation annotation : method.getAnnotations()) { - if (isNullableAnnotation(annotation)) { - return true; - } - } + Stream annotations = + Stream.concat( + Stream.of(method.getAnnotations()), + Stream.of(method.getAnnotatedReturnType().getAnnotations())); - for (Annotation annotation : method.getAnnotatedReturnType().getAnnotations()) { - if (isNullableAnnotation(annotation)) { - return true; - } + return annotations.anyMatch(FieldValueTypeInformation::isNullableAnnotation); + } + + private static boolean hasSingleNullableParameter(Method method) { + if (method.getParameterCount() != 1) { + throw new RuntimeException( + "Setter methods should take a single argument " + method.getName()); } - return false; + Stream annotations = + Stream.concat( + Arrays.stream(method.getAnnotatedParameterTypes()[0].getAnnotations()), + Arrays.stream(method.getParameterAnnotations()[0])); + + return annotations.anyMatch(FieldValueTypeInformation::isNullableAnnotation); } /** Try to accept any Nullable annotation. */ @@ -227,13 +228,9 @@ public static FieldValueTypeInformation forSetter(Method method, String setterPr } else { throw new RuntimeException("Setter has wrong prefix " + method.getName()); } - if (method.getParameterCount() != 1) { - throw new RuntimeException("Setter methods should take a single argument."); - } + TypeDescriptor type = TypeDescriptor.of(method.getGenericParameterTypes()[0]); - boolean nullable = - Arrays.stream(method.getParameters()[0].getAnnotatedType().getAnnotations()) - .anyMatch(annotation -> isNullableAnnotation(annotation)); + boolean nullable = hasSingleNullableParameter(method); return new AutoValue_FieldValueTypeInformation.Builder() .setName(name) .setNullable(nullable) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/RowMessages.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/RowMessages.java new file mode 100644 index 000000000000..af2ff7cedbdf --- /dev/null +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/RowMessages.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.schemas; + +import static org.apache.beam.sdk.util.Preconditions.checkArgumentNotNull; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.transforms.ProcessFunction; +import org.apache.beam.sdk.transforms.SerializableFunction; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; + +@Internal +public final class RowMessages { + + private RowMessages() {} + + public static SimpleFunction bytesToRowFn( + SchemaProvider schemaProvider, + TypeDescriptor typeDescriptor, + ProcessFunction fromBytesFn) { + final SerializableFunction toRowFn = + checkArgumentNotNull(schemaProvider.toRowFunction(typeDescriptor)); + return new BytesToRowFn<>(fromBytesFn, toRowFn); + } + + public static SimpleFunction bytesToRowFn( + SchemaProvider schemaProvider, TypeDescriptor typeDescriptor, Coder coder) { + return bytesToRowFn( + schemaProvider, typeDescriptor, bytes -> coder.decode(new ByteArrayInputStream(bytes))); + } + + private static final class BytesToRowFn extends SimpleFunction { + + private final ProcessFunction fromBytesFn; + private final SerializableFunction toRowFn; + + private BytesToRowFn( + ProcessFunction fromBytesFn, SerializableFunction toRowFn) { + this.fromBytesFn = fromBytesFn; + this.toRowFn = toRowFn; + } + + @Override + public Row apply(byte[] bytes) { + final T message; + try { + message = fromBytesFn.apply(bytes); + } catch (Exception e) { + throw new IllegalStateException("Could not decode bytes as message", e); + } + return toRowFn.apply(message); + } + } + + public static SimpleFunction rowToBytesFn( + SchemaProvider schemaProvider, + TypeDescriptor typeDescriptor, + ProcessFunction toBytesFn) { + final Schema schema = checkArgumentNotNull(schemaProvider.schemaFor(typeDescriptor)); + final SerializableFunction fromRowFn = + checkArgumentNotNull(schemaProvider.fromRowFunction(typeDescriptor)); + toBytesFn = checkArgumentNotNull(toBytesFn); + return new RowToBytesFn<>(schema, fromRowFn, toBytesFn); + } + + public static SimpleFunction rowToBytesFn( + SchemaProvider schemaProvider, TypeDescriptor typeDescriptor, Coder coder) { + return rowToBytesFn(schemaProvider, typeDescriptor, message -> toBytes(coder, message)); + } + + private static byte[] toBytes(Coder coder, T message) throws IOException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + coder.encode(message, out); + return out.toByteArray(); + } + + private static final class RowToBytesFn extends SimpleFunction { + + private final Schema schema; + private final SerializableFunction fromRowFn; + private final ProcessFunction toBytesFn; + + private RowToBytesFn( + Schema schema, + SerializableFunction fromRowFn, + ProcessFunction toBytesFn) { + this.schema = schema; + this.fromRowFn = fromRowFn; + this.toBytesFn = toBytesFn; + } + + @Override + public byte[] apply(Row row) { + if (!schema.equivalent(row.getSchema())) { + row = switchFieldsOrder(row); + } + final T message = fromRowFn.apply(row); + try { + return toBytesFn.apply(message); + } catch (Exception e) { + throw new IllegalStateException("Could not encode message as bytes", e); + } + } + + private Row switchFieldsOrder(Row row) { + Row.Builder convertedRow = Row.withSchema(schema); + schema.getFields().forEach(field -> convertedRow.addValue(row.getValue(field.getName()))); + return convertedRow.build(); + } + } +} diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroUtils.java index 4b66409f5d8d..7da4f7c639fc 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/utils/AvroUtils.java @@ -28,7 +28,7 @@ import java.lang.reflect.Method; import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -453,7 +453,7 @@ public Row apply(byte[] bytes) { } catch (Exception e) { throw new AvroRuntimeException( "Could not decode avro record from given bytes " - + new String(bytes, Charset.defaultCharset()), + + new String(bytes, StandardCharsets.UTF_8), e); } } diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/state/Timers.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/state/Timers.java index 3da3bb04630e..bca398765d19 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/state/Timers.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/state/Timers.java @@ -45,7 +45,7 @@ public interface Timers { /** Set a timer with outputTimestamp. */ void setTimer(Instant timestamp, Instant outputTimestamp, TimeDomain timeDomain); - /** Removes the timer set in this context for the {@code timestmap} and {@code timeDomain}. */ + /** Removes the timer set in this context for the {@code timestamp} and {@code timeDomain}. */ void deleteTimer(Instant timestamp, TimeDomain timeDomain); /** Returns the current processing time. */ diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CoderProperties.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CoderProperties.java index 4e8195753381..311dbdc62c34 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CoderProperties.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CoderProperties.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.emptyIterable; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CombineFnTester.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CombineFnTester.java index 05a55fe84547..2c4af78abd43 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CombineFnTester.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/CombineFnTester.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/PAssert.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/PAssert.java index 5d625b5eeebf..44ca99b5c1de 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/PAssert.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/PAssert.java @@ -18,10 +18,10 @@ package org.apache.beam.sdk.testing; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/SourceTestUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/SourceTestUtils.java index c101e8c5f08e..ada42f7fb832 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/SourceTestUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/SourceTestUtils.java @@ -18,12 +18,12 @@ package org.apache.beam.sdk.testing; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/TestPipeline.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/TestPipeline.java index f613d6b9bfb6..581c5f1e93d4 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/TestPipeline.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/TestPipeline.java @@ -334,6 +334,51 @@ public PipelineResult run() { return run(getOptions()); } + /** + * Runs this {@link TestPipeline} with additional cmd pipeline option args. + * + *

This is useful when using {@link PipelineOptions#as(Class)} directly introduces circular + * dependency. + * + *

Most of logic is similar to {@link #testingPipelineOptions}. + */ + public PipelineResult runWithAdditionalOptionArgs(List additionalArgs) { + try { + @Nullable + String beamTestPipelineOptions = System.getProperty(PROPERTY_BEAM_TEST_PIPELINE_OPTIONS); + PipelineOptions options; + if (Strings.isNullOrEmpty(beamTestPipelineOptions)) { + options = PipelineOptionsFactory.create(); + } else { + List args = MAPPER.readValue(beamTestPipelineOptions, List.class); + args.addAll(additionalArgs); + String[] newArgs = new String[args.size()]; + newArgs = args.toArray(newArgs); + options = PipelineOptionsFactory.fromArgs(newArgs).as(TestPipelineOptions.class); + } + + // If no options were specified, set some reasonable defaults + if (Strings.isNullOrEmpty(beamTestPipelineOptions)) { + // If there are no provided options, check to see if a dummy runner should be used. + String useDefaultDummy = System.getProperty(PROPERTY_USE_DEFAULT_DUMMY_RUNNER); + if (!Strings.isNullOrEmpty(useDefaultDummy) && Boolean.valueOf(useDefaultDummy)) { + options.setRunner(CrashingRunner.class); + } + } + options.setStableUniqueNames(CheckEnabled.ERROR); + + FileSystems.setDefaultPipelineOptions(options); + return run(options); + } catch (IOException e) { + throw new RuntimeException( + "Unable to instantiate test options from system property " + + PROPERTY_BEAM_TEST_PIPELINE_OPTIONS + + ":" + + System.getProperty(PROPERTY_BEAM_TEST_PIPELINE_OPTIONS), + e); + } + } + /** Like {@link #run} but with the given potentially modified options. */ @Override public PipelineResult run(PipelineOptions options) { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/WindowFnTestUtils.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/WindowFnTestUtils.java index 61a209ba0055..83c60c0f01e3 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/WindowFnTestUtils.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/testing/WindowFnTestUtils.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.testing; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/ApproximateUnique.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/ApproximateUnique.java index c9430842018a..760883abac92 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/ApproximateUnique.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/ApproximateUnique.java @@ -43,20 +43,22 @@ * {@code PTransform}s for estimating the number of distinct elements in a {@code PCollection}, or * the number of distinct values associated with each key in a {@code PCollection} of {@code KV}s. * - *

Consider using {@code HllCount} in the {@code zetasketch} extension module if you need better - * performance or need to save intermediate aggregation result into a sketch for later processing. - * - *

For example, to estimate the number of distinct elements in a {@code PCollection}: - * - *

{@code
+ * @deprecated
+ *     

Consider using {@code ApproximateCountDistinct} in the {@code zetasketch} extension + * module, which makes use of the {@code HllCount} implementation. + *

If {@code ApproximateCountDistinct} does not meet your needs then you can directly use + * {@code HllCount}. Direct usage will also give you access to save intermediate aggregation + * result into a sketch for later processing. + *

For example, to estimate the number of distinct elements in a {@code PCollection}: + *

{@code
  * PCollection input = ...;
  * PCollection countDistinct =
  *     input.apply(HllCount.Init.forStrings().globally()).apply(HllCount.Extract.globally());
  * }
- * - * For more details about using {@code HllCount} and the {@code zetasketch} extension module, see - * https://s.apache.org/hll-in-beam#bookmark=id.v6chsij1ixo7. + * For more details about using {@code HllCount} and the {@code zetasketch} extension module, + * see https://s.apache.org/hll-in-beam#bookmark=id.v6chsij1ixo7. */ +@Deprecated public class ApproximateUnique { /** diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Deduplicate.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Deduplicate.java index 8f881ccf467f..42b9e96f71c1 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Deduplicate.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Deduplicate.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.transforms; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.coders.BooleanCoder; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.coders.KvCoder; @@ -66,7 +64,6 @@ * words.apply(Deduplicate.values()); * }
*/ -@Experimental(Kind.SPLITTABLE_DO_FN) public final class Deduplicate { /** The default is the {@link TimeDomain#PROCESSING_TIME processing time domain}. */ public static final TimeDomain DEFAULT_TIME_DOMAIN = TimeDomain.PROCESSING_TIME; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java index 115b48022dda..7e27b5fa55f0 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java @@ -938,7 +938,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface GetInitialRestriction {} /** @@ -994,7 +993,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface GetSize {} /** @@ -1011,7 +1009,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface GetRestrictionCoder {} /** @@ -1057,7 +1054,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface SplitRestriction {} /** @@ -1110,7 +1106,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface TruncateRestriction {} /** @@ -1148,7 +1143,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface NewTracker {} /** @@ -1189,7 +1183,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface GetInitialWatermarkEstimatorState {} /** @@ -1206,7 +1199,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface GetWatermarkEstimatorStateCoder {} /** @@ -1251,7 +1243,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface NewWatermarkEstimator {} /** @@ -1262,7 +1253,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface WatermarkEstimatorState {} /** @@ -1274,7 +1264,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface BoundedPerElement {} /** @@ -1286,7 +1275,6 @@ public interface MultiOutputReceiver { @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) - @Experimental(Kind.SPLITTABLE_DO_FN) public @interface UnboundedPerElement {} // This can't be put into ProcessContinuation itself due to the following problem: @@ -1301,7 +1289,6 @@ public interface MultiOutputReceiver { *

If the {@link ProcessElement} call completes because of a failed {@code tryClaim()} call on * the {@link RestrictionTracker}, then the call MUST return {@link #stop()}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) @AutoValue public abstract static class ProcessContinuation { /** Indicates that there is no more work to be done for the current element. */ diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/PeriodicSequence.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/PeriodicSequence.java index c15d96852ecf..f2d5e358f7c7 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/PeriodicSequence.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/PeriodicSequence.java @@ -22,7 +22,6 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; import java.util.Objects; -import org.apache.beam.sdk.annotations.Experimental; import org.apache.beam.sdk.io.range.OffsetRange; import org.apache.beam.sdk.schemas.JavaFieldSchema; import org.apache.beam.sdk.schemas.annotations.DefaultSchema; @@ -42,7 +41,6 @@ * reach given timestamp. Transform will not output elements prior to target time. Transform can * output elements at any time after target time. */ -@Experimental(Experimental.Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) @@ -92,7 +90,6 @@ public static PeriodicSequence create() { return new PeriodicSequence(); } - @Experimental(Experimental.Kind.SPLITTABLE_DO_FN) public static class OutputRangeTracker extends RestrictionTracker implements RestrictionTracker.HasProgress { private OffsetRange range; diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Watch.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Watch.java index 86d6d5cc0af6..42d8b74e5fda 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Watch.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Watch.java @@ -36,8 +36,6 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.coders.AtomicCoder; import org.apache.beam.sdk.coders.CannotProvideCoderException; import org.apache.beam.sdk.coders.Coder; @@ -125,7 +123,6 @@ *

Note: This transform works only in runners supporting Splittable DoFn: see capability matrix. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness", // TODO(https://issues.apache.org/jira/browse/BEAM-10402) "rawtypes" diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ByteKeyRangeTracker.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ByteKeyRangeTracker.java index 4b76b47528b9..c05776479122 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ByteKeyRangeTracker.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ByteKeyRangeTracker.java @@ -21,8 +21,6 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.io.range.ByteKey; import org.apache.beam.sdk.io.range.ByteKeyRange; import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker.HasProgress; @@ -39,7 +37,6 @@ *

Note, one can complete a range by claiming the {@link ByteKey#EMPTY} once one runs out of keys * to process. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/GrowableOffsetRangeTracker.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/GrowableOffsetRangeTracker.java index 039f179c03ad..d7bcec1472a7 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/GrowableOffsetRangeTracker.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/GrowableOffsetRangeTracker.java @@ -21,8 +21,6 @@ import java.math.BigDecimal; import java.math.MathContext; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.io.range.OffsetRange; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Suppliers; @@ -35,7 +33,6 @@ * *

The growable range is marked as done by claiming {@code Long.MAX_VALUE}. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultTracker.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultTracker.java index c9fc3fc75ae5..8badd5cc2a37 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultTracker.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultTracker.java @@ -17,15 +17,11 @@ */ package org.apache.beam.sdk.transforms.splittabledofn; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; - /** * Interface for restrictions for which a default implementation of {@link * org.apache.beam.sdk.transforms.DoFn.NewTracker} is available, depending only on the restriction * itself. */ -@Experimental(Kind.SPLITTABLE_DO_FN) public interface HasDefaultTracker< RestrictionT extends HasDefaultTracker, TrackerT extends RestrictionTracker> { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultWatermarkEstimator.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultWatermarkEstimator.java index fac64ad068cc..92a319d7fa49 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultWatermarkEstimator.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/HasDefaultWatermarkEstimator.java @@ -17,15 +17,12 @@ */ package org.apache.beam.sdk.transforms.splittabledofn; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; /** * Interface for watermark estimator state for which a default implementation of {@link * DoFn.NewWatermarkEstimator} is available, depending only on the watermark estimator state itself. */ -@Experimental(Kind.SPLITTABLE_DO_FN) public interface HasDefaultWatermarkEstimator< WatermarkEstimatorStateT, WatermarkEstimatorT extends WatermarkEstimator> { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.java index 0121af07ce05..1e6967cb764b 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.transforms.splittabledofn; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; import org.joda.time.Instant; @@ -27,7 +25,6 @@ * DoFn} must invoke {@link #setWatermark} to advance the watermark. See {@link * WatermarkEstimators.Manual} for a concrete implementation. */ -@Experimental(Kind.SPLITTABLE_DO_FN) public interface ManualWatermarkEstimator extends WatermarkEstimator { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/OffsetRangeTracker.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/OffsetRangeTracker.java index 015f06ad93d2..0c91a55092ee 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/OffsetRangeTracker.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/OffsetRangeTracker.java @@ -23,8 +23,6 @@ import java.math.BigDecimal; import java.math.MathContext; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.io.range.OffsetRange; import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker.HasProgress; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects; @@ -37,7 +35,6 @@ *

The smallest offset is {@code Long.MIN_VALUE} and the largest offset is {@code Long.MAX_VALUE * - 1}. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.java index 77a059212a75..669600d3feff 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.java @@ -18,8 +18,6 @@ package org.apache.beam.sdk.transforms.splittabledofn; import com.google.auto.value.AutoValue; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; import org.checkerframework.checker.nullness.qual.Nullable; @@ -34,7 +32,6 @@ * of workers and/or splitting may result if the progress is an inaccurate representation of the * known amount of completed and remaining work. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "rawtypes" // TODO(https://issues.apache.org/jira/browse/BEAM-10556) }) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/SplitResult.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/SplitResult.java index 8ff8174dd591..8c44ae403354 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/SplitResult.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/SplitResult.java @@ -18,12 +18,9 @@ package org.apache.beam.sdk.transforms.splittabledofn; import com.google.auto.value.AutoValue; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.checkerframework.checker.nullness.qual.Nullable; /** A representation of a split result. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @AutoValue @SuppressWarnings({ "rawtypes" // TODO(https://issues.apache.org/jira/browse/BEAM-10556) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/TimestampObservingWatermarkEstimator.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/TimestampObservingWatermarkEstimator.java index b21769066c29..736702c3a1b9 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/TimestampObservingWatermarkEstimator.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/TimestampObservingWatermarkEstimator.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.transforms.splittabledofn; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; import org.joda.time.Instant; @@ -26,7 +24,6 @@ * A {@link WatermarkEstimator} that observes the timestamps of all records output from a {@link * DoFn}. */ -@Experimental(Kind.SPLITTABLE_DO_FN) public interface TimestampObservingWatermarkEstimator extends WatermarkEstimator { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimator.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimator.java index 92d92487177e..4bf9269a5e98 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimator.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimator.java @@ -17,8 +17,6 @@ */ package org.apache.beam.sdk.transforms.splittabledofn; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; import org.joda.time.Instant; @@ -26,7 +24,6 @@ * A {@link WatermarkEstimator} which is used for estimating output watermarks of a splittable * {@link DoFn}. See {@link WatermarkEstimators} for commonly used watermark estimators. */ -@Experimental(Kind.SPLITTABLE_DO_FN) public interface WatermarkEstimator { /** * Return estimated output watermark. This method must return monotonically increasing watermarks diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimators.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimators.java index 75a115b589d1..63c63b8a81b7 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimators.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/WatermarkEstimators.java @@ -19,8 +19,6 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.windowing.BoundedWindow; import org.joda.time.Instant; @@ -29,7 +27,6 @@ * A set of {@link WatermarkEstimator}s that users can use to advance the output watermark for their * associated {@link DoFn splittable DoFn}s. */ -@Experimental(Kind.SPLITTABLE_DO_FN) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/package-info.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/package-info.java index 5400c49f4d33..e2722b41789e 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/package-info.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/package-info.java @@ -20,10 +20,7 @@ * {@link org.apache.beam.sdk.transforms.DoFn}. */ @DefaultAnnotation(NonNull.class) -@Experimental(Kind.SPLITTABLE_DO_FN) package org.apache.beam.sdk.transforms.splittabledofn; import edu.umd.cs.findbugs.annotations.DefaultAnnotation; -import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.annotations.Experimental.Kind; import org.checkerframework.checker.nullness.qual.NonNull; diff --git a/sdks/java/core/src/main/resources/org/apache/beam/sdk/sdk.properties b/sdks/java/core/src/main/resources/org/apache/beam/sdk/sdk.properties index 3320a4c49357..af09037ae9e5 100644 --- a/sdks/java/core/src/main/resources/org/apache/beam/sdk/sdk.properties +++ b/sdks/java/core/src/main/resources/org/apache/beam/sdk/sdk.properties @@ -18,6 +18,3 @@ version=@pom.version@ sdk_version=@pom.sdk_version@ - -build.date=@timestamp@ - diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/PipelineTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/PipelineTest.java index 2a9b11fad327..46dddeba5a67 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/PipelineTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/PipelineTest.java @@ -17,6 +17,7 @@ */ package org.apache.beam.sdk; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasItem; @@ -24,7 +25,6 @@ import static org.hamcrest.Matchers.isA; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/AvroCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/AvroCoderTest.java index 2b493097acc0..7677410d78f6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/AvroCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/AvroCoderTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import com.esotericsoftware.kryo.Kryo; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigDecimalCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigDecimalCoderTest.java index 9411e8a98675..0d5471d3edac 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigDecimalCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigDecimalCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.math.BigDecimal; import org.apache.beam.sdk.testing.CoderProperties; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianIntegerCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianIntegerCoderTest.java index 877099d80421..49ae33a2b878 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianIntegerCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianIntegerCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianLongCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianLongCoderTest.java index f79dcb52a3d3..d2d1ad9ede40 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianLongCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigEndianLongCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigIntegerCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigIntegerCoderTest.java index 8097de4d6175..ab29c50f8a51 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigIntegerCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BigIntegerCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.math.BigInteger; import org.apache.beam.sdk.testing.CoderProperties; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BitSetCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BitSetCoderTest.java index d4fe5f462856..6327c29a4fc1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BitSetCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/BitSetCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.BitSet; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteArrayCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteArrayCoderTest.java index 61617e27bce3..f650d756d51f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteArrayCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteArrayCoderTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteCoderTest.java index a1059b1b16f4..a3332e1b5542 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ByteCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderTest.java index 31f15a8f9b28..93e6c7e4bc8e 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CoderTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.Collections; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CollectionCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CollectionCoderTest.java index 2bb9bcfbc670..93265b2f294e 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CollectionCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/CollectionCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DefaultCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DefaultCoderTest.java index f34dc35aeb86..b062a356c002 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DefaultCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DefaultCoderTest.java @@ -18,8 +18,8 @@ package org.apache.beam.sdk.coders; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.Collections; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DelegateCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DelegateCoderTest.java index a659b7af0577..fdb3e876ef8a 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DelegateCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DelegateCoderTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DoubleCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DoubleCoderTest.java index 9711c7824131..cd27e184754a 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DoubleCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DoubleCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DurationCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DurationCoderTest.java index cad73abddeeb..676b605c0a9a 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DurationCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/DurationCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/FloatCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/FloatCoderTest.java index 94ee5b13f715..099df59e4816 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/FloatCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/FloatCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/InstantCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/InstantCoderTest.java index 442f045c3cd0..b6a8b37fdcbe 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/InstantCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/InstantCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/IterableCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/IterableCoderTest.java index 57e1e253823e..53f37a810adf 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/IterableCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/IterableCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/KvCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/KvCoderTest.java index f5796d97474c..48230184b982 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/KvCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/KvCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.Collections; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ListCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ListCoderTest.java index 7f9136f13d02..a44a4af23365 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ListCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/ListCoderTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.coders; import static junit.framework.TestCase.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/MapCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/MapCoderTest.java index 07ffdbc6aee8..db92ec2eb7b5 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/MapCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/MapCoderTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/NullableCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/NullableCoderTest.java index 2294aef70f45..03c977db5051 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/NullableCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/NullableCoderTest.java @@ -18,11 +18,11 @@ package org.apache.beam.sdk.coders; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.theInstance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/PCollectionCustomCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/PCollectionCustomCoderTest.java index 769023a65c7c..979a6958a8bf 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/PCollectionCustomCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/PCollectionCustomCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.junit.Assert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java index 36ae842109f3..59f13ac23be0 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.io.ByteArrayInputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SetCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SetCoderTest.java index 3359379565e9..9f727fc76098 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SetCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SetCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.Collections; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringDelegateCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringDelegateCoderTest.java index f88146124af7..f5dba3a777f0 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringDelegateCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringDelegateCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.net.URI; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringUtf8CoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringUtf8CoderTest.java index ba211dda1c8a..1dc5aea4a534 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringUtf8CoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StringUtf8CoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StructuredCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StructuredCoderTest.java index c58475a3576e..4bc759d6fa35 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StructuredCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/StructuredCoderTest.java @@ -17,6 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -28,7 +30,6 @@ import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; import org.checkerframework.checker.nullness.qual.Nullable; import org.hamcrest.CoreMatchers; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -170,7 +171,7 @@ public void testStructuralValue() throws Exception { /** Test for verifying {@link StructuredCoder#toString()}. */ @Test public void testToString() { - Assert.assertThat( + assertThat( new ObjectIdentityBooleanCoder().toString(), CoreMatchers.equalTo("StructuredCoderTest$ObjectIdentityBooleanCoder")); @@ -184,21 +185,21 @@ public List> getCoderArguments() { } }; - Assert.assertThat( + assertThat( coderWithArgs.toString(), CoreMatchers.equalTo("StructuredCoderTest$1(BigDecimalCoder,BigIntegerCoder)")); } @Test public void testGenericStandardCoderFallsBackToT() throws Exception { - Assert.assertThat( + assertThat( new Foo().getEncodedTypeDescriptor().getType(), CoreMatchers.not(TypeDescriptor.of(String.class).getType())); } @Test public void testGenericStandardCoder() throws Exception { - Assert.assertThat( + assertThat( new FooTwo().getEncodedTypeDescriptor(), CoreMatchers.equalTo(TypeDescriptor.of(String.class))); } diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/TextualIntegerCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/TextualIntegerCoderTest.java index f8cd5350a337..70e6e390b1fc 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/TextualIntegerCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/TextualIntegerCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarIntCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarIntCoderTest.java index adb8629efeaf..a16550c267c8 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarIntCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarIntCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarLongCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarLongCoderTest.java index 8af237853a65..40123d94287f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarLongCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VarLongCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VoidCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VoidCoderTest.java index 9f9beb2932e4..dbbef0252f68 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VoidCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/VoidCoderTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.values.TypeDescriptor; import org.junit.Test; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroIOTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroIOTest.java index 1262f8203f27..c50df7a843c6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroIOTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroIOTest.java @@ -24,10 +24,10 @@ import static org.apache.beam.sdk.transforms.Requirements.requiresSideInputs; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects.firstNonNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroSourceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroSourceTest.java index 2aac671ae4c8..4c3033d951af 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroSourceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/AvroSourceTest.java @@ -18,11 +18,11 @@ package org.apache.beam.sdk.io; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/BoundedReadFromUnboundedSourceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/BoundedReadFromUnboundedSourceTest.java index 5722df104efc..1c29694a0f2c 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/BoundedReadFromUnboundedSourceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/BoundedReadFromUnboundedSourceTest.java @@ -19,9 +19,9 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; import static org.apache.beam.sdk.util.CoderUtils.encodeToByteArray; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CompressedSourceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CompressedSourceTest.java index e91fe30ac1b2..f87275ceae16 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CompressedSourceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CompressedSourceTest.java @@ -19,6 +19,7 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; @@ -26,7 +27,6 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CountingSourceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CountingSourceTest.java index 04ca76769794..a4fe523bb0d0 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CountingSourceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/CountingSourceTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.io; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSinkTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSinkTest.java index fb1f4450c056..b1821a0268e1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSinkTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSinkTest.java @@ -19,11 +19,11 @@ import static org.apache.beam.sdk.io.WriteFiles.UNKNOWN_SHARDNUM; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Charsets.UTF_8; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSourceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSourceTest.java index ce0f7410431c..3ab03be1cf90 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSourceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileBasedSourceTest.java @@ -21,9 +21,9 @@ import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionFails; import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionSucceedsAndConsistent; import static org.apache.beam.sdk.testing.SourceTestUtils.readFromSource; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileSystemsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileSystemsTest.java index f2c4dbce07ec..b3768bc3fbb8 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileSystemsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/FileSystemsTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.io; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemRegistrarTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemRegistrarTest.java index c263146bab46..b1f77e4c4b2a 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemRegistrarTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemRegistrarTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.ServiceLoader; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemTest.java index b937920df757..792b3afb5a9f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/LocalFileSystemTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.io; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/ReadTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/ReadTest.java index 8a1c51e64d18..5f77b07ae47d 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/ReadTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/ReadTest.java @@ -24,17 +24,32 @@ import java.io.IOException; import java.io.Serializable; import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; +import java.util.stream.LongStream; +import org.apache.beam.sdk.coders.AvroCoder; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.coders.StringUtf8Coder; +import org.apache.beam.sdk.coders.VarLongCoder; +import org.apache.beam.sdk.io.CountingSource.CounterMark; import org.apache.beam.sdk.io.UnboundedSource.CheckpointMark; +import org.apache.beam.sdk.io.UnboundedSource.UnboundedReader; import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.testing.NeedsRunner; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.display.DisplayData; import org.apache.beam.sdk.transforms.reflect.DoFnInvokers; +import org.apache.beam.sdk.transforms.windowing.BoundedWindow; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Duration; +import org.joda.time.Instant; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -47,6 +62,7 @@ }) public class ReadTest implements Serializable { @Rule public transient ExpectedException thrown = ExpectedException.none(); + @Rule public final transient TestPipeline pipeline = TestPipeline.create(); @Test public void testInstantiationOfBoundedSourceAsSDFWrapper() { @@ -109,6 +125,23 @@ public void populateDisplayData(DisplayData.Builder builder) { assertThat(unboundedDisplayData, hasDisplayItem("maxReadTime", maxReadTime)); } + @Test + @Category(NeedsRunner.class) + public void testUnboundedSdfWrapperCacheStartedReaders() throws Exception { + long numElements = 1000L; + PCollection input = + pipeline.apply(Read.from(new ExpectCacheUnboundedSource(numElements))); + PAssert.that(input) + .containsInAnyOrder( + LongStream.rangeClosed(1L, numElements).boxed().collect(Collectors.toList())); + // Force the pipeline to run with one thread to ensure the reader will be reused on one DoFn + // instance. + // We are not able to use DirectOptions because of circular dependency. + pipeline + .runWithAdditionalOptionArgs(ImmutableList.of("--targetParallelism=1")) + .waitUntilFinish(); + } + private abstract static class CustomBoundedSource extends BoundedSource { @Override public List> split( @@ -139,6 +172,103 @@ private static class NotSerializableBoundedSource extends CustomBoundedSource { private static class SerializableBoundedSource extends CustomBoundedSource {} + private static class ExpectCacheUnboundedSource + extends UnboundedSource { + + private final long numElements; + + ExpectCacheUnboundedSource(long numElements) { + this.numElements = numElements; + } + + @Override + public List> split( + int desiredNumSplits, PipelineOptions options) throws Exception { + return ImmutableList.of(this); + } + + @Override + public UnboundedReader createReader( + PipelineOptions options, @Nullable CounterMark checkpointMark) throws IOException { + if (checkpointMark != null) { + throw new IOException("The reader should be retrieved from cache instead of a new one"); + } + return new ExpectCacheReader(this, checkpointMark); + } + + @Override + public Coder getOutputCoder() { + return VarLongCoder.of(); + } + + @Override + public Coder getCheckpointMarkCoder() { + return AvroCoder.of(CountingSource.CounterMark.class); + } + } + + private static class ExpectCacheReader extends UnboundedReader { + private long current; + private ExpectCacheUnboundedSource source; + + ExpectCacheReader(ExpectCacheUnboundedSource source, CounterMark checkpointMark) { + this.source = source; + if (checkpointMark == null) { + current = 0L; + } else { + current = checkpointMark.getLastEmitted(); + } + } + + @Override + public boolean start() throws IOException { + return advance(); + } + + @Override + public boolean advance() throws IOException { + current += 1; + if (current > source.numElements) { + return false; + } + return true; + } + + @Override + public Long getCurrent() throws NoSuchElementException { + return current; + } + + @Override + public Instant getCurrentTimestamp() throws NoSuchElementException { + return getWatermark(); + } + + @Override + public void close() throws IOException {} + + @Override + public Instant getWatermark() { + if (current > source.numElements) { + return BoundedWindow.TIMESTAMP_MAX_VALUE; + } + return BoundedWindow.TIMESTAMP_MIN_VALUE; + } + + @Override + public CheckpointMark getCheckpointMark() { + if (current <= 0) { + return null; + } + return new CounterMark(current, BoundedWindow.TIMESTAMP_MIN_VALUE); + } + + @Override + public UnboundedSource getCurrentSource() { + return source; + } + } + private abstract static class CustomUnboundedSource extends UnboundedSource { @Override diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOReadTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOReadTest.java index 5fa89be19126..55edbd1f88e6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOReadTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOReadTest.java @@ -27,6 +27,7 @@ import static org.apache.beam.sdk.io.Compression.UNCOMPRESSED; import static org.apache.beam.sdk.io.Compression.ZIP; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; @@ -35,7 +36,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOWriteTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOWriteTest.java index 0879fe90d164..aa4f520776f1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOWriteTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/TextIOWriteTest.java @@ -22,9 +22,9 @@ import static org.apache.beam.sdk.TestUtils.NO_LINES_ARRAY; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects.firstNonNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/WriteFilesTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/WriteFilesTest.java index 7900b8a33a74..fc50f248219c 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/WriteFilesTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/WriteFilesTest.java @@ -20,6 +20,7 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects.firstNonNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -29,7 +30,6 @@ import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.BufferedReader; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeEstimateFractionTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeEstimateFractionTest.java index 7093d1177392..1320e159cc41 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeEstimateFractionTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeEstimateFractionTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.range; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.junit.Assert.assertThat; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; import org.junit.Test; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeInterpolateKeyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeInterpolateKeyTest.java index 551815fed400..cfd318ea9ff5 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeInterpolateKeyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeInterpolateKeyTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.io.range; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.junit.Assert.assertThat; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; import org.junit.Test; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeTest.java index 0b8d91b16b34..011b36497e97 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyRangeTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.io.range; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyTest.java index 7add55374acb..13353f88a922 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/io/range/ByteKeyTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.io.range; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/metrics/MetricsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/metrics/MetricsTest.java index e89430848bda..a98feca6975d 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/metrics/MetricsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/metrics/MetricsTest.java @@ -20,9 +20,9 @@ import static org.apache.beam.sdk.metrics.MetricResultsMatchers.attemptedMetricsResult; import static org.apache.beam.sdk.metrics.MetricResultsMatchers.distributionMinMax; import static org.apache.beam.sdk.metrics.MetricResultsMatchers.metricsResult; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/options/PipelineOptionsFactoryTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/options/PipelineOptionsFactoryTest.java index ea54562b19ba..8e4efde32a64 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/options/PipelineOptionsFactoryTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/options/PipelineOptionsFactoryTest.java @@ -19,6 +19,7 @@ import static java.util.Locale.ROOT; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps.uniqueIndex; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -32,7 +33,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/options/ProxyInvocationHandlerTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/options/ProxyInvocationHandlerTest.java index db5e8ee9898f..ba497bd01f8d 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/options/ProxyInvocationHandlerTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/options/ProxyInvocationHandlerTest.java @@ -22,6 +22,7 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasNamespace; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasType; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; @@ -29,7 +30,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/PipelineRunnerTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/PipelineRunnerTest.java index dd65e4f6f097..f23ce67caa05 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/PipelineRunnerTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/PipelineRunnerTest.java @@ -18,8 +18,8 @@ package org.apache.beam.sdk.runners; import static org.apache.beam.sdk.metrics.MetricResultsMatchers.metricsResult; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.apache.beam.sdk.PipelineResult; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformHierarchyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformHierarchyTest.java index 304c2c032f23..0b33b9c66c01 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformHierarchyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformHierarchyTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.runners; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.Collections; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformTreeTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformTreeTest.java index 2dabd2455647..9aa964daec00 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformTreeTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/runners/TransformTreeTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.runners; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/AutoValueSchemaTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/AutoValueSchemaTest.java index 867b87c1493f..cabd9bd150b1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/AutoValueSchemaTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/AutoValueSchemaTest.java @@ -26,7 +26,7 @@ import com.google.auto.value.AutoValue; import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import org.apache.beam.sdk.schemas.Schema.Field; import org.apache.beam.sdk.schemas.Schema.FieldType; import org.apache.beam.sdk.schemas.annotations.DefaultSchema; @@ -50,7 +50,7 @@ }) public class AutoValueSchemaTest { static final DateTime DATE = DateTime.parse("1979-03-14"); - static final byte[] BYTE_ARRAY = "bytearray".getBytes(Charset.defaultCharset()); + static final byte[] BYTE_ARRAY = "bytearray".getBytes(StandardCharsets.UTF_8); static final StringBuilder STRING_BUILDER = new StringBuilder("stringbuilder"); static final Schema SIMPLE_SCHEMA = diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaBeanSchemaTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaBeanSchemaTest.java index 9833aceb81b9..8319a765615d 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaBeanSchemaTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaBeanSchemaTest.java @@ -26,6 +26,7 @@ import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.NESTED_ARRAY_BEAN_SCHEMA; import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.NESTED_BEAN_SCHEMA; import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.NESTED_MAP_BEAN_SCHEMA; +import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.PARAMETER_NULLABLE_BEAN_SCHEMA; import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.PRIMITIVE_ARRAY_BEAN_SCHEMA; import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.RENAMED_FIELDS_AND_SETTERS_BEAM_SCHEMA; import static org.apache.beam.sdk.schemas.utils.TestJavaBeans.SIMPLE_BEAN_SCHEMA; @@ -38,9 +39,10 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import java.lang.reflect.Executable; import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -56,6 +58,7 @@ import org.apache.beam.sdk.schemas.utils.TestJavaBeans.NestedArraysBean; import org.apache.beam.sdk.schemas.utils.TestJavaBeans.NestedBean; import org.apache.beam.sdk.schemas.utils.TestJavaBeans.NestedMapBean; +import org.apache.beam.sdk.schemas.utils.TestJavaBeans.ParameterNullableBean; import org.apache.beam.sdk.schemas.utils.TestJavaBeans.PrimitiveArrayBean; import org.apache.beam.sdk.schemas.utils.TestJavaBeans.SimpleBean; import org.apache.beam.sdk.schemas.utils.TestJavaBeans.SimpleBeanWithAnnotations; @@ -77,7 +80,7 @@ }) public class JavaBeanSchemaTest { static final DateTime DATE = DateTime.parse("1979-03-14"); - static final byte[] BYTE_ARRAY = "bytearray".getBytes(Charset.defaultCharset()); + static final byte[] BYTE_ARRAY = "bytearray".getBytes(StandardCharsets.UTF_8); private SimpleBean createSimple(String name) { return new SimpleBean( @@ -216,6 +219,37 @@ public void testNullableFromRow() throws NoSuchSchemaException { assertNull(bean.getStringBuilder()); } + /** + * [BEAM-11530] Java distinguishes between parameter annotations and type annotations. Therefore + * annotations declared without {@link java.lang.annotation.ElementType#TYPE_USE} can't be + * accessed through {@link Executable#getAnnotatedParameterTypes()}. Some {@code @Nullable} + * annotations like {@link org.apache.avro.reflect.Nullable} do not declare {@link + * java.lang.annotation.ElementType#TYPE_USE} which makes them parameter annotations once placed + * in front of a parameter. + * + * @see https://stackoverflow.com/a/37587590/5896429 + */ + @Test + public void testParameterNullableToRow() throws NoSuchSchemaException { + SchemaRegistry registry = SchemaRegistry.createDefault(); + ParameterNullableBean bean = new ParameterNullableBean(); + Row row = registry.getToRowFunction(ParameterNullableBean.class).apply(bean); + + assertEquals(1, row.getFieldCount()); + assertNull(row.getInt64("value")); + } + + @Test + public void testParameterNullableFromRow() throws NoSuchSchemaException { + SchemaRegistry registry = SchemaRegistry.createDefault(); + Row row = Row.nullRow(PARAMETER_NULLABLE_BEAN_SCHEMA); + + ParameterNullableBean bean = + registry.getFromRowFunction(ParameterNullableBean.class).apply(row); + assertNull(bean.getValue()); + } + @Test public void testToRowSerializable() throws NoSuchSchemaException { SchemaRegistry registry = SchemaRegistry.createDefault(); diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaFieldSchemaTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaFieldSchemaTest.java index bb9223ae2fe6..96df6748136a 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaFieldSchemaTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/JavaFieldSchemaTest.java @@ -43,7 +43,7 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -86,9 +86,9 @@ public class JavaFieldSchemaTest { static final DateTime DATE = DateTime.parse("1979-03-14"); static final Instant INSTANT = DateTime.parse("1979-03-15").toInstant(); - static final byte[] BYTE_ARRAY = "bytearray".getBytes(Charset.defaultCharset()); + static final byte[] BYTE_ARRAY = "bytearray".getBytes(StandardCharsets.UTF_8); static final ByteBuffer BYTE_BUFFER = - ByteBuffer.wrap("byteBuffer".getBytes(Charset.defaultCharset())); + ByteBuffer.wrap("byteBuffer".getBytes(StandardCharsets.UTF_8)); private SimplePOJO createSimple(String name) { return new SimplePOJO( diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/SchemaCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/SchemaCoderTest.java index ca60267bb302..429aa2715eb0 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/SchemaCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/SchemaCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.schemas; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import com.google.auto.value.AutoValue; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CastValidatorTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CastValidatorTest.java index 19456f936452..8818e161e815 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CastValidatorTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CastValidatorTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.schemas.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.math.BigDecimal; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CoGroupTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CoGroupTest.java index fdbf9afcc4ed..4747e157421e 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CoGroupTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/CoGroupTest.java @@ -19,8 +19,8 @@ import static junit.framework.TestCase.assertEquals; import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.junit.Assert.assertThat; import java.util.List; import java.util.Objects; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/GroupTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/GroupTest.java index 42308b184516..ec19ff6c2558 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/GroupTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/transforms/GroupTest.java @@ -20,8 +20,8 @@ import static junit.framework.TestCase.assertEquals; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.auto.value.AutoValue; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtilsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtilsTest.java index 51b221c24a6b..878b16616908 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtilsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/JavaBeanUtilsTest.java @@ -33,7 +33,7 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; import org.apache.beam.sdk.schemas.FieldValueGetter; import org.apache.beam.sdk.schemas.FieldValueSetter; @@ -131,8 +131,8 @@ public void testGeneratedSimpleGetters() { simpleBean.setaBoolean(true); simpleBean.setDateTime(DateTime.parse("1979-03-14")); simpleBean.setInstant(DateTime.parse("1979-03-15").toInstant()); - simpleBean.setBytes("bytes1".getBytes(Charset.defaultCharset())); - simpleBean.setByteBuffer(ByteBuffer.wrap("bytes2".getBytes(Charset.defaultCharset()))); + simpleBean.setBytes("bytes1".getBytes(StandardCharsets.UTF_8)); + simpleBean.setByteBuffer(ByteBuffer.wrap("bytes2".getBytes(StandardCharsets.UTF_8))); simpleBean.setBigDecimal(new BigDecimal(42)); simpleBean.setStringBuilder(new StringBuilder("stringBuilder")); @@ -155,11 +155,11 @@ public void testGeneratedSimpleGetters() { assertEquals(DateTime.parse("1979-03-15").toInstant(), getters.get(7).get(simpleBean)); assertArrayEquals( "Unexpected bytes", - "bytes1".getBytes(Charset.defaultCharset()), + "bytes1".getBytes(StandardCharsets.UTF_8), (byte[]) getters.get(8).get(simpleBean)); assertArrayEquals( "Unexpected bytes", - "bytes2".getBytes(Charset.defaultCharset()), + "bytes2".getBytes(StandardCharsets.UTF_8), (byte[]) getters.get(9).get(simpleBean)); assertEquals(new BigDecimal(42), getters.get(10).get(simpleBean)); assertEquals("stringBuilder", getters.get(11).get(simpleBean).toString()); @@ -184,8 +184,8 @@ public void testGeneratedSimpleSetters() { setters.get(5).set(simpleBean, true); setters.get(6).set(simpleBean, DateTime.parse("1979-03-14").toInstant()); setters.get(7).set(simpleBean, DateTime.parse("1979-03-15").toInstant()); - setters.get(8).set(simpleBean, "bytes1".getBytes(Charset.defaultCharset())); - setters.get(9).set(simpleBean, "bytes2".getBytes(Charset.defaultCharset())); + setters.get(8).set(simpleBean, "bytes1".getBytes(StandardCharsets.UTF_8)); + setters.get(9).set(simpleBean, "bytes2".getBytes(StandardCharsets.UTF_8)); setters.get(10).set(simpleBean, new BigDecimal(42)); setters.get(11).set(simpleBean, "stringBuilder"); @@ -198,9 +198,9 @@ public void testGeneratedSimpleSetters() { assertEquals(DateTime.parse("1979-03-14"), simpleBean.getDateTime()); assertEquals(DateTime.parse("1979-03-15").toInstant(), simpleBean.getInstant()); assertArrayEquals( - "Unexpected bytes", "bytes1".getBytes(Charset.defaultCharset()), simpleBean.getBytes()); + "Unexpected bytes", "bytes1".getBytes(StandardCharsets.UTF_8), simpleBean.getBytes()); assertEquals( - ByteBuffer.wrap("bytes2".getBytes(Charset.defaultCharset())), simpleBean.getByteBuffer()); + ByteBuffer.wrap("bytes2".getBytes(StandardCharsets.UTF_8)), simpleBean.getByteBuffer()); assertEquals(new BigDecimal(42), simpleBean.getBigDecimal()); assertEquals("stringBuilder", simpleBean.getStringBuilder().toString()); } @@ -259,10 +259,10 @@ public void testGeneratedByteBufferSetters() { BEAN_WITH_BYTE_ARRAY_SCHEMA, new SetterTypeSupplier(), new DefaultTypeConversionsFactory()); - setters.get(0).set(bean, "field1".getBytes(Charset.defaultCharset())); - setters.get(1).set(bean, "field2".getBytes(Charset.defaultCharset())); + setters.get(0).set(bean, "field1".getBytes(StandardCharsets.UTF_8)); + setters.get(1).set(bean, "field2".getBytes(StandardCharsets.UTF_8)); - assertArrayEquals("not equal", "field1".getBytes(Charset.defaultCharset()), bean.getBytes1()); - assertEquals(ByteBuffer.wrap("field2".getBytes(Charset.defaultCharset())), bean.getBytes2()); + assertArrayEquals("not equal", "field1".getBytes(StandardCharsets.UTF_8), bean.getBytes1()); + assertEquals(ByteBuffer.wrap("field2".getBytes(StandardCharsets.UTF_8)), bean.getBytes2()); } } diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/POJOUtilsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/POJOUtilsTest.java index ff05402f15b1..03477a9dbfb3 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/POJOUtilsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/POJOUtilsTest.java @@ -33,7 +33,7 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; import org.apache.beam.sdk.schemas.FieldValueGetter; import org.apache.beam.sdk.schemas.FieldValueSetter; @@ -62,9 +62,9 @@ public class POJOUtilsTest { static final DateTime DATE = DateTime.parse("1979-03-14"); static final Instant INSTANT = DateTime.parse("1979-03-15").toInstant(); - static final byte[] BYTE_ARRAY = "byteArray".getBytes(Charset.defaultCharset()); + static final byte[] BYTE_ARRAY = "byteArray".getBytes(StandardCharsets.UTF_8); static final ByteBuffer BYTE_BUFFER = - ByteBuffer.wrap("byteBuffer".getBytes(Charset.defaultCharset())); + ByteBuffer.wrap("byteBuffer".getBytes(StandardCharsets.UTF_8)); @Test public void testNullables() { diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/SchemaZipFoldTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/SchemaZipFoldTest.java index 35bb57af4852..8228acd5d1b3 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/SchemaZipFoldTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/SchemaZipFoldTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.schemas.utils; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.Collections; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/TestJavaBeans.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/TestJavaBeans.java index 091187308134..bd25428753f8 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/TestJavaBeans.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/schemas/utils/TestJavaBeans.java @@ -1330,4 +1330,21 @@ public int hashCode() { .addInt32Field("age_in_years") .addBooleanField("KnowsJavascript") .build(); + + @DefaultSchema(JavaBeanSchema.class) + public static class ParameterNullableBean { + + @org.apache.avro.reflect.Nullable private Float value; + + public @org.apache.avro.reflect.Nullable Float getValue() { + return value; + } + + public void setValue(@org.apache.avro.reflect.Nullable Float value) { + this.value = value; + } + } + + public static final Schema PARAMETER_NULLABLE_BEAN_SCHEMA = + Schema.builder().addNullableField("value", FieldType.INT64).build(); } diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/state/StateContextsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/state/StateContextsTest.java index 964f81a4a50d..6483fc241dfa 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/state/StateContextsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/state/StateContextsTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.state; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.transforms.Create; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CoderPropertiesTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CoderPropertiesTest.java index 98021b695bb8..ff8abb352283 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CoderPropertiesTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CoderPropertiesTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.io.IOException; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CombineFnTesterTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CombineFnTesterTest.java index 3c054f5b298c..f76b3e1e1890 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CombineFnTesterTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/CombineFnTesterTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.ArrayList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PAssertTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PAssertTest.java index 31e3bfa55f04..bb6d0f8ab466 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PAssertTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PAssertTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PaneExtractorsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PaneExtractorsTest.java index aa86f29aa554..d922710e3ae4 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PaneExtractorsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/PaneExtractorsTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.emptyIterable; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.transforms.windowing.BoundedWindow; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/SerializableMatchersTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/SerializableMatchersTest.java index 8aa5571f598e..9293c3e73fcd 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/SerializableMatchersTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/SerializableMatchersTest.java @@ -22,7 +22,7 @@ import static org.apache.beam.sdk.testing.SerializableMatchers.containsInAnyOrder; import static org.apache.beam.sdk.testing.SerializableMatchers.kvWithKey; import static org.apache.beam.sdk.testing.SerializableMatchers.not; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import java.io.InputStream; import java.io.OutputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/StaticWindowsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/StaticWindowsTest.java index c5d47f6b24ce..0189270342ff 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/StaticWindowsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/StaticWindowsTest.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.testing; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import org.apache.beam.sdk.transforms.windowing.BoundedWindow; import org.apache.beam.sdk.transforms.windowing.GlobalWindow; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/TestPipelineTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/TestPipelineTest.java index c32a1dc1f62e..9f26441bcc42 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/TestPipelineTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/TestPipelineTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.testing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.Serializable; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/WindowSupplierTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/WindowSupplierTest.java index 676d82014769..8d49505b7785 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/WindowSupplierTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/testing/WindowSupplierTest.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.testing; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineFnsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineFnsTest.java index 27d3f7557c53..f2fb637fd470 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineFnsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineFnsTest.java @@ -19,7 +19,7 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineTest.java index ab70ada28256..bd0c72f22d73 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CombineTest.java @@ -23,12 +23,12 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CreateTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CreateTest.java index ce6538bfc0e2..cb0828079a80 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CreateTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/CreateTest.java @@ -20,11 +20,11 @@ import static org.apache.beam.sdk.TestUtils.LINES; import static org.apache.beam.sdk.TestUtils.LINES_ARRAY; import static org.apache.beam.sdk.TestUtils.NO_LINES_ARRAY; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DistinctTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DistinctTest.java index 7b44df9fcb6f..d5bc4fdd86a1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DistinctTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DistinctTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTest.java index e97d6b3c7b00..86d82d5de385 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; -import static org.junit.Assert.assertThat; import java.io.Serializable; import org.apache.beam.sdk.testing.TestPipeline; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTesterTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTesterTest.java index 0f12ee0c1116..2d888499f6ad 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTesterTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/DoFnTesterTest.java @@ -18,11 +18,11 @@ package org.apache.beam.sdk.transforms; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItems; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/FlattenTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/FlattenTest.java index 109cf53100c1..d9cc787d0a34 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/FlattenTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/FlattenTest.java @@ -22,9 +22,9 @@ import static org.apache.beam.sdk.TestUtils.LINES_ARRAY; import static org.apache.beam.sdk.TestUtils.NO_LINES; import static org.apache.beam.sdk.TestUtils.NO_LINES_ARRAY; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.ArrayList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/GroupByKeyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/GroupByKeyTest.java index 590d27c134a6..13f6e38b8272 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/GroupByKeyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/GroupByKeyTest.java @@ -21,9 +21,9 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.junit.Assert.assertThat; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/PTransformTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/PTransformTest.java index 715dd900cb4e..e1cb59427b63 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/PTransformTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/PTransformTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.transforms; import static org.apache.beam.sdk.values.TypeDescriptors.integers; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.Serializable; import org.apache.beam.sdk.testing.NeedsRunner; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ParDoTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ParDoTest.java index 6bc09acbb51f..f45c7c31ddb5 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ParDoTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ParDoTest.java @@ -28,6 +28,7 @@ import static org.apache.beam.sdk.util.StringUtils.byteArrayToJsonString; import static org.apache.beam.sdk.util.StringUtils.jsonStringToByteArray; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.containsString; @@ -38,7 +39,6 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTest.java index f5629e2fc806..41c300a01a05 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.io.Serializable; import org.apache.beam.sdk.coders.StringUtf8Coder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTimestampsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTimestampsTest.java index 16c0acafb3e9..c76fb72325f7 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTimestampsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReifyTimestampsTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.io.Serializable; import org.apache.beam.sdk.testing.PAssert; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReshuffleTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReshuffleTest.java index 55c62cbec63c..a07c7c41d1f6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReshuffleTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/ReshuffleTest.java @@ -18,11 +18,11 @@ package org.apache.beam.sdk.transforms; import static org.apache.beam.sdk.TestUtils.KvMatcher.isKv; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.Serializable; import org.apache.beam.sdk.coders.KvCoder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/SimpleFunctionTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/SimpleFunctionTest.java index bac169ea1ff5..ef2e155b03c9 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/SimpleFunctionTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/SimpleFunctionTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.values.TypeDescriptors; import org.junit.Rule; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/WithFailuresTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/WithFailuresTest.java index 095f72ae259c..26cc7295461c 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/WithFailuresTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/WithFailuresTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.transforms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.ArrayList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataEvaluatorTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataEvaluatorTest.java index d5faa29e4621..0f14b46f975b 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataEvaluatorTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataEvaluatorTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.transforms.display; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.Set; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataMatchersTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataMatchersTest.java index de68857d6194..4aa6e6913ceb 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataMatchersTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataMatchersTest.java @@ -23,9 +23,9 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasType; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasValue; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.transforms.display.DisplayData.Builder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataTest.java index 22374456716b..8d5718604744 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/display/DisplayDataTest.java @@ -25,6 +25,7 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasType; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasValue; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.everyItem; @@ -39,7 +40,6 @@ import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import com.fasterxml.jackson.databind.JsonNode; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGbkResultTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGbkResultTest.java index bb49dd3c5b11..059899936d49 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGbkResultTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGbkResultTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.transforms.join; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.emptyIterable; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGroupByKeyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGroupByKeyTest.java index 17270a53ed4b..7bb0b8669894 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGroupByKeyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/CoGroupByKeyTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.transforms.join; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.Serializable; import java.util.ArrayList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/UnionCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/UnionCoderTest.java index 7a764e8dda28..681f41899bc0 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/UnionCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/join/UnionCoderTest.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.transforms.join; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import org.apache.beam.sdk.coders.DoubleCoder; import org.apache.beam.sdk.coders.StringUtf8Coder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnInvokersTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnInvokersTest.java index 972e33aabdef..2829e76c900f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnInvokersTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnInvokersTest.java @@ -20,12 +20,12 @@ import static org.apache.beam.sdk.transforms.DoFn.ProcessContinuation.resume; import static org.apache.beam.sdk.transforms.DoFn.ProcessContinuation.stop; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Matchers.eq; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnSignaturesTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnSignaturesTest.java index cd0b44dcdf55..97781a21f3a6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnSignaturesTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/DoFnSignaturesTest.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.transforms.reflect; import static org.apache.beam.sdk.transforms.reflect.DoFnSignaturesTestUtils.errors; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -27,7 +28,6 @@ import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/OnTimerInvokersTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/OnTimerInvokersTest.java index 7263cd2c31d4..469f7b70e6be 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/OnTimerInvokersTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/reflect/OnTimerInvokersTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.transforms.reflect; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.theInstance; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import org.apache.beam.sdk.state.TimeDomain; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/FixedWindowsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/FixedWindowsTest.java index b13a5564fd33..c3c9db0897cf 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/FixedWindowsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/FixedWindowsTest.java @@ -21,10 +21,10 @@ import static org.apache.beam.sdk.testing.WindowFnTestUtils.set; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/IntervalWindowTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/IntervalWindowTest.java index 52674239cfe2..36daef0e5c1f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/IntervalWindowTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/IntervalWindowTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.transforms.windowing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.List; import org.apache.beam.sdk.coders.Coder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/RepeatedlyTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/RepeatedlyTest.java index 036d223c1a37..81881e0881a2 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/RepeatedlyTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/RepeatedlyTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.transforms.windowing; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import org.joda.time.Duration; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SessionsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SessionsTest.java index a7e922e97831..4183dd5f6869 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SessionsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SessionsTest.java @@ -20,10 +20,10 @@ import static org.apache.beam.sdk.testing.WindowFnTestUtils.runWindowFn; import static org.apache.beam.sdk.testing.WindowFnTestUtils.set; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SlidingWindowsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SlidingWindowsTest.java index d32fccf610df..d9a9fe288325 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SlidingWindowsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/SlidingWindowsTest.java @@ -20,11 +20,11 @@ import static org.apache.beam.sdk.testing.WindowFnTestUtils.runWindowFn; import static org.apache.beam.sdk.testing.WindowFnTestUtils.set; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/WindowTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/WindowTest.java index a89742f6081b..4671aae36d86 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/WindowTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/transforms/windowing/WindowTest.java @@ -20,13 +20,13 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasKey; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.includesDisplayDataFor; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java index 4f5b6f6d0c67..3559e04a0865 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.util; import static org.apache.beam.sdk.util.ApiSurface.containsOnlyClassesMatching; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.emptyIterable; -import static org.junit.Assert.assertThat; import java.util.List; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.FluentIterable; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/BufferedElementCountingOutputStreamTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/BufferedElementCountingOutputStreamTest.java index 0d1f7d89b719..9ad70a7abfa1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/BufferedElementCountingOutputStreamTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/BufferedElementCountingOutputStreamTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.util; import static org.apache.beam.sdk.util.BufferedElementCountingOutputStream.BUFFER_POOL; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/FluentBackoffTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/FluentBackoffTest.java index 1b04361ecd87..bca3f33a3bd1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/FluentBackoffTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/FluentBackoffTest.java @@ -17,6 +17,7 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -24,7 +25,6 @@ import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.IOException; import org.joda.time.Duration; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/HistogramTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/HistogramTest.java index 199876fbdb45..2cda10fc543f 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/HistogramTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/HistogramTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import org.apache.beam.sdk.testing.ExpectedLogs; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/MoreFuturesTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/MoreFuturesTest.java index be53e042588a..4b6790d22c30 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/MoreFuturesTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/MoreFuturesTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isA; -import static org.junit.Assert.assertThat; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ReleaseInfoTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ReleaseInfoTest.java index e7b1531e088d..acf540ba09da 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ReleaseInfoTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ReleaseInfoTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.junit.Test; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/UserCodeExceptionTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/UserCodeExceptionTest.java index 90829e2e7d5d..4ffa267b7da1 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/UserCodeExceptionTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/UserCodeExceptionTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isA; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.IOException; import org.hamcrest.Description; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/VarIntTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/VarIntTest.java index 144609da1ca2..cf15adebdf37 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/VarIntTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/VarIntTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/WindowedValueTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/WindowedValueTest.java index 821c216498fd..3d1cda7e570e 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/WindowedValueTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/WindowedValueTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.Arrays; import org.apache.beam.sdk.coders.Coder; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ZipFilesTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ZipFilesTest.java index e51c02b1c566..debfa754a265 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ZipFilesTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ZipFilesTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/common/ReflectHelpersTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/common/ReflectHelpersTest.java index cd8a564079a7..f1783db35f72 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/common/ReflectHelpersTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/common/ReflectHelpersTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.util.common; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.ArrayList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/KVTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/KVTest.java index ede172985836..62b44ebb18d6 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/KVTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/KVTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.values; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.Comparator; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionListTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionListTest.java index b13a4dbf6afb..8e9812b062f2 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionListTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionListTest.java @@ -18,10 +18,10 @@ package org.apache.beam.sdk.values; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import com.google.common.testing.EqualsTester; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionTupleTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionTupleTest.java index e302c5135147..b3f0d87aea70 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionTupleTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/PCollectionTupleTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.values; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.common.testing.EqualsTester; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TupleTagTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TupleTagTest.java index 4daac49a0693..addd92123aa2 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TupleTagTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TupleTagTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.values; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Splitter; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypeDescriptorsTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypeDescriptorsTest.java index 885ebbc081e6..e33186c2a3ff 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypeDescriptorsTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypeDescriptorsTest.java @@ -23,10 +23,10 @@ import static org.apache.beam.sdk.values.TypeDescriptors.lists; import static org.apache.beam.sdk.values.TypeDescriptors.sets; import static org.apache.beam.sdk.values.TypeDescriptors.strings; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import java.util.List; import java.util.Set; diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java index 740bc805b7fb..012676b8ef14 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/values/TypedPValueTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.values; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.coders.VarIntCoder; diff --git a/sdks/java/expansion-service/src/test/java/org/apache/beam/sdk/expansion/service/ExternalTest.java b/sdks/java/expansion-service/src/test/java/org/apache/beam/sdk/expansion/service/ExternalTest.java index 564609b5b2e4..eb0c1f82fbda 100644 --- a/sdks/java/expansion-service/src/test/java/org/apache/beam/sdk/expansion/service/ExternalTest.java +++ b/sdks/java/expansion-service/src/test/java/org/apache/beam/sdk/expansion/service/ExternalTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.expansion.service; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import com.google.auto.service.AutoService; import java.io.IOException; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GceMetadataUtil.java b/sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GceMetadataUtil.java index 6736844870ae..711310217244 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GceMetadataUtil.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/main/java/org/apache/beam/sdk/extensions/gcp/util/GceMetadataUtil.java @@ -21,7 +21,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.io.CharStreams; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -50,7 +50,7 @@ static String fetchMetadata(String key) { return ""; } InputStream in = response.getEntity().getContent(); - try (final Reader reader = new InputStreamReader(in, Charset.defaultCharset())) { + try (final Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { return CharStreams.toString(reader); } } catch (IOException e) { diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemRegistrarTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemRegistrarTest.java index 10752dd42d3f..69c70a80b33e 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemRegistrarTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemRegistrarTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.extensions.gcp.storage; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.ServiceLoader; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemTest.java index 405cda2d5903..6b3c0ada8e94 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/storage/GcsFileSystemTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.extensions.gcp.storage; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/GcsUtilTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/GcsUtilTest.java index eac676dae3e5..bec10752479b 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/GcsUtilTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/GcsUtilTest.java @@ -17,6 +17,7 @@ */ package org.apache.beam.sdk.extensions.gcp.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; @@ -25,7 +26,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/LatencyRecordingHttpRequestInitializerTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/LatencyRecordingHttpRequestInitializerTest.java index 9ec8503f53a0..c517fc5d0864 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/LatencyRecordingHttpRequestInitializerTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/LatencyRecordingHttpRequestInitializerTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.extensions.gcp.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.anyInt; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/RetryHttpRequestInitializerTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/RetryHttpRequestInitializerTest.java index 673e809058c6..b18d01eca340 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/RetryHttpRequestInitializerTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/RetryHttpRequestInitializerTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.extensions.gcp.util; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.any; diff --git a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/gcsfs/GcsPathTest.java b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/gcsfs/GcsPathTest.java index e7e77e3a983c..ea047b0c6ea5 100644 --- a/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/gcsfs/GcsPathTest.java +++ b/sdks/java/extensions/google-cloud-platform-core/src/test/java/org/apache/beam/sdk/extensions/gcp/util/gcsfs/GcsPathTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.extensions.gcp.util.gcsfs; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.net.URI; diff --git a/sdks/java/extensions/ml/build.gradle b/sdks/java/extensions/ml/build.gradle index 9139caf78fdc..d7ab4caabb5e 100644 --- a/sdks/java/extensions/ml/build.gradle +++ b/sdks/java/extensions/ml/build.gradle @@ -44,11 +44,30 @@ dependencies { testRuntimeOnly project(":runners:google-cloud-dataflow-java") } -project.test { - def gcpProject = project.findProperty("gcpProject") ?: 'apache-beam-testing' - include "**/**IT.class" - def pipelineOptions = [ - "--project=${gcpProject}" - ] - systemProperty "beamTestPipelineOptions", JsonOutput.toJson(pipelineOptions) +/** + * These are integration tests with the GCP ML services and the DirectRunner. + */ +task integrationTest(type: Test) { + group = "Verification" + def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing' + def gcpTempRoot = project.findProperty('gcpTempRoot') ?: 'gs://temp-storage-for-end-to-end-tests' + systemProperty "beamTestPipelineOptions", JsonOutput.toJson([ + "--runner=DirectRunner", + "--project=${gcpProject}", + "--tempRoot=${gcpTempRoot}", + ]) + + // Disable Gradle cache: these ITs interact with live service that should always be considered "out of date" + outputs.upToDateWhen { false } + + include '**/*IT.class' + maxParallelForks 4 + classpath = sourceSets.test.runtimeClasspath + testClassesDirs = sourceSets.test.output.classesDirs +} + +task postCommit { + group = "Verification" + description = "Integration tests of ML service connectors using the DirectRunner." + dependsOn integrationTest } diff --git a/sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java b/sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java index 2fbe98a56102..c4b77382a51c 100644 --- a/sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java +++ b/sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java @@ -22,7 +22,6 @@ import com.google.protobuf.DynamicMessage; import com.google.protobuf.Message; -import java.io.IOException; import java.lang.reflect.Method; import java.util.List; import java.util.Map; @@ -32,6 +31,7 @@ import org.apache.beam.sdk.schemas.FieldValueGetter; import org.apache.beam.sdk.schemas.FieldValueTypeInformation; import org.apache.beam.sdk.schemas.GetterBasedSchemaProvider; +import org.apache.beam.sdk.schemas.RowMessages; import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.sdk.schemas.Schema.Field; import org.apache.beam.sdk.schemas.SchemaUserTypeCreator; @@ -39,7 +39,6 @@ import org.apache.beam.sdk.schemas.utils.FieldValueTypeSupplier; import org.apache.beam.sdk.schemas.utils.JavaBeanUtils; import org.apache.beam.sdk.schemas.utils.ReflectUtils; -import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.transforms.SimpleFunction; import org.apache.beam.sdk.values.Row; import org.apache.beam.sdk.values.TypeDescriptor; @@ -130,28 +129,12 @@ public SchemaUserTypeCreator schemaTypeCreator(Class targetClass, Schema sche "unchecked" }) public static SimpleFunction getProtoBytesToRowFn(Class clazz) { - checkForMessageType(clazz); - return new ProtoBytesToRowFn(clazz); - } - - private static class ProtoBytesToRowFn extends SimpleFunction { - private final ProtoCoder protoCoder; - private final SerializableFunction toRowFunction; - - public ProtoBytesToRowFn(Class clazz) { - this.protoCoder = ProtoCoder.of(clazz); - this.toRowFunction = new ProtoMessageSchema().toRowFunction(TypeDescriptor.of(clazz)); - } - - @Override - public Row apply(byte[] bytes) { - try { - T message = protoCoder.getParser().parseFrom(bytes); - return toRowFunction.apply(message); - } catch (IOException e) { - throw new IllegalArgumentException("Could not decode row from proto payload.", e); - } - } + Class protoClass = ensureMessageType(clazz); + ProtoCoder protoCoder = ProtoCoder.of(protoClass); + return RowMessages.bytesToRowFn( + new ProtoMessageSchema(), + TypeDescriptor.of(protoClass), + bytes -> protoCoder.getParser().parseFrom(bytes)); } // Other modules are not allowed to use non-vendored Message class @@ -160,37 +143,9 @@ public Row apply(byte[] bytes) { "unchecked" }) public static SimpleFunction getRowToProtoBytesFn(Class clazz) { - checkForMessageType(clazz); - return new RowToProtoBytesFn(clazz); - } - - private static class RowToProtoBytesFn extends SimpleFunction { - private final SerializableFunction toMessageFunction; - private final Schema protoSchema; - - public RowToProtoBytesFn(Class clazz) { - ProtoMessageSchema messageSchema = new ProtoMessageSchema(); - TypeDescriptor typeDescriptor = TypeDescriptor.of(clazz); - this.toMessageFunction = messageSchema.fromRowFunction(typeDescriptor); - this.protoSchema = messageSchema.schemaFor(typeDescriptor); - } - - @Override - public byte[] apply(Row row) { - if (!protoSchema.equivalent(row.getSchema())) { - row = switchFieldsOrder(row); - } - Message message = toMessageFunction.apply(row); - return message.toByteArray(); - } - - private Row switchFieldsOrder(Row row) { - Row.Builder convertedRow = Row.withSchema(protoSchema); - protoSchema - .getFields() - .forEach(field -> convertedRow.addValue(row.getValue(field.getName()))); - return convertedRow.build(); - } + Class protoClass = ensureMessageType(clazz); + return RowMessages.rowToBytesFn( + new ProtoMessageSchema(), TypeDescriptor.of(protoClass), Message::toByteArray); } private void checkForDynamicType(TypeDescriptor typeDescriptor) { @@ -200,11 +155,12 @@ private void checkForDynamicType(TypeDescriptor typeDescriptor) { } } - private static void checkForMessageType(Class clazz) { + private static Class ensureMessageType(Class clazz) { checkArgument( Message.class.isAssignableFrom(clazz), "%s is not a subtype of %s", clazz.getName(), Message.class.getSimpleName()); + return (Class) clazz; } } diff --git a/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ByteStringCoderTest.java b/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ByteStringCoderTest.java index 05d838039778..8c3ad6e3b8ff 100644 --- a/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ByteStringCoderTest.java +++ b/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ByteStringCoderTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.extensions.protobuf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.protobuf.ByteString; diff --git a/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ProtobufUtilTest.java b/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ProtobufUtilTest.java index ac2971bde6d7..f4680ba71cb9 100644 --- a/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ProtobufUtilTest.java +++ b/sdks/java/extensions/protobuf/src/test/java/org/apache/beam/sdk/extensions/protobuf/ProtobufUtilTest.java @@ -20,8 +20,8 @@ import static org.apache.beam.sdk.extensions.protobuf.ProtobufUtil.checkProto2Syntax; import static org.apache.beam.sdk.extensions.protobuf.ProtobufUtil.getRecursiveDescriptorsForClass; import static org.apache.beam.sdk.extensions.protobuf.ProtobufUtil.verifyDeterministic; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import com.google.protobuf.Any; import com.google.protobuf.Descriptors.GenericDescriptor; diff --git a/sdks/java/extensions/schemaio-expansion-service/src/test/java/org/apache/beam/sdk/extensions/schemaio/expansion/ExternalSchemaIOTransformRegistrarTest.java b/sdks/java/extensions/schemaio-expansion-service/src/test/java/org/apache/beam/sdk/extensions/schemaio/expansion/ExternalSchemaIOTransformRegistrarTest.java index 9d9bdcff3dd2..31b8dac47b7b 100644 --- a/sdks/java/extensions/schemaio-expansion-service/src/test/java/org/apache/beam/sdk/extensions/schemaio/expansion/ExternalSchemaIOTransformRegistrarTest.java +++ b/sdks/java/extensions/schemaio-expansion-service/src/test/java/org/apache/beam/sdk/extensions/schemaio/expansion/ExternalSchemaIOTransformRegistrarTest.java @@ -23,7 +23,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import javax.annotation.Nullable; import org.apache.beam.sdk.coders.RowCoder; import org.apache.beam.sdk.extensions.schemaio.expansion.ExternalSchemaIOTransformRegistrar.Configuration; @@ -49,7 +49,7 @@ public class ExternalSchemaIOTransformRegistrarTest { Row validConfigRow = Row.withSchema(validConfigSchema).addValue("value").build(); byte[] validSchemaBytes = SchemaTranslation.schemaToProto(validDataSchema, true).toByteArray(); - byte[] invalidBytes = "Nice try".getBytes(Charset.defaultCharset()); + byte[] invalidBytes = "Nice try".getBytes(StandardCharsets.UTF_8); SchemaIO schemaIO = Mockito.mock(SchemaIO.class); SchemaIOProvider schemaIOProvider = Mockito.mock(SchemaIOProvider.class); diff --git a/sdks/java/extensions/sketching/src/test/java/org/apache/beam/sdk/extensions/sketching/TDigestQuantilesTest.java b/sdks/java/extensions/sketching/src/test/java/org/apache/beam/sdk/extensions/sketching/TDigestQuantilesTest.java index 5efc34b2d19a..f2cbe875bb8a 100644 --- a/sdks/java/extensions/sketching/src/test/java/org/apache/beam/sdk/extensions/sketching/TDigestQuantilesTest.java +++ b/sdks/java/extensions/sketching/src/test/java/org/apache/beam/sdk/extensions/sketching/TDigestQuantilesTest.java @@ -18,7 +18,7 @@ package org.apache.beam.sdk.extensions.sketching; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.tdunning.math.stats.Centroid; import com.tdunning.math.stats.MergingDigest; diff --git a/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/ExternalSorterBenchmark.java b/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/ExternalSorterBenchmark.java index 620711f9ac8f..0daff56962da 100644 --- a/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/ExternalSorterBenchmark.java +++ b/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/ExternalSorterBenchmark.java @@ -19,7 +19,7 @@ import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.UUID; import org.apache.beam.sdk.extensions.sorter.ExternalSorter.Options.SorterType; @@ -48,8 +48,8 @@ private static void benchmark(Sorter sorter) throws IOException { for (int i = 0; i < N; i++) { sorter.add( KV.of( - UUID.randomUUID().toString().getBytes(Charset.defaultCharset()), - UUID.randomUUID().toString().getBytes(Charset.defaultCharset()))); + UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8), + UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8))); } int i = 0; for (KV ignored : sorter.sort()) { diff --git a/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/SortValuesTest.java b/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/SortValuesTest.java index 532fe955d7f7..fa3fbe6ae169 100644 --- a/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/SortValuesTest.java +++ b/sdks/java/extensions/sorter/src/test/java/org/apache/beam/sdk/extensions/sorter/SortValuesTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.extensions.sorter; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; import java.util.Arrays; import org.apache.beam.sdk.testing.PAssert; diff --git a/sdks/java/extensions/sql/build.gradle b/sdks/java/extensions/sql/build.gradle index 057f01c60a14..f07809f2803e 100644 --- a/sdks/java/extensions/sql/build.gradle +++ b/sdks/java/extensions/sql/build.gradle @@ -27,6 +27,7 @@ applyJavaNature( generatedClassPatterns: [ /^org\.apache\.beam\.sdk\.extensions\.sql\.impl\.parser\.impl.*/, /^org\.apache\.beam\.sdk\.extensions\.sql\.meta\.provider\.kafka\.KafkaMessages/, + /^org\.apache\.beam\.sdk\.extensions\.sql\.meta\.provider\.kafka\.thrift.*/, ], automaticModuleName: 'org.apache.beam.sdk.extensions.sql', // javacc generated code produces lint warnings @@ -62,6 +63,7 @@ dependencies { fmppTemplates library.java.vendored_calcite_1_20_0 compile project(":sdks:java:core") compile project(":sdks:java:extensions:join-library") + compile project(":sdks:java:extensions:sql:udf") compile project(path: ":runners:direct-java", configuration: "shadow") compile library.java.commons_codec compile library.java.commons_csv @@ -76,6 +78,7 @@ dependencies { provided project(":sdks:java:io:google-cloud-platform") compile project(":sdks:java:io:mongodb") provided project(":sdks:java:io:parquet") + provided project(":sdks:java:io:thrift") provided library.java.jackson_dataformat_xml provided library.java.hadoop_client provided library.java.kafka_clients @@ -87,6 +90,7 @@ dependencies { testCompile library.java.mockito_core testCompile library.java.quickcheck_core testCompile library.java.testcontainers_kafka + testCompile library.java.google_cloud_bigtable_emulator testCompile project(path: ":sdks:java:io:mongodb", configuration: "testRuntime") testRuntimeClasspath library.java.slf4j_jdk14 hadoopVersions.each {kv -> @@ -176,16 +180,6 @@ task runPojoExample(type: JavaExec) { args = ["--runner=DirectRunner"] } -// These tests become flaky when run in parallel at more than 3 threads so run them in a separate task -task runKafkaTableProviderIT(type: Test) { - outputs.upToDateWhen { false } - include '**/KafkaTableProvider*IT.class' - maxParallelForks 2 - classpath = project(":sdks:java:extensions:sql").sourceSets.test.runtimeClasspath - testClassesDirs = files(project(":sdks:java:extensions:sql").sourceSets.test.output.classesDirs) - useJUnit { } -} - task integrationTest(type: Test) { def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing' def gcsTempRoot = project.findProperty('gcsTempRoot') ?: 'gs://temp-storage-for-end-to-end-tests/' @@ -201,7 +195,6 @@ task integrationTest(type: Test) { systemProperty "beamTestPipelineOptions", JsonOutput.toJson(pipelineOptions) include '**/*IT.class' - exclude '**/KafkaTableProvider*IT.class' maxParallelForks 4 classpath = project(":sdks:java:extensions:sql") @@ -215,7 +208,6 @@ task integrationTest(type: Test) { task postCommit { group = "Verification" description = "Various integration tests" - dependsOn runKafkaTableProviderIT dependsOn integrationTest } diff --git a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java index a2eb4e23f5fa..0105ab6b84f1 100644 --- a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java +++ b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/DataCatalogTableProvider.java @@ -22,15 +22,19 @@ import com.google.api.gax.rpc.InvalidArgumentException; import com.google.api.gax.rpc.NotFoundException; import com.google.api.gax.rpc.PermissionDeniedException; +import com.google.api.gax.rpc.StatusCode.Code; import com.google.cloud.datacatalog.v1beta1.DataCatalogClient; import com.google.cloud.datacatalog.v1beta1.DataCatalogSettings; import com.google.cloud.datacatalog.v1beta1.Entry; import com.google.cloud.datacatalog.v1beta1.LookupEntryRequest; +import com.google.cloud.datacatalog.v1beta1.UpdateEntryRequest; +import com.google.protobuf.FieldMask; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.stream.Stream; +import org.apache.beam.sdk.annotations.Internal; import org.apache.beam.sdk.extensions.gcp.options.GcpOptions; import org.apache.beam.sdk.extensions.sql.impl.TableName; import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTable; @@ -44,11 +48,17 @@ import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.vendor.calcite.v1_20_0.com.google.common.collect.ImmutableList; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; import org.checkerframework.checker.nullness.qual.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.threeten.bp.Duration; /** Uses DataCatalog to get the source type and schema for a table. */ public class DataCatalogTableProvider extends FullNameTableProvider implements AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(DataCatalogTableProvider.class); + private static final TableFactory PUBSUB_TABLE_FACTORY = new PubsubTableFactory(); private static final TableFactory GCS_TABLE_FACTORY = new GcsTableFactory(); @@ -144,11 +154,38 @@ private Table loadTableFromDC(String tableName) { private static DataCatalogClient createDataCatalogClient(DataCatalogPipelineOptions options) { try { - return DataCatalogClient.create( + DataCatalogSettings.Builder builder = DataCatalogSettings.newBuilder() .setCredentialsProvider(() -> options.as(GcpOptions.class).getGcpCredential()) - .setEndpoint(options.getDataCatalogEndpoint()) - .build()); + .setEndpoint(options.getDataCatalogEndpoint()); + + // Retry permission denied errors, they are likely due to sync delay. + // Limit max retry delay to 1 minute, at that point its probably a legitimate permission error + // and we should get back to the user. + builder + .lookupEntrySettings() + .setRetryableCodes( + ImmutableSet.of(Code.PERMISSION_DENIED, Code.DEADLINE_EXCEEDED, Code.UNAVAILABLE)) + .setRetrySettings( + builder + .lookupEntrySettings() + .getRetrySettings() + .toBuilder() + .setMaxRetryDelay(Duration.ofMinutes(1L)) + .build()); + builder + .updateEntrySettings() + .setRetryableCodes( + ImmutableSet.of(Code.PERMISSION_DENIED, Code.DEADLINE_EXCEEDED, Code.UNAVAILABLE)) + .setRetrySettings( + builder + .updateEntrySettings() + .getRetrySettings() + .toBuilder() + .setMaxRetryDelay(Duration.ofMinutes(1L)) + .build()); + + return DataCatalogClient.create(builder.build()); } catch (IOException e) { throw new RuntimeException("Error creating Data Catalog client", e); } @@ -178,6 +215,24 @@ private Table toCalciteTable(String tableName, Entry entry) { return tableBuilder.get().schema(schema).name(tableName).build(); } + @Internal + public boolean setSchemaIfNotPresent(String resource, Schema schema) { + com.google.cloud.datacatalog.v1beta1.Schema dcSchema = SchemaUtils.toDataCatalog(schema); + Entry entry = + dataCatalog.lookupEntry(LookupEntryRequest.newBuilder().setSqlResource(resource).build()); + if (entry.getSchema().getColumnsCount() == 0) { + dataCatalog.updateEntry( + UpdateEntryRequest.newBuilder() + .setEntry(entry.toBuilder().setSchema(dcSchema).build()) + .setUpdateMask(FieldMask.newBuilder().addPaths("schema").build()) + .build()); + return true; + } else { + LOG.info(String.format("Not updating schema for '%s' since it already has one.", resource)); + return false; + } + } + @Override public void close() { dataCatalog.close(); diff --git a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java index 2b3bcc36bf73..1ee0847bf51c 100644 --- a/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java +++ b/sdks/java/extensions/sql/datacatalog/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtils.java @@ -32,6 +32,10 @@ import org.apache.beam.vendor.calcite.v1_20_0.com.google.common.collect.ImmutableMap; @Experimental(Kind.SCHEMAS) +@SuppressWarnings({ + "rawtypes", // TODO(https://issues.apache.org/jira/browse/BEAM-10556) + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) class SchemaUtils { private static final Map FIELD_TYPES = @@ -98,4 +102,93 @@ private static FieldType getBeamFieldType(ColumnSchema column) { throw new UnsupportedOperationException( "Field type '" + dcFieldType + "' is not supported (field '" + column.getColumn() + "')"); } + + /** Convert Beam schema to DataCatalog schema. */ + static com.google.cloud.datacatalog.v1beta1.Schema toDataCatalog(Schema schema) { + com.google.cloud.datacatalog.v1beta1.Schema.Builder schemaBuilder = + com.google.cloud.datacatalog.v1beta1.Schema.newBuilder(); + for (Schema.Field field : schema.getFields()) { + schemaBuilder.addColumns(fromBeamField(field)); + } + return schemaBuilder.build(); + } + + private static ColumnSchema fromBeamField(Schema.Field field) { + Schema.FieldType fieldType = field.getType(); + if (fieldType.getTypeName().equals(Schema.TypeName.ARRAY)) { + if (fieldType.getNullable()) { + throw new UnsupportedOperationException( + "Nullable array type is not supported in DataCatalog schemas: " + fieldType); + } else if (fieldType.getCollectionElementType().getNullable()) { + throw new UnsupportedOperationException( + "Nullable array element type is not supported in DataCatalog schemas: " + fieldType); + } else if (fieldType.getCollectionElementType().getTypeName().equals(Schema.TypeName.ARRAY)) { + throw new UnsupportedOperationException( + "Array of arrays not supported in DataCatalog schemas: " + fieldType); + } + ColumnSchema column = + fromBeamField(Field.of(field.getName(), fieldType.getCollectionElementType())); + if (!column.getMode().equals("REQUIRED")) { + // We should have bailed out earlier for any cases that would result in mode being set. + throw new AssertionError( + "ColumnSchema for collection element type has non-empty mode: " + fieldType); + } + return column.toBuilder().setMode("REPEATED").build(); + } else { // struct or primitive type + ColumnSchema.Builder colBuilder = + ColumnSchema.newBuilder().setType(getDataCatalogType(fieldType)); + + if (fieldType.getNullable()) { + colBuilder.setMode("NULLABLE"); + } else { + colBuilder.setMode("REQUIRED"); + } + + // if this is a struct, add the child columns + if (fieldType.getTypeName().equals(Schema.TypeName.ROW)) { + for (Schema.Field subField : fieldType.getRowSchema().getFields()) { + colBuilder.addSubcolumns(fromBeamField(subField)); + } + } + + return colBuilder.setColumn(field.getName()).build(); + } + } + + private static String getDataCatalogType(FieldType fieldType) { + switch (fieldType.getTypeName()) { + case INT32: + case INT64: + case BYTES: + case DOUBLE: + case STRING: + return fieldType.getTypeName().name(); + case BOOLEAN: + return "BOOL"; + case DATETIME: + return "TIMESTAMP"; + case DECIMAL: + return "NUMERIC"; + case LOGICAL_TYPE: + Schema.LogicalType logical = fieldType.getLogicalType(); + if (SqlTypes.TIME.getIdentifier().equals(logical.getIdentifier())) { + return "TIME"; + } else if (SqlTypes.DATE.getIdentifier().equals(logical.getIdentifier())) { + return "DATE"; + } else if (SqlTypes.DATETIME.getIdentifier().equals(logical.getIdentifier())) { + return "DATETIME"; + } else { + throw new UnsupportedOperationException("Unsupported logical type: " + logical); + } + case ROW: + return "STRUCT"; + case MAP: + return String.format( + "MAP<%s,%s>", + getDataCatalogType(fieldType.getMapKeyType()), + getDataCatalogType(fieldType.getMapValueType())); + default: + throw new UnsupportedOperationException("Unsupported type: " + fieldType); + } + } } diff --git a/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java new file mode 100644 index 000000000000..6afc9466f60e --- /dev/null +++ b/sdks/java/extensions/sql/datacatalog/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/datacatalog/SchemaUtilsTest.java @@ -0,0 +1,157 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.datacatalog; + +import static org.junit.Assert.assertEquals; + +import com.google.cloud.datacatalog.v1beta1.ColumnSchema; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.Schema.FieldType; +import org.apache.beam.sdk.schemas.logicaltypes.SqlTypes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link SchemaUtils}. */ +@RunWith(JUnit4.class) +public class SchemaUtilsTest { + + private static final Schema TEST_INNER_SCHEMA = + Schema.builder().addField("i1", FieldType.INT64).addField("i2", FieldType.STRING).build(); + + private static final Schema TEST_SCHEMA = + Schema.builder() + .addNullableField("f_int32", FieldType.INT32) + .addNullableField("f_int64", FieldType.INT64) + .addNullableField("f_bytes", FieldType.BYTES) + .addNullableField("f_double", FieldType.DOUBLE) + .addNullableField("f_string", FieldType.STRING) + .addNullableField("f_bool", FieldType.BOOLEAN) + .addNullableField("f_ts", FieldType.DATETIME) + .addNullableField("f_numeric", FieldType.DECIMAL) + .addLogicalTypeField("f_time", SqlTypes.TIME) + .addLogicalTypeField("f_date", SqlTypes.DATE) + .addLogicalTypeField("f_datetime", SqlTypes.DATETIME) + .addArrayField("f_array", FieldType.INT64) + .addRowField("f_struct", TEST_INNER_SCHEMA) + .build(); + + private static final com.google.cloud.datacatalog.v1beta1.Schema TEST_DC_SCHEMA = + com.google.cloud.datacatalog.v1beta1.Schema.newBuilder() + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_int32") + .setType("INT32") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_int64") + .setType("INT64") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_bytes") + .setType("BYTES") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_double") + .setType("DOUBLE") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_string") + .setType("STRING") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_bool") + .setType("BOOL") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_ts") + .setType("TIMESTAMP") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_numeric") + .setType("NUMERIC") + .setMode("NULLABLE") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_time") + .setType("TIME") + .setMode("REQUIRED") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_date") + .setType("DATE") + .setMode("REQUIRED") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_datetime") + .setType("DATETIME") + .setMode("REQUIRED") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_array") + .setType("INT64") + .setMode("REPEATED") + .build()) + .addColumns( + ColumnSchema.newBuilder() + .setColumn("f_struct") + .setType("STRUCT") + .addSubcolumns( + ColumnSchema.newBuilder() + .setColumn("i1") + .setType("INT64") + .setMode("REQUIRED") + .build()) + .addSubcolumns( + ColumnSchema.newBuilder() + .setColumn("i2") + .setType("STRING") + .setMode("REQUIRED") + .build()) + .setMode("REQUIRED") + .build()) + .build(); + + @Test + public void testFromDataCatalog() { + assertEquals(TEST_SCHEMA, SchemaUtils.fromDataCatalog(TEST_DC_SCHEMA)); + } + + @Test + public void testToDataCatalog() { + assertEquals(TEST_DC_SCHEMA, SchemaUtils.toDataCatalog(TEST_SCHEMA)); + } +} diff --git a/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineIT.java b/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineIT.java index ae9573966915..1f5bb46c71a6 100644 --- a/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineIT.java +++ b/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineIT.java @@ -21,7 +21,7 @@ import static org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLineTestingUtils.buildArgs; import static org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLineTestingUtils.toLines; import static org.hamcrest.CoreMatchers.everyItem; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineTest.java b/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineTest.java index 34bae8dc0f06..48f7f95fe541 100644 --- a/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineTest.java +++ b/sdks/java/extensions/sql/jdbc/src/test/java/org/apache/beam/sdk/extensions/sql/jdbc/BeamSqlLineTest.java @@ -20,7 +20,7 @@ import static org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLineTestingUtils.buildArgs; import static org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLineTestingUtils.toLines; import static org.hamcrest.CoreMatchers.everyItem; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflector.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflector.java new file mode 100644 index 000000000000..57a14bcc4558 --- /dev/null +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflector.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.impl; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collection; +import org.apache.beam.sdk.extensions.sql.udf.ScalarFn; +import org.apache.beam.sdk.util.common.ReflectHelpers; + +/** Reflection-based implementation logic for {@link ScalarFn}. */ +public class ScalarFnReflector { + /** + * Gets the method annotated with {@link + * org.apache.beam.sdk.extensions.sql.udf.ScalarFn.ApplyMethod} from {@code scalarFn}. + * + *

There must be exactly one method annotated with {@link + * org.apache.beam.sdk.extensions.sql.udf.ScalarFn.ApplyMethod}, and it must be public. + */ + public static Method getApplyMethod(ScalarFn scalarFn) { + Class clazz = scalarFn.getClass(); + Collection matches = + ReflectHelpers.declaredMethodsWithAnnotation( + ScalarFn.ApplyMethod.class, clazz, ScalarFn.class); + + if (matches.isEmpty()) { + throw new IllegalArgumentException( + String.format( + "No method annotated with @%s found in class %s.", + ScalarFn.ApplyMethod.class.getSimpleName(), clazz.getName())); + } + + // If we have at least one match, then either it should be the only match + // or it should be an extension of the other matches (which came from parent + // classes). + Method first = matches.iterator().next(); + for (Method other : matches) { + if (!first.getName().equals(other.getName()) + || !Arrays.equals(first.getParameterTypes(), other.getParameterTypes())) { + throw new IllegalArgumentException( + String.format( + "Found multiple methods annotated with @%s. [%s] and [%s]", + ScalarFn.ApplyMethod.class.getSimpleName(), + ReflectHelpers.formatMethod(first), + ReflectHelpers.formatMethod(other))); + } + } + + // Method must be public. + if ((first.getModifiers() & Modifier.PUBLIC) == 0) { + throw new IllegalArgumentException( + String.format("Method %s is not public.", ReflectHelpers.formatMethod(first))); + } + + return first; + } +} diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFunctionImpl.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFunctionImpl.java index da8cb269748d..df725a72a808 100644 --- a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFunctionImpl.java +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFunctionImpl.java @@ -61,8 +61,7 @@ public class ScalarFunctionImpl extends UdfImplReflectiveFunctionBase private final CallImplementor implementor; - /** Private constructor. */ - private ScalarFunctionImpl(Method method, CallImplementor implementor) { + protected ScalarFunctionImpl(Method method, CallImplementor implementor) { super(method); this.implementor = implementor; } @@ -86,24 +85,6 @@ public static ImmutableMultimap createAll(Class clazz) { return builder.build(); } - /** - * Creates {@link org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.Function} from - * given class. - * - *

If a method of the given name is not found or it does not suit, returns {@code null}. - * - * @param clazz class that is used to implement the function - * @param methodName Method name (typically "eval") - * @return created {@link ScalarFunction} or null - */ - public static Function create(Class clazz, String methodName) { - final Method method = findMethod(clazz, methodName); - if (method == null) { - return null; - } - return create(method); - } - /** * Creates {@link org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.Function} from * given method. When {@code eval} method does not suit, {@code null} is returned. @@ -112,6 +93,12 @@ public static Function create(Class clazz, String methodName) { * @return created {@link Function} or null */ public static Function create(Method method) { + validateMethod(method); + CallImplementor implementor = createImplementor(method); + return new ScalarFunctionImpl(method, implementor); + } + + protected static void validateMethod(Method method) { if (!Modifier.isStatic(method.getModifiers())) { Class clazz = method.getDeclaringClass(); if (!classHasPublicZeroArgsConstructor(clazz)) { @@ -121,9 +108,6 @@ public static Function create(Method method) { if (method.getExceptionTypes().length != 0) { throw new RuntimeException(method.getName() + " must not throw checked exception"); } - - CallImplementor implementor = createImplementor(method); - return new ScalarFunctionImpl(method, implementor); } @Override @@ -191,7 +175,7 @@ public Expression implement( } } - private static CallImplementor createImplementor(Method method) { + protected static CallImplementor createImplementor(Method method) { final NullPolicy nullPolicy = getNullPolicy(method); return RexImpTable.createImplementor( new ScalarReflectiveCallNotNullImplementor(method), nullPolicy, false); @@ -247,21 +231,6 @@ static boolean classHasPublicZeroArgsConstructor(Class clazz) { } return false; } - - /* - * Finds a method in a given class by name. - * @param clazz class to search method in - * @param name name of the method to find - * @return the first method with matching name or null when no method found - */ - static Method findMethod(Class clazz, String name) { - for (Method method : clazz.getMethods()) { - if (method.getName().equals(name) && !method.isBridge()) { - return method; - } - } - return null; - } } // End ScalarFunctionImpl.java diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilter.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilter.java new file mode 100644 index 000000000000..c3bdda77af89 --- /dev/null +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilter.java @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.byteStringUtf8; +import static org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.sql.SqlKind.LIKE; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; + +import com.google.bigtable.v2.RowFilter; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTableFilter; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rex.RexCall; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rex.RexInputRef; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rex.RexLiteral; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rex.RexNode; + +/** + * BigtableFilter for queries with WHERE clause. + * + *

Currently only queries with a single LIKE statement by key field with RE2 Syntax regex type are supported, e.g. + * `SELECT * FROM table WHERE key LIKE '^key\d'` + */ +class BigtableFilter implements BeamSqlTableFilter { + private final List supported; + private final List unsupported; + private final Schema schema; + + BigtableFilter(List predicateCNF, Schema schema) { + supported = predicateCNF.stream().filter(BigtableFilter::isSupported).collect(toList()); + unsupported = + predicateCNF.stream().filter(predicate -> !isSupported(predicate)).collect(toList()); + this.schema = schema; + } + + @Override + public List getNotSupported() { + return unsupported; + } + + @Override + public int numSupported() { + return BeamSqlTableFilter.expressionsInFilter(supported); + } + + public List getSupported() { + return supported; + } + + @Override + public String toString() { + String supStr = supported.stream().map(RexNode::toString).collect(Collectors.joining()); + String unsupStr = unsupported.stream().map(RexNode::toString).collect(Collectors.joining()); + return String.format("[supported{%s}, unsupported{%s}]", supStr, unsupStr); + } + + RowFilter getFilters() { + checkArgument( + supported.size() == 1, + String.format("Only one LIKE operation is allowed. Got %s operations", supported.size())); + return translateRexNodeToRowFilter(supported.get(0)); + } + + private RowFilter translateRexNodeToRowFilter(RexNode node) { + checkNodeIsCoposite(node); + checkArgument(LIKE.equals(node.getKind()), "Only LIKE operation is supported."); + + List literals = filterOperands((RexCall) node, RexLiteral.class); + List inputRefs = filterOperands((RexCall) node, RexInputRef.class); + + checkArgument(literals.size() == 1); + checkArgument(inputRefs.size() == 1); + + checkFieldIsKey(inputRefs.get(0)); + String literal = literals.get(0).getValueAs(String.class); + + return RowFilter.newBuilder().setRowKeyRegexFilter(byteStringUtf8(literal)).build(); + } + + private void checkFieldIsKey(RexInputRef inputRef) { + String inputFieldName = schema.getField(inputRef.getIndex()).getName(); + checkArgument( + KEY.equals(inputFieldName), + "Only 'key' queries are supported. Got field " + inputFieldName); + } + + private static boolean isSupported(RexNode node) { + checkNodeIsCoposite(node); + if (!LIKE.equals(node.getKind())) { + return false; + } + + long literalsCount = countOperands((RexCall) node, RexLiteral.class); + long fieldsCount = countOperands((RexCall) node, RexInputRef.class); + + return literalsCount == 1 && fieldsCount == 1; + } + + private List filterOperands(RexCall compositeNode, Class clazz) { + return compositeNode.getOperands().stream() + .filter(clazz::isInstance) + .map(clazz::cast) + .collect(toList()); + } + + private static long countOperands(RexCall compositeNode, Class clazz) { + return compositeNode.getOperands().stream().filter(clazz::isInstance).count(); + } + + private static void checkNodeIsCoposite(RexNode node) { + checkArgument( + node instanceof RexCall, + String.format( + "Encountered an unexpected node type: %s. Should be %s", + node.getClass().getSimpleName(), RexCall.class.getSimpleName())); + } +} diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTable.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTable.java new file mode 100644 index 000000000000..094d47b34bb0 --- /dev/null +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTable.java @@ -0,0 +1,236 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static java.util.stream.Collectors.toSet; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.COLUMNS_MAPPING; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps.newHashMap; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Sets.newHashSet; + +import com.alibaba.fastjson.JSONObject; +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.beam.sdk.annotations.Experimental; +import org.apache.beam.sdk.extensions.sql.impl.BeamTableStatistics; +import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTableFilter; +import org.apache.beam.sdk.extensions.sql.meta.SchemaBaseBeamTable; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.provider.InvalidTableException; +import org.apache.beam.sdk.io.gcp.bigtable.BeamRowToBigtableMutation; +import org.apache.beam.sdk.io.gcp.bigtable.BigtableIO; +import org.apache.beam.sdk.io.gcp.bigtable.BigtableRowToBeamRow; +import org.apache.beam.sdk.io.gcp.bigtable.BigtableRowToBeamRowFlat; +import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.values.PBegin; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.POutput; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rex.RexNode; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Splitter; + +@Experimental +public class BigtableTable extends SchemaBaseBeamTable implements Serializable { + // Should match: + // googleapis.com/bigtable/projects/projectId/instances/instanceId/tables/tableId" + private static final Pattern locationPattern = + Pattern.compile( + "(?.+)/bigtable/projects/(?.+)/instances/(?.+)/tables/(?.+)"); + + private final String projectId; + private final String instanceId; + private final String tableId; + private String emulatorHost = ""; + + private boolean useFlatSchema = false; + + private Map> columnsMapping = newHashMap(); + + BigtableTable(Table table) { + super(table.getSchema()); + validateSchema(schema); + + String location = table.getLocation(); + if (location == null) { + throw new IllegalStateException("LOCATION is required"); + } + Matcher matcher = locationPattern.matcher(location); + validateMatcher(matcher, location); + + this.projectId = getMatcherValue(matcher, "projectId"); + this.instanceId = getMatcherValue(matcher, "instanceId"); + this.tableId = getMatcherValue(matcher, "tableId"); + String host = getMatcherValue(matcher, "host"); // googleapis.com or localhost: + if (!"googleapis.com".equals(host)) { + this.emulatorHost = host; + } + + JSONObject properties = table.getProperties(); + if (properties.containsKey(COLUMNS_MAPPING)) { + columnsMapping = parseColumnsMapping(properties.getString(COLUMNS_MAPPING)); + validateColumnsMapping(columnsMapping, schema); + useFlatSchema = true; + } + } + + @Override + public PCollection buildIOReader(PBegin begin) { + return readTransform() + .expand(begin) + .apply("BigtableRowToBeamRow", bigtableRowToRow()) + .setRowSchema(schema); + } + + @Override + public PCollection buildIOReader( + PBegin begin, BeamSqlTableFilter filters, List fieldNames) { + BigtableIO.Read readTransform = readTransform(); + if (filters instanceof BigtableFilter) { + BigtableFilter bigtableFilter = (BigtableFilter) filters; + readTransform = readTransform.withRowFilter(bigtableFilter.getFilters()); + } + return readTransform.expand(begin).apply(bigtableRowToRow()); + } + + @Override + public POutput buildIOWriter(PCollection input) { + if (!useFlatSchema) { + throw new UnsupportedOperationException( + "Write to Cloud Bigtable is supported for flat schema only."); + } + BigtableIO.Write write = + BigtableIO.write().withProjectId(projectId).withInstanceId(instanceId).withTableId(tableId); + if (!emulatorHost.isEmpty()) { + write = write.withEmulator(emulatorHost); + } + return input.apply(new BeamRowToBigtableMutation(columnsMapping)).apply(write); + } + + @Override + public PCollection.IsBounded isBounded() { + return PCollection.IsBounded.BOUNDED; + } + + @Override + public BeamTableStatistics getTableStatistics(PipelineOptions options) { + return BeamTableStatistics.BOUNDED_UNKNOWN; + } + + @Override + public BeamSqlTableFilter constructFilter(List filter) { + return new BigtableFilter(filter, schema); + } + + private static Map> parseColumnsMapping(String commaSeparatedMapping) { + Map> columnsMapping = new HashMap<>(); + Splitter.on(",") + .splitToList(commaSeparatedMapping) + .forEach( + colonSeparatedValues -> { + List pair = Splitter.on(":").splitToList(colonSeparatedValues); + columnsMapping.putIfAbsent(pair.get(0), newHashSet()); + columnsMapping.get(pair.get(0)).add(pair.get(1)); + }); + return columnsMapping; + } + + private static String getMatcherValue(Matcher matcher, String field) { + String value = matcher.group(field); + return value == null ? "" : value; + } + + private static void validateSchema(Schema schema) { + if (!schema.hasField(KEY)) { + throw new IllegalStateException(String.format("Schema has to contain '%s' field", KEY)); + } else { + Schema.Field keyField = schema.getField(KEY); + if (keyField != null && !(Schema.TypeName.STRING == keyField.getType().getTypeName())) { + throw new IllegalArgumentException( + "key field type should be STRING but was " + keyField.getType().getTypeName()); + } + } + } + + private static void validateMatcher(Matcher matcher, String location) { + if (!matcher.matches()) { + throw new InvalidTableException( + "Bigtable location must be in the following format:" + + " 'googleapis.com/bigtable/projects/projectId/instances/instanceId/tables/tableId'" + + " but was: " + + location); + } + } + + private static void validateColumnsMapping( + Map> columnsMapping, Schema schema) { + validateColumnsMappingCount(columnsMapping, schema); + validateColumnsMappingFields(columnsMapping, schema); + } + + private static void validateColumnsMappingCount( + Map> columnsMapping, Schema schema) { + int mappingCount = columnsMapping.values().stream().mapToInt(Set::size).sum(); + // Don't count the key field + int qualifiersCount = schema.getFieldCount() - 1; + if (qualifiersCount != mappingCount) { + throw new IllegalStateException( + String.format( + "Schema fields count: '%s' does not fit columnsMapping count: '%s'", + qualifiersCount, mappingCount)); + } + } + + private static void validateColumnsMappingFields( + Map> columnsMapping, Schema schema) { + Set allMappingQualifiers = + columnsMapping.values().stream().flatMap(Collection::stream).collect(toSet()); + + Set schemaFieldNames = + schema.getFieldNames().stream().filter(field -> !KEY.equals(field)).collect(toSet()); + + if (!schemaFieldNames.equals(allMappingQualifiers)) { + throw new IllegalStateException( + String.format( + "columnsMapping '%s' does not fit to schema field names '%s'", + allMappingQualifiers, schemaFieldNames)); + } + } + + private BigtableIO.Read readTransform() { + BigtableIO.Read readTransform = + BigtableIO.read().withProjectId(projectId).withInstanceId(instanceId).withTableId(tableId); + if (!emulatorHost.isEmpty()) { + readTransform = readTransform.withEmulator(emulatorHost); + } + return readTransform; + } + + private PTransform, PCollection> bigtableRowToRow() { + return useFlatSchema + ? new BigtableRowToBeamRowFlat(schema, columnsMapping) + : new BigtableRowToBeamRow(schema); + } +} diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableProvider.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableProvider.java new file mode 100644 index 000000000000..20133a7aae0d --- /dev/null +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableProvider.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import com.google.auto.service.AutoService; +import org.apache.beam.sdk.annotations.Experimental; +import org.apache.beam.sdk.annotations.Internal; +import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTable; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.provider.InMemoryMetaTableProvider; +import org.apache.beam.sdk.extensions.sql.meta.provider.TableProvider; + +/** + * {@link TableProvider} for {@link BigtableTable}. + * + *

A sample of BigTable table is: + * + *

{@code
+ *   CREATE EXTERNAL TABLE beamTable(
+ *     key VARCHAR NOT NULL,
+ *     familyTest ROW<
+ *       boolColumn BOOLEAN NOT NULL,
+ *       longColumnWithTsAndLabels ROW<
+ *         val BIGINT NOT NULL,
+ *         timestampMicros BIGINT NOT NULL,
+ *         labels VARCHAR
+ *       > NOT NULL,
+ *       stringArrayColumn ARRAY NOT NULL,
+ *       doubleColumn DOUBLE NOT NULL,
+ *       binaryColumn BINARY NOT NULL
+ *     > NOT NULL
+ *   )
+ *   TYPE 'bigtable'
+ *   LOCATION 'googleapis.com/bigtable/projects//instances//tables/'
+ * 
+ * + *

Flat-schema table is also supported. It requires an additional property "columnsMapping" which + * describes which familyColumn describes which value in the form "familyName:columnQualifier": + * + *

{@code
+ *   CREATE EXTERNAL TABLE beamTable(
+ *     key VARCHAR NOT NULL,
+ *     boolColumn BOOLEAN NOT NULL,
+ *     longColumn BIGINT NOT NULL,
+ *     stringColumn VARCHAR NOT NULL,
+ *     doubleColumn DOUBLE NOT NULL,
+ *     binaryColumn BINARY NOT NULL
+ *   )
+ *   TYPE 'bigtable'
+ *   LOCATION 'googleapis.com/bigtable/projects//instances//tables/'
+ *   TBLPROPERTIES '{
+ *     "columnsMapping": "f:boolColumn,f:longColumn,f:stringColumn,f2:doubleColumn,f2:binaryColumn"
+ *   }'
+ * 
+ */ +@Internal +@Experimental +@AutoService(TableProvider.class) +public class BigtableTableProvider extends InMemoryMetaTableProvider { + + @Override + public String getTableType() { + return "bigtable"; + } + + @Override + public BeamSqlTable buildBeamSqlTable(Table table) { + return new BigtableTable(table); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableStatusFunction.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/package-info.java similarity index 72% rename from sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableStatusFunction.java rename to sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/package-info.java index b745a4b94502..683d60ee90d2 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableStatusFunction.java +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/package-info.java @@ -15,12 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.beam.sdk.io.gcp.pubsublite; -import io.grpc.StatusException; -import java.io.Serializable; - -/** A serializable Function that can throw a StatusException. */ -public interface SerializableStatusFunction extends Serializable { - OutT apply(InT input) throws StatusException; -} +/** Table schema for BigTable. */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaThriftTable.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaThriftTable.java new file mode 100644 index 000000000000..5768aced7ab0 --- /dev/null +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaThriftTable.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; + +import static org.apache.beam.sdk.util.Preconditions.checkArgumentNotNull; + +import java.util.List; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.io.thrift.ThriftCoder; +import org.apache.beam.sdk.io.thrift.ThriftSchema; +import org.apache.beam.sdk.schemas.RowMessages; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.SchemaProvider; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.transforms.Values; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.apache.thrift.TBase; +import org.apache.thrift.TFieldIdEnum; +import org.apache.thrift.protocol.TProtocolFactory; + +/** + * Kafka table that handles thrift data. + * + *

Uses the default thrift schema {@link ThriftSchema#provider() provider} , so it can't handle + * {@link ThriftSchema#custom() custom} container typedefs. + * + * @param thrift field type, i.e. {@code ThriftGeneratedClass._Fields} + * @param thrift generated class + */ +public class BeamKafkaThriftTable> + extends BeamKafkaTable { + + private static final SchemaProvider schemaProvider = ThriftSchema.provider(); + + private final TypeDescriptor typeDescriptor; + private final Coder coder; + + public BeamKafkaThriftTable( + Schema requiredSchema, + String bootstrapServers, + List topics, + Class thriftClass, + TProtocolFactory protocolFactory) { + super(thriftSchema(thriftClass, requiredSchema), bootstrapServers, topics); + typeDescriptor = TypeDescriptor.of(thriftClass); + coder = ThriftCoder.of(thriftClass, protocolFactory); + } + + private static Schema thriftSchema(Class thriftClass, Schema requiredSchema) { + final TypeDescriptor typeDescriptor = TypeDescriptor.of(thriftClass); + final Schema schema = + checkArgumentNotNull(BeamKafkaThriftTable.schemaProvider.schemaFor(typeDescriptor)); + if (!schema.assignableTo(requiredSchema)) { + throw new IllegalArgumentException( + String.format( + "Given message schema: '%s'%n" + + "does not match schema inferred from thrift class.%n" + + "Thrift class: '%s'%n" + + "Inferred schema: '%s'", + requiredSchema, thriftClass.getName(), schema)); + } + return schema; + } + + @Override + protected PTransform>, PCollection> getPTransformForInput() { + return new InputTransformer(schema, typeDescriptor, coder); + } + + private static class InputTransformer> + extends PTransform>, PCollection> { + + private final Schema schema; + private final SimpleFunction toRowFn; + + InputTransformer(Schema schema, TypeDescriptor typeDescriptor, Coder coder) { + this.schema = schema; + toRowFn = RowMessages.bytesToRowFn(schemaProvider, typeDescriptor, coder); + } + + @Override + public PCollection expand(PCollection> input) { + return input + .apply("drop-kafka-keys", Values.create()) + .apply("thrift-to-row", MapElements.via(toRowFn)) + .setRowSchema(schema); + } + } + + @Override + protected PTransform, PCollection>> getPTransformForOutput() { + return new OutputTransformer(typeDescriptor, coder); + } + + private static class OutputTransformer> + extends PTransform, PCollection>> { + + private static final TypeDescriptor binTypeDescriptor = TypeDescriptor.of(byte[].class); + private static final byte[] emptyKey = {}; + + private final SimpleFunction fromRowFn; + + OutputTransformer(TypeDescriptor typeDescriptor, Coder coder) { + this.fromRowFn = RowMessages.rowToBytesFn(schemaProvider, typeDescriptor, coder); + } + + @Override + public PCollection> expand(PCollection input) { + return input + .apply("row-to-thrift-bytes", MapElements.via(fromRowFn)) + .apply( + "bytes-to-kvs", + MapElements.into(TypeDescriptors.kvs(binTypeDescriptor, binTypeDescriptor)) + .via(bytes -> KV.of(emptyKey, bytes))); + } + } +} diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProvider.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProvider.java index d408bc565bae..486b63bb9339 100644 --- a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProvider.java +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProvider.java @@ -20,6 +20,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.auto.service.AutoService; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTable; @@ -27,6 +28,8 @@ import org.apache.beam.sdk.extensions.sql.meta.provider.InMemoryMetaTableProvider; import org.apache.beam.sdk.extensions.sql.meta.provider.TableProvider; import org.apache.beam.sdk.schemas.Schema; +import org.apache.thrift.TBase; +import org.apache.thrift.protocol.TProtocolFactory; /** * Kafka table provider. @@ -50,7 +53,8 @@ private enum PayloadFormat { CSV, AVRO, JSON, - PROTO + PROTO, + THRIFT } @Override @@ -78,18 +82,54 @@ public BeamSqlTable buildBeamSqlTable(Table table) { case JSON: return new BeamKafkaJsonTable(schema, bootstrapServers, topics); case PROTO: - String protoClassName = properties.getString("protoClass"); - try { - Class protoClass = Class.forName(protoClassName); - return new BeamKafkaProtoTable(schema, bootstrapServers, topics, protoClass); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Incorrect proto class provided: " + protoClassName); - } + return protoTable(schema, bootstrapServers, topics, properties); + case THRIFT: + return thriftTable(schema, bootstrapServers, topics, properties); default: throw new IllegalArgumentException("Unsupported payload format: " + payloadFormat); } } + private BeamKafkaProtoTable protoTable( + Schema schema, String bootstrapServers, List topics, JSONObject properties) { + String protoClassName = properties.getString("protoClass"); + try { + Class protoClass = Class.forName(protoClassName); + return new BeamKafkaProtoTable(schema, bootstrapServers, topics, protoClass); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("Incorrect proto class provided: " + protoClassName); + } + } + + private BeamKafkaThriftTable thriftTable( + Schema schema, String bootstrapServers, List topics, JSONObject properties) { + final String thriftClassName = properties.getString("thriftClass"); + final String thriftProtocolFactoryClassName = + properties.getString("thriftProtocolFactoryClass"); + try { + final Class thriftClass = (Class) Class.forName(thriftClassName); + final TProtocolFactory thriftProtocolFactory; + try { + final Class thriftProtocolFactoryClass = + (Class) Class.forName(thriftProtocolFactoryClassName); + thriftProtocolFactory = thriftProtocolFactoryClass.getDeclaredConstructor().newInstance(); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException( + "Incorrect thrift protocol factory class provided: " + thriftProtocolFactoryClassName); + } catch (InstantiationException + | IllegalAccessException + | InvocationTargetException + | NoSuchMethodException e) { + throw new IllegalStateException( + "Could not instantiate the thrift protocol factory class", e); + } + return new BeamKafkaThriftTable<>( + schema, bootstrapServers, topics, thriftClass, thriftProtocolFactory); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("Incorrect thrift class provided: " + thriftClassName); + } + } + @Override public String getTableType() { return "kafka"; diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslSqlStdOperatorsTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslSqlStdOperatorsTest.java index 9c0fd681802f..1a8b21227741 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslSqlStdOperatorsTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslSqlStdOperatorsTest.java @@ -18,8 +18,8 @@ package org.apache.beam.sdk.extensions.sql; import static org.apache.beam.sdk.extensions.sql.utils.DateTimeUtils.parseTimestampWithUTCTimeZone; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import com.google.auto.value.AutoValue; diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/JdbcDriverTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/JdbcDriverTest.java index d50a4aa8a629..8ae15d429234 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/JdbcDriverTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/JdbcDriverTest.java @@ -18,13 +18,13 @@ package org.apache.beam.sdk.extensions.sql.impl; import static org.apache.beam.sdk.values.Row.toRow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.sql.Connection; diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflectorTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflectorTest.java new file mode 100644 index 000000000000..a5f38918389e --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/ScalarFnReflectorTest.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.impl; + +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertEquals; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.apache.beam.sdk.extensions.sql.udf.ScalarFn; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link ScalarFnReflector}. */ +@RunWith(JUnit4.class) +public class ScalarFnReflectorTest { + @Rule public ExpectedException thrown = ExpectedException.none(); + + @Test + @SuppressWarnings("nullness") // If result is null, test will fail as expected. + public void testGetApplyMethod() throws InvocationTargetException, IllegalAccessException { + IncrementFn incrementFn = new IncrementFn(); + Method method = ScalarFnReflector.getApplyMethod(incrementFn); + @Nullable Object result = method.invoke(incrementFn, Long.valueOf(24L)); + assertEquals(Long.valueOf(25L), result); + } + + @Test + @SuppressWarnings("nullness") // If result is null, test will fail as expected. + public void testGetApplyMethodOverride() + throws InvocationTargetException, IllegalAccessException { + IncrementFnChild incrementFn = new IncrementFnChild(); + Method method = ScalarFnReflector.getApplyMethod(incrementFn); + @Nullable Object result = method.invoke(incrementFn, Long.valueOf(24L)); + assertEquals(Long.valueOf(26L), result); + } + + @Test + @SuppressWarnings("nullness") // If result is null, test will fail as expected. + public void testGetApplyMethodStatic() throws InvocationTargetException, IllegalAccessException { + Method method = ScalarFnReflector.getApplyMethod(new IncrementFnWithStaticMethod()); + @Nullable Object result = method.invoke(null, Long.valueOf(24L)); + assertEquals(Long.valueOf(25L), result); + } + + @Test + public void testDifferentMethodNameThrowsIllegalArgumentException() { + thrown.expect(instanceOf(IllegalArgumentException.class)); + thrown.expectMessage("Found multiple methods annotated with @ApplyMethod."); + ScalarFnReflector.getApplyMethod(new IncrementFnDifferentMethodName()); + } + + @Test + public void testDifferentMethodSignatureThrowsIllegalArgumentException() { + thrown.expect(instanceOf(IllegalArgumentException.class)); + thrown.expectMessage("Found multiple methods annotated with @ApplyMethod."); + ScalarFnReflector.getApplyMethod(new IncrementFnDifferentSignature()); + } + + @Test + public void testMissingAnnotationThrowsIllegalArgumentException() { + thrown.expect(instanceOf(IllegalArgumentException.class)); + thrown.expectMessage("No method annotated with @ApplyMethod found in class"); + ScalarFnReflector.getApplyMethod(new IncrementFnMissingAnnotation()); + } + + @Test + public void testNonPublicMethodThrowsIllegalArgumentException() { + thrown.expect(instanceOf(IllegalArgumentException.class)); + thrown.expectMessage("not public"); + ScalarFnReflector.getApplyMethod(new IncrementFnWithProtectedMethod()); + } + + static class IncrementFn extends ScalarFn { + @ApplyMethod + public Long increment(Long i) { + return i + 1; + } + } + + static class IncrementFnChild extends IncrementFn { + @ApplyMethod + @Override + public Long increment(Long i) { + return i + 2; + } + } + + static class IncrementFnWithStaticMethod extends ScalarFn { + @ApplyMethod + public static Long increment(Long i) { + return i + 1; + } + } + + static class IncrementFnDifferentMethodName extends IncrementFn { + @ApplyMethod + public Long differentMethod(Long i) { + return i + 2; + } + } + + static class IncrementFnDifferentSignature extends IncrementFn { + @ApplyMethod + public Long increment(String s) { + return 0L; + } + } + + static class IncrementFnMissingAnnotation extends ScalarFn { + public Long increment(Long i) { + return i + 1; + } + } + + static class IncrementFnWithProtectedMethod extends ScalarFn { + @ApplyMethod + protected Long increment(Long i) { + return i + 1; + } + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableClientWrapper.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableClientWrapper.java new file mode 100644 index 000000000000..6a8b343b18f6 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableClientWrapper.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.byteString; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.byteStringUtf8; + +import com.google.auth.Credentials; +import com.google.bigtable.admin.v2.ColumnFamily; +import com.google.bigtable.admin.v2.DeleteTableRequest; +import com.google.bigtable.admin.v2.Table; +import com.google.bigtable.v2.MutateRowRequest; +import com.google.bigtable.v2.Mutation; +import com.google.cloud.bigtable.config.BigtableOptions; +import com.google.cloud.bigtable.config.CredentialOptions; +import com.google.cloud.bigtable.grpc.BigtableDataClient; +import com.google.cloud.bigtable.grpc.BigtableSession; +import com.google.cloud.bigtable.grpc.BigtableTableAdminClient; +import java.io.IOException; +import java.io.Serializable; +import org.checkerframework.checker.nullness.qual.Nullable; + +class BigtableClientWrapper implements Serializable { + private final BigtableTableAdminClient tableAdminClient; + private final BigtableDataClient dataClient; + private final BigtableSession session; + private final BigtableOptions bigtableOptions; + + BigtableClientWrapper( + String project, + String instanceId, + @Nullable Integer emulatorPort, + @Nullable Credentials gcpCredentials) + throws IOException { + BigtableOptions.Builder optionsBuilder = + BigtableOptions.builder() + .setProjectId(project) + .setInstanceId(instanceId) + .setUserAgent("apache-beam-test"); + if (emulatorPort != null) { + optionsBuilder.enableEmulator("localhost", emulatorPort); + } + if (gcpCredentials != null) { + optionsBuilder.setCredentialOptions(CredentialOptions.credential(gcpCredentials)); + } + bigtableOptions = optionsBuilder.build(); + + session = new BigtableSession(bigtableOptions); + tableAdminClient = session.getTableAdminClient(); + dataClient = session.getDataClient(); + } + + void writeRow( + String key, + String table, + String familyColumn, + String columnQualifier, + byte[] value, + long timestampMicros) { + Mutation.SetCell setCell = + Mutation.SetCell.newBuilder() + .setFamilyName(familyColumn) + .setColumnQualifier(byteStringUtf8(columnQualifier)) + .setValue(byteString(value)) + .setTimestampMicros(timestampMicros) + .build(); + Mutation mutation = Mutation.newBuilder().setSetCell(setCell).build(); + MutateRowRequest mutateRowRequest = + MutateRowRequest.newBuilder() + .setRowKey(byteStringUtf8(key)) + .setTableName(bigtableOptions.getInstanceName().toTableNameStr(table)) + .addMutations(mutation) + .build(); + dataClient.mutateRow(mutateRowRequest); + } + + void createTable(String tableName, String familyName) { + Table.Builder tableBuilder = Table.newBuilder(); + tableBuilder.putColumnFamilies(familyName, ColumnFamily.newBuilder().build()); + + String instanceName = bigtableOptions.getInstanceName().toString(); + com.google.bigtable.admin.v2.CreateTableRequest.Builder createTableRequestBuilder = + com.google.bigtable.admin.v2.CreateTableRequest.newBuilder() + .setParent(instanceName) + .setTableId(tableName) + .setTable(tableBuilder.build()); + tableAdminClient.createTable(createTableRequestBuilder.build()); + } + + void deleteTable(String tableId) { + final String tableName = bigtableOptions.getInstanceName().toTableNameStr(tableId); + DeleteTableRequest.Builder deleteTableRequestBuilder = + DeleteTableRequest.newBuilder().setName(tableName); + tableAdminClient.deleteTable(deleteTableRequestBuilder.build()); + } + + void closeSession() throws IOException { + session.close(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilterTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilterTest.java new file mode 100644 index 000000000000..bd34d160e600 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableFilterTest.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static org.apache.beam.sdk.extensions.sql.meta.provider.test.TestTableProvider.PUSH_DOWN_OPTION; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; + +import com.alibaba.fastjson.JSON; +import java.util.Arrays; +import java.util.Collection; +import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; +import org.apache.beam.sdk.extensions.sql.impl.rel.BeamCalcRel; +import org.apache.beam.sdk.extensions.sql.impl.rel.BeamRelNode; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.provider.test.TestTableProvider; +import org.apache.beam.sdk.extensions.sql.meta.provider.test.TestTableProvider.PushDownOptions; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.values.Row; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableFilterTest { + + private static final Schema BASIC_SCHEMA = + Schema.builder().addStringField(KEY).addStringField("name").build(); + + private BeamSqlEnv sqlEnv; + + @Parameters + public static Collection data() { + return Arrays.asList( + new Object[][] { + {"select * from TEST where key = '100'", false}, + {"select * from TEST where key >= 'key2'", false}, + {"select * from TEST where key LIKE '^key[123]'", true}, + {"select * from TEST where key LIKE '^key[abc]' OR key LIKE '^key[bcd]'", false}, + }); + } + + @Parameter public String query; + + @Parameter(1) + public boolean isSupported; + + @Rule public TestPipeline pipeline = TestPipeline.create(); + + @Before + public void buildUp() { + TestTableProvider tableProvider = new TestTableProvider(); + Table table = getTable("TEST", PushDownOptions.NONE); + tableProvider.createTable(table); + tableProvider.addRows(table.getName(), row("key1", "firstName"), row("key2", "secondName")); + + sqlEnv = + BeamSqlEnv.builder(tableProvider) + .setPipelineOptions(PipelineOptionsFactory.create()) + .build(); + } + + @Test + public void testIsSupported() { + BeamRelNode beamRelNode = sqlEnv.parseQuery(query); + assertThat(beamRelNode, instanceOf(BeamCalcRel.class)); + BigtableFilter filter = + new BigtableFilter(((BeamCalcRel) beamRelNode).getProgram().split().right, BASIC_SCHEMA); + + assertThat( + "Query: '" + query + "' is expected to be " + (isSupported ? "supported." : "unsupported."), + filter.getNotSupported().isEmpty() == isSupported); + } + + private static Table getTable(String name, PushDownOptions options) { + return Table.builder() + .name(name) + .comment(name + " table") + .schema(BASIC_SCHEMA) + .properties( + JSON.parseObject("{ " + PUSH_DOWN_OPTION + ": " + "\"" + options.toString() + "\" }")) + .type("test") + .build(); + } + + private static Row row(String key, String name) { + return Row.withSchema(BASIC_SCHEMA).addValues(key, name).build(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableCreationFailuresTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableCreationFailuresTest.java new file mode 100644 index 000000000000..04cb0e17c714 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableCreationFailuresTest.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.checkMessage; +import static org.junit.Assert.assertThrows; + +import org.apache.beam.sdk.extensions.sql.BeamSqlCli; +import org.apache.beam.sdk.extensions.sql.impl.ParseException; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.provider.InvalidTableException; +import org.apache.beam.sdk.extensions.sql.meta.provider.TableProvider; +import org.apache.beam.sdk.extensions.sql.meta.store.InMemoryMetaStore; +import org.junit.Before; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableTableCreationFailuresTest { + + private final InMemoryMetaStore metaStore = new InMemoryMetaStore(); + private final TableProvider tableProvider = new BigtableTableProvider(); + private BeamSqlCli cli; + + @Before + public void setUp() { + metaStore.registerProvider(tableProvider); + cli = new BeamSqlCli().metaStore(metaStore); + } + + @Test + public void testCreateWithoutTypeFails() { + String createTable = "CREATE EXTERNAL TABLE failure(something VARCHAR)"; + ParseException e = assertThrows(ParseException.class, () -> cli.execute(createTable)); + checkMessage(e.getMessage(), "Unable to parse query"); + } + + @Test + public void testCreateWithoutLocationFails() { + String createTable = + "CREATE EXTERNAL TABLE fail(key VARCHAR, something VARCHAR) \n" + "TYPE bigtable \n"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + + IllegalStateException e = + assertThrows(IllegalStateException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "LOCATION"); + } + + @Test + public void testCreateWithoutKeyFails() { + String createTable = + "CREATE EXTERNAL TABLE fail(something VARCHAR) \n" + + "TYPE bigtable \n" + + "LOCATION '" + + location() + + "'"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + IllegalStateException e = + assertThrows(IllegalStateException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "Schema has to contain 'key' field"); + } + + @Test + public void testCreateWrongKeyTypeFails() { + String createTable = + "CREATE EXTERNAL TABLE fail(key FLOAT) \n" + + "TYPE bigtable \n" + + "LOCATION '" + + location() + + "'"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + IllegalArgumentException e = + assertThrows(IllegalArgumentException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "key field type should be STRING but was FLOAT"); + } + + @Test + public void testCreatePropertiesDontMatchSchema() { + String createTable = + "CREATE EXTERNAL TABLE fail(key VARCHAR, q BIGINT, qq BINARY) \n" + + "TYPE bigtable \n" + + "LOCATION '" + + location() + + "' \n" + + "TBLPROPERTIES '{\"columnsMapping\": \"f:b,f:c\"}'"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + IllegalStateException e = + assertThrows(IllegalStateException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "does not fit to schema field names"); + } + + @Test + public void testCreatePropertiesCountNotEqualSchemaFields() { + String createTable = + "CREATE EXTERNAL TABLE fail(key VARCHAR, q BIGINT, qq BINARY) \n" + + "TYPE bigtable \n" + + "LOCATION '" + + location() + + "' \n" + + "TBLPROPERTIES '{\"columnsMapping\": \"f:q\"}'"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + IllegalStateException e = + assertThrows(IllegalStateException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "Schema fields count: '2' does not fit columnsMapping count: '1'"); + } + + @Test + public void testShouldFailOnIncorrectLocation() { + String createTable = + "CREATE EXTERNAL TABLE fail(key VARCHAR, q BIGINT) \n" + + "TYPE bigtable \n" + + "LOCATION 'googleapis.com/incorrect/projects/fakeProject/instances/fakeInstance/tables/beamTable' \n" + + "TBLPROPERTIES '{\"columnsMapping\": \"f:q\"}'"; + cli.execute(createTable); + Table table = metaStore.getTables().get("fail"); + InvalidTableException e = + assertThrows(InvalidTableException.class, () -> tableProvider.buildBeamSqlTable(table)); + checkMessage(e.getMessage(), "Bigtable location must be in the following format:"); + } + + private static String location() { + return "googleapis.com/bigtable/projects/fakeProject/instances/fakeInstance/tables/beamTable"; + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableFlatTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableFlatTest.java new file mode 100644 index 000000000000..9ea0ac89fe2c --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableFlatTest.java @@ -0,0 +1,193 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.FAMILY_TEST; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.KEY1; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.KEY2; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.TEST_FLAT_SCHEMA; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.bigTableRow; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.columnsMappingString; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createFlatTableString; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createReadTable; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.flatRow; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.setFixedTimestamp; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.COLUMNS_MAPPING; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import com.alibaba.fastjson.JSONObject; +import com.google.cloud.bigtable.emulator.v2.BigtableEmulatorRule; +import java.io.IOException; +import org.apache.beam.sdk.extensions.sql.BeamSqlCli; +import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; +import org.apache.beam.sdk.extensions.sql.impl.rel.BeamSqlRelUtils; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.store.InMemoryMetaStore; +import org.apache.beam.sdk.io.gcp.bigtable.BigtableIO; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableTableFlatTest { + + @ClassRule + public static final BigtableEmulatorRule BIGTABLE_EMULATOR = BigtableEmulatorRule.create(); + + @Rule public TestPipeline readPipeline = TestPipeline.create(); + @Rule public TestPipeline writePipeline = TestPipeline.create(); + + private static BigtableClientWrapper emulatorWrapper; + + private static final String PROJECT = "fakeProject"; + private static final String INSTANCE = "fakeInstance"; + + @BeforeClass + public static void setUp() throws Exception { + emulatorWrapper = + new BigtableClientWrapper(PROJECT, INSTANCE, BIGTABLE_EMULATOR.getPort(), null); + } + + @AfterClass + public static void tearDown() throws IOException { + emulatorWrapper.closeSession(); + } + + @Test + public void testCreatesFlatSchemaCorrectly() { + final String tableId = "flatTableSchema"; + InMemoryMetaStore metaStore = new InMemoryMetaStore(); + metaStore.registerProvider(new BigtableTableProvider()); + + BeamSqlCli cli = new BeamSqlCli().metaStore(metaStore); + cli.execute(createFlatTableString(tableId, location(tableId))); + + Table table = metaStore.getTables().get(tableId); + assertNotNull(table); + assertEquals(TEST_FLAT_SCHEMA, table.getSchema()); + + JSONObject properties = table.getProperties(); + assertTrue(properties.containsKey(COLUMNS_MAPPING)); + assertEquals(columnsMappingString(), properties.getString(COLUMNS_MAPPING)); + } + + @Test + public void testSimpleSelectFlat() { + final String tableId = "flatTable"; + createReadTable(tableId, emulatorWrapper); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFlatTableString(tableId, location(tableId))); + + String query = "SELECT key, boolColumn, longColumn, stringColumn, doubleColumn FROM flatTable"; + + sqlEnv.parseQuery(query); + PCollection queryOutput = + BeamSqlRelUtils.toPCollection(readPipeline, sqlEnv.parseQuery(query)); + + assertThat(queryOutput.getSchema(), equalTo(TEST_FLAT_SCHEMA)); + + PAssert.that(queryOutput).containsInAnyOrder(flatRow(KEY1), flatRow(KEY2)); + readPipeline.run().waitUntilFinish(); + } + + @Test + public void testSelectFlatKeyRegexQuery() { + final String tableId = "regexTable"; + createReadTable(tableId, emulatorWrapper); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFlatTableString(tableId, location(tableId))); + + String query = "SELECT key FROM regexTable WHERE key LIKE '^key[0134]{1}'"; + + sqlEnv.parseQuery(query); + PCollection queryOutput = + BeamSqlRelUtils.toPCollection(readPipeline, sqlEnv.parseQuery(query)); + + assertThat(queryOutput.getSchema(), equalTo(filterSchema())); + + PAssert.that(queryOutput).containsInAnyOrder(filterRow(KEY1)); + readPipeline.run().waitUntilFinish(); + } + + @Test + public void testSimpleInsert() { + final String tableId = "beamWriteTable"; + emulatorWrapper.createTable(tableId, FAMILY_TEST); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFlatTableString(tableId, location(tableId))); + + String query = + "INSERT INTO beamWriteTable(key, boolColumn, longColumn, stringColumn, doubleColumn) " + + "VALUES ('key', TRUE, 10, 'stringValue', 5.5)"; + + BeamSqlRelUtils.toPCollection(writePipeline, sqlEnv.parseQuery(query)); + writePipeline.run().waitUntilFinish(); + + PCollection bigTableRows = + readPipeline + .apply(readTransform(tableId)) + .apply(MapElements.via(new ReplaceCellTimestamp())); + + PAssert.that(bigTableRows).containsInAnyOrder(bigTableRow()); + readPipeline.run().waitUntilFinish(); + } + + private String location(String tableId) { + return BigtableTableTestUtils.location(PROJECT, INSTANCE, tableId, BIGTABLE_EMULATOR.getPort()); + } + + private Schema filterSchema() { + return Schema.builder().addStringField(KEY).build(); + } + + private Row filterRow(String key) { + return Row.withSchema(filterSchema()).attachValues(key); + } + + private static class ReplaceCellTimestamp + extends SimpleFunction { + @Override + public com.google.bigtable.v2.Row apply(com.google.bigtable.v2.Row input) { + return setFixedTimestamp(input); + } + } + + private BigtableIO.Read readTransform(String table) { + return BigtableIO.read() + .withProjectId("fakeProject") + .withInstanceId("fakeInstance") + .withTableId(table) + .withEmulator("localhost:" + BIGTABLE_EMULATOR.getPort()); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableIT.java new file mode 100644 index 000000000000..5b86e159965d --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableIT.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.FAMILY_TEST; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.NOW; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.TEST_FLAT_SCHEMA; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createFlatTableString; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createFullTableString; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.expectedFullSchema; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.TIMESTAMP_MICROS; + +import com.google.auth.Credentials; +import com.google.cloud.bigtable.emulator.v2.Emulator; +import java.util.UUID; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.extensions.gcp.options.GcpOptions; +import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; +import org.apache.beam.sdk.extensions.sql.impl.rel.BeamSqlRelUtils; +import org.apache.beam.sdk.options.Default; +import org.apache.beam.sdk.options.Description; +import org.apache.beam.sdk.options.PipelineOptionsFactory; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.testing.TestPipelineOptions; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.testcontainers.shaded.com.google.common.collect.ImmutableList; + +@RunWith(JUnit4.class) +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableTableIT { + private static BigtableTestOptions options; + private static BigtableClientWrapper clientWrapper; + private static final String TABLE_ID = "Beam" + UUID.randomUUID(); + private static Emulator emulator; + + @BeforeClass + public static void setup() throws Exception { + PipelineOptionsFactory.register(BigtableTestOptions.class); + options = TestPipeline.testingPipelineOptions().as(BigtableTestOptions.class); + + if (options.isWithEmulator()) { + emulator = Emulator.createBundled(); + emulator.start(); + } + Credentials credentials = + options.isWithEmulator() ? null : options.as(GcpOptions.class).getGcpCredential(); + Integer emulatorPort = options.isWithEmulator() ? emulator.getPort() : null; + + clientWrapper = + new BigtableClientWrapper( + options.getBigtableProject(), options.getInstanceId(), emulatorPort, credentials); + + clientWrapper.createTable(TABLE_ID, FAMILY_TEST); + } + + @AfterClass + public static void tearDown() throws Exception { + clientWrapper.deleteTable(TABLE_ID); + clientWrapper.closeSession(); + if (emulator != null) { + emulator.stop(); + } + } + + @Test + public void testWriteThenRead() { + writeData(); + readFlatData(); + readData(); + } + + private void writeData() { + Pipeline p = Pipeline.create(options); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFlatTableString(TABLE_ID, location())); + + String query = + String.format( + "INSERT INTO `%s`(key, boolColumn, longColumn, stringColumn, doubleColumn) " + + "VALUES ('key1', FALSE, 1, 'string1', 1.0)", + TABLE_ID); + + BeamSqlRelUtils.toPCollection(p, sqlEnv.parseQuery(query)); + p.run().waitUntilFinish(); + } + + private void readFlatData() { + Pipeline p = Pipeline.create(options); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFlatTableString(TABLE_ID, location())); + String query = "SELECT * FROM `" + TABLE_ID + "`"; + + PCollection flatRows = BeamSqlRelUtils.toPCollection(p, sqlEnv.parseQuery(query)); + + PAssert.that(flatRows).containsInAnyOrder(expectedFlatRow(1)); + p.run().waitUntilFinish(); + } + + private void readData() { + Pipeline p = Pipeline.create(options); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFullTableString(TABLE_ID, location())); + String query = + String.format( + "SELECT key, " + + " t.familyTest.boolColumn, " + + " t.familyTest.longColumn.val AS longValue, " + + " t.familyTest.longColumn.timestampMicros, " + + " t.familyTest.longColumn.labels, " + + " t.familyTest.stringColumn, " + + " t.familyTest.doubleColumn " + + "FROM `%s` t", + TABLE_ID); + + PCollection rows = + BeamSqlRelUtils.toPCollection(p, sqlEnv.parseQuery(query)) + .apply(MapElements.via(new ReplaceTimestamp())) + .setRowSchema(expectedFullSchema()); + + PAssert.that(rows).containsInAnyOrder(expectedFullRow(1)); + p.run().waitUntilFinish(); + } + + private Row expectedFullRow(int i) { + return Row.withSchema(expectedFullSchema()) + .attachValues( + "key" + i, + i % 2 == 0, + (long) i, + NOW, + ImmutableList.of(), + ImmutableList.of("string" + i), + (double) i); + } + + private Row expectedFlatRow(int i) { + return Row.withSchema(TEST_FLAT_SCHEMA) + .attachValues("key" + i, i % 2 == 0, (long) i, "string" + i, (double) i); + } + + private static class ReplaceTimestamp extends SimpleFunction { + @Override + public Row apply(Row input) { + return Row.fromRow(input).withFieldValue(TIMESTAMP_MICROS, NOW).build(); + } + } + + private String location() { + Integer emulatorPort = options.isWithEmulator() ? emulator.getPort() : null; + return BigtableTableTestUtils.location( + options.getBigtableProject(), options.getInstanceId(), TABLE_ID, emulatorPort); + } + + /** Properties needed when using Bigtable with the Beam SDK. */ + public interface BigtableTestOptions extends TestPipelineOptions { + @Description("Instance ID for Bigtable") + @Default.String("fakeInstance") + String getInstanceId(); + + void setInstanceId(String value); + + @Description("Project for Bigtable") + @Default.String("fakeProject") + String getBigtableProject(); + + void setBigtableProject(String value); + + @Description("Whether to use emulator") + @Default.Boolean(true) + Boolean isWithEmulator(); + + void setWithEmulator(Boolean value); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableTestUtils.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableTestUtils.java new file mode 100644 index 000000000000..4c466fa8b734 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableTestUtils.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.LABELS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.TIMESTAMP_MICROS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.VALUE; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.booleanToByteArray; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.byteString; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.byteStringUtf8; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.doubleToByteArray; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.longToByteArray; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.fail; + +import com.google.bigtable.v2.Cell; +import com.google.bigtable.v2.Column; +import com.google.bigtable.v2.Family; +import java.util.List; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Longs; +import org.checkerframework.checker.nullness.qual.Nullable; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +class BigtableTableTestUtils { + + static final String KEY1 = "key1"; + static final String KEY2 = "key2"; + + static final String BOOL_COLUMN = "boolColumn"; + static final String LONG_COLUMN = "longColumn"; + static final String STRING_COLUMN = "stringColumn"; + static final String DOUBLE_COLUMN = "doubleColumn"; + static final String FAMILY_TEST = "familyTest"; + + static final Schema LONG_COLUMN_SCHEMA = + Schema.builder() + .addInt64Field(VALUE) + .addInt64Field(TIMESTAMP_MICROS) + .addArrayField(LABELS, Schema.FieldType.STRING) + .build(); + + static final Schema TEST_FAMILY_SCHEMA = + Schema.builder() + .addBooleanField(BOOL_COLUMN) + .addRowField(LONG_COLUMN, LONG_COLUMN_SCHEMA) + .addArrayField(STRING_COLUMN, Schema.FieldType.STRING) + .addDoubleField(DOUBLE_COLUMN) + .build(); + + static final Schema TEST_SCHEMA = + Schema.builder().addStringField(KEY).addRowField(FAMILY_TEST, TEST_FAMILY_SCHEMA).build(); + + static final Schema TEST_FLAT_SCHEMA = + Schema.builder() + .addStringField(KEY) + .addBooleanField(BOOL_COLUMN) + .addInt64Field(LONG_COLUMN) + .addStringField(STRING_COLUMN) + .addDoubleField(DOUBLE_COLUMN) + .build(); + + static final long NOW = 5_000_000_000L; + static final long LATER = NOW + 1_000L; + + static String createFlatTableString(String table, String location) { + return String.format( + "CREATE EXTERNAL TABLE `%s`( \n" + + " key VARCHAR NOT NULL, \n" + + " boolColumn BOOLEAN NOT NULL, \n" + + " longColumn BIGINT NOT NULL, \n" + + " stringColumn VARCHAR NOT NULL, \n" + + " doubleColumn DOUBLE NOT NULL \n" + + ") \n" + + "TYPE bigtable \n" + + "LOCATION '%s' \n" + + "TBLPROPERTIES '{ \n" + + " \"columnsMapping\": \"%s\"}'", + table, location, columnsMappingString()); + } + + static String createFullTableString(String tableId, String location) { + return String.format( + "CREATE EXTERNAL TABLE `%s`( \n" + + " key VARCHAR NOT NULL, \n" + + " familyTest ROW< \n" + + " boolColumn BOOLEAN NOT NULL, \n" + + " longColumn ROW< \n" + + " val BIGINT NOT NULL, \n" + + " timestampMicros BIGINT NOT NULL, \n" + + " labels ARRAY NOT NULL \n" + + " > NOT NULL, \n" + + " stringColumn ARRAY NOT NULL, \n" + + " doubleColumn DOUBLE NOT NULL \n" + + " > NOT NULL \n" + + ") \n" + + "TYPE bigtable \n" + + "LOCATION '%s'", + tableId, location); + } + + static Schema expectedFullSchema() { + return Schema.builder() + .addStringField(KEY) + .addBooleanField(BOOL_COLUMN) + .addInt64Field("longValue") + .addInt64Field(TIMESTAMP_MICROS) + .addArrayField(LABELS, Schema.FieldType.STRING) + .addArrayField(STRING_COLUMN, Schema.FieldType.STRING) + .addDoubleField(DOUBLE_COLUMN) + .build(); + } + + static Row expectedFullRow(String key) { + return Row.withSchema(expectedFullSchema()) + .attachValues( + key, + false, + 2L, + LATER, + ImmutableList.of(), + ImmutableList.of("string1", "string2"), + 2.20); + } + + static Row flatRow(String key) { + return Row.withSchema(TEST_FLAT_SCHEMA).attachValues(key, false, 2L, "string2", 2.20); + } + + static String location( + String project, String instanceId, String tableId, @Nullable Integer emulatorPort) { + String host = emulatorPort == null ? "googleapis.com" : "localhost:" + emulatorPort; + return String.format( + "%s/bigtable/projects/%s/instances/%s/tables/%s", host, project, instanceId, tableId); + } + + static String columnsMappingString() { + return "familyTest:boolColumn,familyTest:longColumn,familyTest:doubleColumn," + + "familyTest:stringColumn"; + } + + static void createReadTable(String table, BigtableClientWrapper clientWrapper) { + clientWrapper.createTable(table, FAMILY_TEST); + writeRow(KEY1, table, clientWrapper); + writeRow(KEY2, table, clientWrapper); + } + + static com.google.bigtable.v2.Row bigTableRow() { + List columns = + ImmutableList.of( + column("boolColumn", booleanToByteArray(true)), + column("doubleColumn", doubleToByteArray(5.5)), + column("longColumn", Longs.toByteArray(10L)), + column("stringColumn", "stringValue".getBytes(UTF_8))); + Family family = Family.newBuilder().setName("familyTest").addAllColumns(columns).build(); + return com.google.bigtable.v2.Row.newBuilder() + .setKey(byteStringUtf8("key")) + .addFamilies(family) + .build(); + } + + // There is no possibility to insert a value with fixed timestamp so we have to replace it + // for the testing purpose. + static com.google.bigtable.v2.Row setFixedTimestamp(com.google.bigtable.v2.Row row) { + Family family = row.getFamilies(0); + + List columnsReplaced = + family.getColumnsList().stream() + .map( + column -> { + Cell cell = column.getCells(0); + return column( + column.getQualifier().toStringUtf8(), cell.getValue().toByteArray()); + }) + .collect(toList()); + Family familyReplaced = + Family.newBuilder().setName(family.getName()).addAllColumns(columnsReplaced).build(); + return com.google.bigtable.v2.Row.newBuilder() + .setKey(row.getKey()) + .addFamilies(familyReplaced) + .build(); + } + + static void checkMessage(@Nullable String message, String substring) { + if (message != null) { + assertThat(message, containsString(substring)); + } else { + fail(); + } + } + + private static Column column(String qualifier, byte[] value) { + return Column.newBuilder() + .setQualifier(byteStringUtf8(qualifier)) + .addCells(cell(value)) + .build(); + } + + private static Cell cell(byte[] value) { + return Cell.newBuilder().setValue(byteString(value)).setTimestampMicros(NOW).build(); + } + + private static void writeRow(String key, String table, BigtableClientWrapper clientWrapper) { + clientWrapper.writeRow(key, table, FAMILY_TEST, BOOL_COLUMN, booleanToByteArray(true), NOW); + clientWrapper.writeRow(key, table, FAMILY_TEST, BOOL_COLUMN, booleanToByteArray(false), LATER); + clientWrapper.writeRow(key, table, FAMILY_TEST, STRING_COLUMN, "string1".getBytes(UTF_8), NOW); + clientWrapper.writeRow( + key, table, FAMILY_TEST, STRING_COLUMN, "string2".getBytes(UTF_8), LATER); + clientWrapper.writeRow(key, table, FAMILY_TEST, LONG_COLUMN, longToByteArray(1L), NOW); + clientWrapper.writeRow(key, table, FAMILY_TEST, LONG_COLUMN, longToByteArray(2L), LATER); + clientWrapper.writeRow(key, table, FAMILY_TEST, DOUBLE_COLUMN, doubleToByteArray(1.10), NOW); + clientWrapper.writeRow(key, table, FAMILY_TEST, DOUBLE_COLUMN, doubleToByteArray(2.20), LATER); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableWithRowsTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableWithRowsTest.java new file mode 100644 index 000000000000..b3d02efaa462 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/bigtable/BigtableTableWithRowsTest.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.bigtable; + +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.KEY1; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.KEY2; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.STRING_COLUMN; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.TEST_SCHEMA; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createFullTableString; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.createReadTable; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.expectedFullRow; +import static org.apache.beam.sdk.extensions.sql.meta.provider.bigtable.BigtableTableTestUtils.expectedFullSchema; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import com.google.cloud.bigtable.emulator.v2.BigtableEmulatorRule; +import java.io.IOException; +import org.apache.beam.sdk.extensions.sql.BeamSqlCli; +import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; +import org.apache.beam.sdk.extensions.sql.impl.rel.BeamSqlRelUtils; +import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.store.InMemoryMetaStore; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableTableWithRowsTest { + + @ClassRule + public static final BigtableEmulatorRule BIGTABLE_EMULATOR = BigtableEmulatorRule.create(); + + @Rule public TestPipeline readPipeline = TestPipeline.create(); + + private static BigtableClientWrapper emulatorWrapper; + + private static final String PROJECT = "fakeProject"; + private static final String INSTANCE = "fakeInstance"; + private static final String TABLE = "beamTable"; + + @BeforeClass + public static void setUp() throws Exception { + emulatorWrapper = + new BigtableClientWrapper("fakeProject", "fakeInstance", BIGTABLE_EMULATOR.getPort(), null); + } + + @AfterClass + public static void tearDown() throws IOException { + emulatorWrapper.closeSession(); + } + + @Test + public void testCreatesSchemaCorrectly() { + InMemoryMetaStore metaStore = new InMemoryMetaStore(); + metaStore.registerProvider(new BigtableTableProvider()); + + BeamSqlCli cli = new BeamSqlCli().metaStore(metaStore); + cli.execute(createFullTableString(TABLE, location())); + + Table table = metaStore.getTables().get("beamTable"); + assertNotNull(table); + assertEquals(TEST_SCHEMA, table.getSchema()); + } + + @Test + public void testSimpleSelect() { + createReadTable(TABLE, emulatorWrapper); + BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new BigtableTableProvider()); + sqlEnv.executeDdl(createFullTableString(TABLE, location())); + String query = + "SELECT key, \n" + + " bt.familyTest.boolColumn, \n" + + " bt.familyTest.longColumn.val AS longValue, \n" + + " bt.familyTest.longColumn.timestampMicros, \n" + + " bt.familyTest.longColumn.labels, \n" + + " bt.familyTest.stringColumn, \n" + + " bt.familyTest.doubleColumn \n" + + "FROM beamTable bt"; + sqlEnv.parseQuery(query); + PCollection queryOutput = + BeamSqlRelUtils.toPCollection(readPipeline, sqlEnv.parseQuery(query)); + + assertThat(queryOutput.getSchema(), equalTo(expectedFullSchema())); + + PCollection sorted = + queryOutput + .apply(MapElements.via(new SortByTimestamp())) + .setRowSchema(expectedFullSchema()); + + PAssert.that(sorted).containsInAnyOrder(expectedFullRow(KEY1), expectedFullRow(KEY2)); + readPipeline.run().waitUntilFinish(); + } + + private String location() { + return BigtableTableTestUtils.location(PROJECT, INSTANCE, TABLE, BIGTABLE_EMULATOR.getPort()); + } + + private static class SortByTimestamp extends SimpleFunction { + @Override + public Row apply(Row input) { + return Row.fromRow(input) + .withFieldValue( + STRING_COLUMN, + ImmutableList.copyOf( + input.getArray(STRING_COLUMN).stream().sorted().collect(toList()))) + .build(); + } + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableProtoTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableProtoTest.java index 47484e753f43..a16c731bb3a3 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableProtoTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableProtoTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import java.util.List; diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableThriftTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableThriftTest.java new file mode 100644 index 000000000000..35bc80306142 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/BeamKafkaTableThriftTest.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThrows; + +import java.util.List; +import org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift.TestThriftMessage; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.apache.thrift.TException; +import org.apache.thrift.TSerializer; +import org.apache.thrift.protocol.TCompactProtocol; +import org.apache.thrift.protocol.TProtocolFactory; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BeamKafkaTableThriftTest extends BeamKafkaTableTest { + private final TProtocolFactory protocolFactory = new TCompactProtocol.Factory(); + + private static final Schema TEST_SCHEMA = + Schema.builder() + .addInt64Field("f_long") + .addInt32Field("f_int") + .addDoubleField("f_double") + .addStringField("f_string") + .addArrayField("f_double_array", Schema.FieldType.DOUBLE) + .build(); + + private static final Schema SHUFFLED_SCHEMA = + Schema.builder() + .addStringField("f_string") + .addInt32Field("f_int") + .addArrayField("f_double_array", Schema.FieldType.DOUBLE) + .addDoubleField("f_double") + .addInt64Field("f_long") + .build(); + + @Test + public void testWithShuffledSchema() { + BeamKafkaTable kafkaTable = + new BeamKafkaThriftTable( + SHUFFLED_SCHEMA, "", ImmutableList.of(), TestThriftMessage.class, protocolFactory); + + PCollection result = + pipeline + .apply(Create.of(shuffledRow(1), shuffledRow(2))) + .apply(kafkaTable.getPTransformForOutput()) + .apply(kafkaTable.getPTransformForInput()); + PAssert.that(result).containsInAnyOrder(generateRow(1), generateRow(2)); + pipeline.run(); + } + + @Test + public void testSchemasDoNotMatch() { + Schema schema = Schema.builder().addStringField("non_existing_field").build(); + + IllegalArgumentException e = + assertThrows( + IllegalArgumentException.class, + () -> + new BeamKafkaThriftTable( + schema, "", ImmutableList.of(), TestThriftMessage.class, protocolFactory)); + + assertThat( + e.getMessage(), + containsString("does not match schema inferred from thrift class.\nThrift class: ")); + } + + @Override + protected BeamKafkaTable getBeamKafkaTable() { + return new BeamKafkaThriftTable( + TEST_SCHEMA, "", ImmutableList.of(), TestThriftMessage.class, protocolFactory); + } + + @Override + protected Row generateRow(int i) { + return Row.withSchema(TEST_SCHEMA) + .addValues((long) i, i, (double) i, "thrift_value" + i, ImmutableList.of((double) i)) + .build(); + } + + @Override + protected byte[] generateEncodedPayload(int i) { + final TestThriftMessage message = + new TestThriftMessage().setFLong(i).setFInt(i).setFDouble(i).setFString("thrift_value" + i); + message.addToFDoubleArray(i); + + try { + return new TSerializer(protocolFactory).serialize(message); + } catch (TException e) { + throw new RuntimeException(e); + } + } + + private Row shuffledRow(int i) { + List values = + ImmutableList.of("thrift_value" + i, i, ImmutableList.of((double) i), (double) i, (long) i); + return Row.withSchema(SHUFFLED_SCHEMA).addValues(values).build(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderIT.java index 1a38911e5170..9439dad8ee2b 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderIT.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderIT.java @@ -17,7 +17,13 @@ */ package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.beam.sdk.extensions.sql.impl.schema.BeamTableUtils.beamRow2CsvLine; + import com.alibaba.fastjson.JSON; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collection; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -30,15 +36,21 @@ import org.apache.beam.sdk.coders.KvCoder; import org.apache.beam.sdk.coders.RowCoder; import org.apache.beam.sdk.coders.StringUtf8Coder; +import org.apache.beam.sdk.extensions.protobuf.ProtoMessageSchema; import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; import org.apache.beam.sdk.extensions.sql.impl.rel.BeamSqlRelUtils; import org.apache.beam.sdk.extensions.sql.meta.Table; import org.apache.beam.sdk.extensions.sql.meta.provider.TableProvider; +import org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift.ItThriftMessage; +import org.apache.beam.sdk.io.thrift.ThriftCoder; +import org.apache.beam.sdk.io.thrift.ThriftSchema; import org.apache.beam.sdk.options.Default; import org.apache.beam.sdk.options.Description; import org.apache.beam.sdk.options.PipelineOptions; import org.apache.beam.sdk.options.Validation; +import org.apache.beam.sdk.schemas.RowMessages; import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.utils.AvroUtils; import org.apache.beam.sdk.state.BagState; import org.apache.beam.sdk.state.StateSpec; import org.apache.beam.sdk.state.StateSpecs; @@ -51,51 +63,74 @@ import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.MoreObjects; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.apache.commons.csv.CSVFormat; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.protocol.TProtocolFactory; import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.Assert; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.utility.DockerImageName; /** Integration Test utility for KafkaTableProvider implementations. */ +@RunWith(Parameterized.class) @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) -public abstract class KafkaTableProviderIT { +public class KafkaTableProviderIT { private static final String KAFKA_CONTAINER_VERSION = "5.5.2"; @Rule public transient TestPipeline pipeline = TestPipeline.create(); - @Rule - public transient KafkaContainer kafka = + @ClassRule + public static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer( DockerImageName.parse("confluentinc/cp-kafka").withTag(KAFKA_CONTAINER_VERSION)); - protected KafkaOptions kafkaOptions; + private static KafkaOptions kafkaOptions; - protected static final Schema TEST_TABLE_SCHEMA = + private static final Schema TEST_TABLE_SCHEMA = Schema.builder() .addInt64Field("f_long") .addInt32Field("f_int") .addStringField("f_string") .build(); - protected abstract ProducerRecord generateProducerRecord(int i); + @Parameters + public static Collection data() { + return Arrays.asList( + new Object[][] { + {new KafkaJsonObjectProvider(), "json_topic"}, + {new KafkaAvroObjectProvider(), "avro_topic"}, + {new KafkaProtoObjectProvider(), "proto_topic"}, + {new KafkaCsvObjectProvider(), "csv_topic"}, + {new KafkaThriftObjectProvider(), "thrift_topic"} + }); + } + + @Parameter public KafkaObjectProvider objectsProvider; - protected abstract String getPayloadFormat(); + @Parameter(1) + public String topic; @Before public void setUp() { kafkaOptions = pipeline.getOptions().as(KafkaOptions.class); - kafkaOptions.setKafkaTopic("topic"); - kafkaOptions.setKafkaBootstrapServerAddress(kafka.getBootstrapServers()); + kafkaOptions.setKafkaTopic(topic); + kafkaOptions.setKafkaBootstrapServerAddress(KAFKA_CONTAINER.getBootstrapServers()); } @Test @@ -104,11 +139,11 @@ public void testFake2() throws BeamKafkaTable.NoEstimationException { Table table = Table.builder() .name("kafka_table") - .comment("kafka" + " table") + .comment("kafka table") .location("") .schema(TEST_TABLE_SCHEMA) .type("kafka") - .properties(JSON.parseObject(getKafkaPropertiesString())) + .properties(JSON.parseObject(objectsProvider.getKafkaPropertiesString())) .build(); BeamKafkaTable kafkaTable = (BeamKafkaTable) new KafkaTableProvider().buildBeamSqlTable(table); produceSomeRecordsWithDelay(100, 20); @@ -118,16 +153,6 @@ public void testFake2() throws BeamKafkaTable.NoEstimationException { Assert.assertTrue(rate2 > rate1); } - protected String getKafkaPropertiesString() { - return "{ " - + (getPayloadFormat() == null ? "" : "\"format\" : \"" + getPayloadFormat() + "\",") - + "\"bootstrap.servers\" : \"" - + kafkaOptions.getKafkaBootstrapServerAddress() - + "\",\"topics\":[\"" - + kafkaOptions.getKafkaTopic() - + "\"] }"; - } - static final transient Map FLAG = new ConcurrentHashMap<>(); @Test @@ -143,7 +168,7 @@ public void testFake() throws InterruptedException { + "TYPE 'kafka' \n" + "LOCATION ''\n" + "TBLPROPERTIES '%s'", - getKafkaPropertiesString()); + objectsProvider.getKafkaPropertiesString()); TableProvider tb = new KafkaTableProvider(); BeamSqlEnv env = BeamSqlEnv.inMemory(tb); @@ -162,14 +187,14 @@ public void testFake() throws InterruptedException { ImmutableSet.of(generateRow(0), generateRow(1), generateRow(2))))); queryOutput.apply(logRecords("")); pipeline.run(); - TimeUnit.MILLISECONDS.sleep(3000); + TimeUnit.SECONDS.sleep(4); produceSomeRecords(3); for (int i = 0; i < 200; i++) { if (FLAG.getOrDefault(pipeline.getOptions().getOptionsId(), false)) { return; } - TimeUnit.MILLISECONDS.sleep(60); + TimeUnit.MILLISECONDS.sleep(90); } Assert.fail(); } @@ -231,7 +256,7 @@ public void process( } } - protected Row generateRow(int i) { + private static Row generateRow(int i) { return Row.withSchema(TEST_TABLE_SCHEMA).addValues((long) i, i % 3 + 1, "value" + i).build(); } @@ -242,7 +267,7 @@ private void produceSomeRecords(int num) { .limit(num) .forEach( i -> { - ProducerRecord record = generateProducerRecord(i); + ProducerRecord record = objectsProvider.generateProducerRecord(i); producer.send(record); }); producer.flush(); @@ -256,7 +281,7 @@ private void produceSomeRecordsWithDelay(int num, int delayMilis) { .limit(num) .forEach( i -> { - ProducerRecord record = generateProducerRecord(i); + ProducerRecord record = objectsProvider.generateProducerRecord(i); producer.send(record); try { TimeUnit.MILLISECONDS.sleep(delayMilis); @@ -281,6 +306,141 @@ private Properties producerProps() { return props; } + private abstract static class KafkaObjectProvider implements Serializable { + + protected abstract ProducerRecord generateProducerRecord(int i); + + protected abstract String getPayloadFormat(); + + protected String getKafkaPropertiesString() { + return "{ " + + (getPayloadFormat() == null ? "" : "\"format\" : \"" + getPayloadFormat() + "\",") + + "\"bootstrap.servers\" : \"" + + kafkaOptions.getKafkaBootstrapServerAddress() + + "\",\"topics\":[\"" + + kafkaOptions.getKafkaTopic() + + "\"] }"; + } + } + + private static class KafkaJsonObjectProvider extends KafkaObjectProvider { + @Override + protected ProducerRecord generateProducerRecord(int i) { + return new ProducerRecord<>( + kafkaOptions.getKafkaTopic(), "k" + i, createJson(i).getBytes(UTF_8)); + } + + @Override + protected String getPayloadFormat() { + return "json"; + } + + private String createJson(int i) { + return String.format( + "{\"f_long\": %s, \"f_int\": %s, \"f_string\": \"%s\"}", i, i % 3 + 1, "value" + i); + } + } + + private static class KafkaProtoObjectProvider extends KafkaObjectProvider { + private final SimpleFunction toBytesFn = + ProtoMessageSchema.getRowToProtoBytesFn(KafkaMessages.ItMessage.class); + + @Override + protected ProducerRecord generateProducerRecord(int i) { + return new ProducerRecord<>( + kafkaOptions.getKafkaTopic(), "k" + i, toBytesFn.apply(generateRow(i))); + } + + @Override + protected String getPayloadFormat() { + return "proto"; + } + + @Override + protected String getKafkaPropertiesString() { + return "{ " + + "\"format\" : \"proto\"," + + "\"bootstrap.servers\" : \"" + + kafkaOptions.getKafkaBootstrapServerAddress() + + "\",\"topics\":[\"" + + kafkaOptions.getKafkaTopic() + + "\"]," + + "\"protoClass\": \"" + + KafkaMessages.ItMessage.class.getName() + + "\"}"; + } + } + + private static class KafkaCsvObjectProvider extends KafkaObjectProvider { + + @Override + protected ProducerRecord generateProducerRecord(int i) { + return new ProducerRecord<>( + kafkaOptions.getKafkaTopic(), + "k" + i, + beamRow2CsvLine(generateRow(i), CSVFormat.DEFAULT).getBytes(UTF_8)); + } + + @Override + protected String getPayloadFormat() { + return null; + } + } + + private static class KafkaAvroObjectProvider extends KafkaObjectProvider { + + private final SimpleFunction toBytesFn = + AvroUtils.getRowToAvroBytesFunction(TEST_TABLE_SCHEMA); + + @Override + protected ProducerRecord generateProducerRecord(int i) { + return new ProducerRecord<>( + kafkaOptions.getKafkaTopic(), "k" + i, toBytesFn.apply(generateRow(i))); + } + + @Override + protected String getPayloadFormat() { + return "avro"; + } + } + + private static class KafkaThriftObjectProvider extends KafkaObjectProvider { + private final Class thriftClass = ItThriftMessage.class; + private final TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); + private final SimpleFunction toBytesFn = + RowMessages.rowToBytesFn( + ThriftSchema.provider(), + TypeDescriptor.of(thriftClass), + ThriftCoder.of(thriftClass, protocolFactory)); + + @Override + protected ProducerRecord generateProducerRecord(int i) { + return new ProducerRecord<>( + kafkaOptions.getKafkaTopic(), "k" + i, toBytesFn.apply(generateRow(i))); + } + + @Override + protected String getKafkaPropertiesString() { + return "{ " + + "\"format\" : \"thrift\"," + + "\"bootstrap.servers\" : \"" + + kafkaOptions.getKafkaBootstrapServerAddress() + + "\",\"topics\":[\"" + + kafkaOptions.getKafkaTopic() + + "\"]," + + "\"thriftClass\": \"" + + thriftClass.getName() + + "\", \"thriftProtocolFactoryClass\": \"" + + protocolFactory.getClass().getName() + + "\"}"; + } + + @Override + protected String getPayloadFormat() { + return "thrift"; + } + } + /** Pipeline options specific for this test. */ public interface KafkaOptions extends PipelineOptions { diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderProtoIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderProtoIT.java deleted file mode 100644 index a6622e5923d8..000000000000 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderProtoIT.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; - -import org.apache.beam.sdk.extensions.protobuf.ProtoMessageSchema; -import org.apache.beam.sdk.transforms.SimpleFunction; -import org.apache.beam.sdk.values.Row; -import org.apache.kafka.clients.producer.ProducerRecord; - -public class KafkaTableProviderProtoIT extends KafkaTableProviderIT { - private final SimpleFunction toBytesFn = - ProtoMessageSchema.getRowToProtoBytesFn(KafkaMessages.ItMessage.class); - - @Override - protected ProducerRecord generateProducerRecord(int i) { - return new ProducerRecord<>( - kafkaOptions.getKafkaTopic(), "k" + i, toBytesFn.apply(generateRow(i))); - } - - @Override - protected String getPayloadFormat() { - return "proto"; - } - - @Override - protected String getKafkaPropertiesString() { - return "{ " - + "\"format\" : \"proto\"," - + "\"bootstrap.servers\" : \"" - + kafkaOptions.getKafkaBootstrapServerAddress() - + "\",\"topics\":[\"" - + kafkaOptions.getKafkaTopic() - + "\"]," - + "\"protoClass\": \"" - + KafkaMessages.ItMessage.class.getName() - + "\"}"; - } -} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderTest.java index 565561d6779f..bb5b276f94ea 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderTest.java @@ -27,8 +27,12 @@ import java.util.stream.Stream; import org.apache.beam.sdk.extensions.sql.meta.BeamSqlTable; import org.apache.beam.sdk.extensions.sql.meta.Table; +import org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift.SimpleThriftMessage; import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.vendor.calcite.v1_20_0.com.google.common.collect.ImmutableList; +import org.apache.thrift.TBase; +import org.apache.thrift.protocol.TCompactProtocol; +import org.apache.thrift.protocol.TProtocolFactory; import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.Test; @@ -64,15 +68,29 @@ public void testBuildBeamSqlAvroTable() { @Test public void testBuildBeamSqlProtoTable() { - Table table = mockTable("hello", "proto", KafkaMessages.SimpleMessage.class.getName()); + Table table = mockProtoTable("hello", KafkaMessages.SimpleMessage.class); BeamSqlTable sqlTable = provider.buildBeamSqlTable(table); assertNotNull(sqlTable); assertTrue(sqlTable instanceof BeamKafkaProtoTable); - BeamKafkaProtoTable csvTable = (BeamKafkaProtoTable) sqlTable; - assertEquals("localhost:9092", csvTable.getBootstrapServers()); - assertEquals(ImmutableList.of("topic1", "topic2"), csvTable.getTopics()); + BeamKafkaProtoTable protoTable = (BeamKafkaProtoTable) sqlTable; + assertEquals("localhost:9092", protoTable.getBootstrapServers()); + assertEquals(ImmutableList.of("topic1", "topic2"), protoTable.getTopics()); + } + + @Test + public void testBuildBeamSqlThriftTable() { + Table table = + mockThriftTable("hello", SimpleThriftMessage.class, TCompactProtocol.Factory.class); + BeamSqlTable sqlTable = provider.buildBeamSqlTable(table); + + assertNotNull(sqlTable); + assertTrue(sqlTable instanceof BeamKafkaThriftTable); + + BeamKafkaThriftTable thriftTable = (BeamKafkaThriftTable) sqlTable; + assertEquals("localhost:9092", thriftTable.getBootstrapServers()); + assertEquals(ImmutableList.of("topic1", "topic2"), thriftTable.getTopics()); } @Test @@ -81,15 +99,30 @@ public void testGetTableType() { } private static Table mockTable(String name) { - return mockTable(name, null, null); + return mockTable(name, null, null, null, null); } private static Table mockTable(String name, String payloadFormat) { - return mockTable(name, payloadFormat, null); + return mockTable(name, payloadFormat, null, null, null); + } + + private static Table mockProtoTable(String name, Class protoClass) { + return mockTable(name, "proto", protoClass, null, null); + } + + private static Table mockThriftTable( + String name, + Class> thriftClass, + Class thriftProtocolFactoryClass) { + return mockTable(name, "thrift", null, thriftClass, thriftProtocolFactoryClass); } private static Table mockTable( - String name, @Nullable String payloadFormat, @Nullable String protoClass) { + String name, + @Nullable String payloadFormat, + @Nullable Class protoClass, + @Nullable Class> thriftClass, + @Nullable Class thriftProtocolFactoryClass) { JSONObject properties = new JSONObject(); properties.put("bootstrap.servers", "localhost:9092"); JSONArray topics = new JSONArray(); @@ -100,7 +133,13 @@ private static Table mockTable( properties.put("format", payloadFormat); } if (protoClass != null) { - properties.put("protoClass", protoClass); + properties.put("protoClass", protoClass.getName()); + } + if (thriftClass != null) { + properties.put("thriftClass", thriftClass.getName()); + } + if (thriftProtocolFactoryClass != null) { + properties.put("thriftProtocolFactoryClass", thriftProtocolFactoryClass.getName()); } return Table.builder() diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/ItThriftMessage.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/ItThriftMessage.java new file mode 100644 index 000000000000..750da06fbb3c --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/ItThriftMessage.java @@ -0,0 +1,612 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift; + +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-20") +public class ItThriftMessage + implements org.apache.thrift.TBase, + java.io.Serializable, + Cloneable, + Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = + new org.apache.thrift.protocol.TStruct("ItThriftMessage"); + + private static final org.apache.thrift.protocol.TField F_LONG_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_long", org.apache.thrift.protocol.TType.I64, (short) 1); + private static final org.apache.thrift.protocol.TField F_INT_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_int", org.apache.thrift.protocol.TType.I32, (short) 2); + private static final org.apache.thrift.protocol.TField F_STRING_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_string", org.apache.thrift.protocol.TType.STRING, (short) 3); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = + new ItThriftMessageStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = + new ItThriftMessageTupleSchemeFactory(); + + private long f_long; // required + private int f_int; // required + private @org.apache.thrift.annotation.Nullable java.lang.String f_string; // required + + /** + * The set of fields this struct contains, along with convenience methods for finding and + * manipulating them. + */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + F_LONG((short) 1, "f_long"), + F_INT((short) 2, "f_int"), + F_STRING((short) 3, "f_string"); + + private static final java.util.Map byName = + new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** Find the _Fields constant that matches fieldId, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch (fieldId) { + case 1: // F_LONG + return F_LONG; + case 2: // F_INT + return F_INT; + case 3: // F_STRING + return F_STRING; + default: + return null; + } + } + + /** Find the _Fields constant that matches fieldId, throwing an exception if it is not found. */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) + throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** Find the _Fields constant that matches name, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __F_LONG_ISSET_ID = 0; + private static final int __F_INT_ISSET_ID = 1; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = + new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put( + _Fields.F_LONG, + new org.apache.thrift.meta_data.FieldMetaData( + "f_long", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I64))); + tmpMap.put( + _Fields.F_INT, + new org.apache.thrift.meta_data.FieldMetaData( + "f_int", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I32))); + tmpMap.put( + _Fields.F_STRING, + new org.apache.thrift.meta_data.FieldMetaData( + "f_string", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.STRING))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( + ItThriftMessage.class, metaDataMap); + } + + public ItThriftMessage() {} + + public ItThriftMessage(long f_long, int f_int, java.lang.String f_string) { + this(); + this.f_long = f_long; + setFLongIsSet(true); + this.f_int = f_int; + setFIntIsSet(true); + this.f_string = f_string; + } + + /** Performs a deep copy on other. */ + public ItThriftMessage(ItThriftMessage other) { + __isset_bitfield = other.__isset_bitfield; + this.f_long = other.f_long; + this.f_int = other.f_int; + if (other.isSetFString()) { + this.f_string = other.f_string; + } + } + + public ItThriftMessage deepCopy() { + return new ItThriftMessage(this); + } + + @Override + public void clear() { + setFLongIsSet(false); + this.f_long = 0; + setFIntIsSet(false); + this.f_int = 0; + this.f_string = null; + } + + public long getFLong() { + return this.f_long; + } + + public ItThriftMessage setFLong(long f_long) { + this.f_long = f_long; + setFLongIsSet(true); + return this; + } + + public void unsetFLong() { + __isset_bitfield = + org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __F_LONG_ISSET_ID); + } + + /** Returns true if field f_long is set (has been assigned a value) and false otherwise */ + public boolean isSetFLong() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __F_LONG_ISSET_ID); + } + + public void setFLongIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __F_LONG_ISSET_ID, value); + } + + public int getFInt() { + return this.f_int; + } + + public ItThriftMessage setFInt(int f_int) { + this.f_int = f_int; + setFIntIsSet(true); + return this; + } + + public void unsetFInt() { + __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __F_INT_ISSET_ID); + } + + /** Returns true if field f_int is set (has been assigned a value) and false otherwise */ + public boolean isSetFInt() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __F_INT_ISSET_ID); + } + + public void setFIntIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __F_INT_ISSET_ID, value); + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getFString() { + return this.f_string; + } + + public ItThriftMessage setFString( + @org.apache.thrift.annotation.Nullable java.lang.String f_string) { + this.f_string = f_string; + return this; + } + + public void unsetFString() { + this.f_string = null; + } + + /** Returns true if field f_string is set (has been assigned a value) and false otherwise */ + public boolean isSetFString() { + return this.f_string != null; + } + + public void setFStringIsSet(boolean value) { + if (!value) { + this.f_string = null; + } + } + + public void setFieldValue( + _Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case F_LONG: + if (value == null) { + unsetFLong(); + } else { + setFLong((java.lang.Long) value); + } + break; + + case F_INT: + if (value == null) { + unsetFInt(); + } else { + setFInt((java.lang.Integer) value); + } + break; + + case F_STRING: + if (value == null) { + unsetFString(); + } else { + setFString((java.lang.String) value); + } + break; + } + } + + @org.apache.thrift.annotation.Nullable + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case F_LONG: + return getFLong(); + + case F_INT: + return getFInt(); + + case F_STRING: + return getFString(); + } + throw new java.lang.IllegalStateException(); + } + + /** + * Returns true if field corresponding to fieldID is set (has been assigned a value) and false + * otherwise + */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case F_LONG: + return isSetFLong(); + case F_INT: + return isSetFInt(); + case F_STRING: + return isSetFString(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that == null) return false; + if (that instanceof ItThriftMessage) return this.equals((ItThriftMessage) that); + return false; + } + + public boolean equals(ItThriftMessage that) { + if (that == null) return false; + if (this == that) return true; + + boolean this_present_f_long = true; + boolean that_present_f_long = true; + if (this_present_f_long || that_present_f_long) { + if (!(this_present_f_long && that_present_f_long)) return false; + if (this.f_long != that.f_long) return false; + } + + boolean this_present_f_int = true; + boolean that_present_f_int = true; + if (this_present_f_int || that_present_f_int) { + if (!(this_present_f_int && that_present_f_int)) return false; + if (this.f_int != that.f_int) return false; + } + + boolean this_present_f_string = true && this.isSetFString(); + boolean that_present_f_string = true && that.isSetFString(); + if (this_present_f_string || that_present_f_string) { + if (!(this_present_f_string && that_present_f_string)) return false; + if (!this.f_string.equals(that.f_string)) return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(f_long); + + hashCode = hashCode * 8191 + f_int; + + hashCode = hashCode * 8191 + ((isSetFString()) ? 131071 : 524287); + if (isSetFString()) hashCode = hashCode * 8191 + f_string.hashCode(); + + return hashCode; + } + + @Override + public int compareTo(ItThriftMessage other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.valueOf(isSetFLong()).compareTo(other.isSetFLong()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFLong()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_long, other.f_long); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetFInt()).compareTo(other.isSetFInt()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFInt()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_int, other.f_int); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetFString()).compareTo(other.isSetFString()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFString()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_string, other.f_string); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("ItThriftMessage("); + boolean first = true; + + sb.append("f_long:"); + sb.append(this.f_long); + first = false; + if (!first) sb.append(", "); + sb.append("f_int:"); + sb.append(this.f_int); + first = false; + if (!first) sb.append(", "); + sb.append("f_string:"); + if (this.f_string == null) { + sb.append("null"); + } else { + sb.append(this.f_string); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // alas, we cannot check 'f_long' because it's a primitive and you chose the non-beans + // generator. + // alas, we cannot check 'f_int' because it's a primitive and you chose the non-beans generator. + if (f_string == null) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_string' was not present! Struct: " + toString()); + } + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) + throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and + // doesn't call the default constructor. + __isset_bitfield = 0; + read( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class ItThriftMessageStandardSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public ItThriftMessageStandardScheme getScheme() { + return new ItThriftMessageStandardScheme(); + } + } + + private static class ItThriftMessageStandardScheme + extends org.apache.thrift.scheme.StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, ItThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // F_LONG + if (schemeField.type == org.apache.thrift.protocol.TType.I64) { + struct.f_long = iprot.readI64(); + struct.setFLongIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // F_INT + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.f_int = iprot.readI32(); + struct.setFIntIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 3: // F_STRING + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.f_string = iprot.readString(); + struct.setFStringIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + if (!struct.isSetFLong()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_long' was not found in serialized data! Struct: " + toString()); + } + if (!struct.isSetFInt()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_int' was not found in serialized data! Struct: " + toString()); + } + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, ItThriftMessage struct) + throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + oprot.writeFieldBegin(F_LONG_FIELD_DESC); + oprot.writeI64(struct.f_long); + oprot.writeFieldEnd(); + oprot.writeFieldBegin(F_INT_FIELD_DESC); + oprot.writeI32(struct.f_int); + oprot.writeFieldEnd(); + if (struct.f_string != null) { + oprot.writeFieldBegin(F_STRING_FIELD_DESC); + oprot.writeString(struct.f_string); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + } + + private static class ItThriftMessageTupleSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public ItThriftMessageTupleScheme getScheme() { + return new ItThriftMessageTupleScheme(); + } + } + + private static class ItThriftMessageTupleScheme + extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, ItThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + oprot.writeI64(struct.f_long); + oprot.writeI32(struct.f_int); + oprot.writeString(struct.f_string); + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, ItThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + struct.f_long = iprot.readI64(); + struct.setFLongIsSet(true); + struct.f_int = iprot.readI32(); + struct.setFIntIsSet(true); + struct.f_string = iprot.readString(); + struct.setFStringIsSet(true); + } + } + + private static S scheme( + org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) + ? STANDARD_SCHEME_FACTORY + : TUPLE_SCHEME_FACTORY) + .getScheme(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/SimpleThriftMessage.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/SimpleThriftMessage.java new file mode 100644 index 000000000000..8b5e32125399 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/SimpleThriftMessage.java @@ -0,0 +1,509 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift; + +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-20") +public class SimpleThriftMessage + implements org.apache.thrift.TBase, + java.io.Serializable, + Cloneable, + Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = + new org.apache.thrift.protocol.TStruct("SimpleThriftMessage"); + + private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = + new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.I32, (short) 1); + private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "name", org.apache.thrift.protocol.TType.STRING, (short) 2); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = + new SimpleThriftMessageStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = + new SimpleThriftMessageTupleSchemeFactory(); + + private int id; // required + private @org.apache.thrift.annotation.Nullable java.lang.String name; // required + + /** + * The set of fields this struct contains, along with convenience methods for finding and + * manipulating them. + */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + ID((short) 1, "id"), + NAME((short) 2, "name"); + + private static final java.util.Map byName = + new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** Find the _Fields constant that matches fieldId, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch (fieldId) { + case 1: // ID + return ID; + case 2: // NAME + return NAME; + default: + return null; + } + } + + /** Find the _Fields constant that matches fieldId, throwing an exception if it is not found. */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) + throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** Find the _Fields constant that matches name, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __ID_ISSET_ID = 0; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = + new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put( + _Fields.ID, + new org.apache.thrift.meta_data.FieldMetaData( + "id", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I32))); + tmpMap.put( + _Fields.NAME, + new org.apache.thrift.meta_data.FieldMetaData( + "name", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.STRING))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( + SimpleThriftMessage.class, metaDataMap); + } + + public SimpleThriftMessage() {} + + public SimpleThriftMessage(int id, java.lang.String name) { + this(); + this.id = id; + setIdIsSet(true); + this.name = name; + } + + /** Performs a deep copy on other. */ + public SimpleThriftMessage(SimpleThriftMessage other) { + __isset_bitfield = other.__isset_bitfield; + this.id = other.id; + if (other.isSetName()) { + this.name = other.name; + } + } + + public SimpleThriftMessage deepCopy() { + return new SimpleThriftMessage(this); + } + + @Override + public void clear() { + setIdIsSet(false); + this.id = 0; + this.name = null; + } + + public int getId() { + return this.id; + } + + public SimpleThriftMessage setId(int id) { + this.id = id; + setIdIsSet(true); + return this; + } + + public void unsetId() { + __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID); + } + + /** Returns true if field id is set (has been assigned a value) and false otherwise */ + public boolean isSetId() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID); + } + + public void setIdIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value); + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getName() { + return this.name; + } + + public SimpleThriftMessage setName(@org.apache.thrift.annotation.Nullable java.lang.String name) { + this.name = name; + return this; + } + + public void unsetName() { + this.name = null; + } + + /** Returns true if field name is set (has been assigned a value) and false otherwise */ + public boolean isSetName() { + return this.name != null; + } + + public void setNameIsSet(boolean value) { + if (!value) { + this.name = null; + } + } + + public void setFieldValue( + _Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case ID: + if (value == null) { + unsetId(); + } else { + setId((java.lang.Integer) value); + } + break; + + case NAME: + if (value == null) { + unsetName(); + } else { + setName((java.lang.String) value); + } + break; + } + } + + @org.apache.thrift.annotation.Nullable + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case ID: + return getId(); + + case NAME: + return getName(); + } + throw new java.lang.IllegalStateException(); + } + + /** + * Returns true if field corresponding to fieldID is set (has been assigned a value) and false + * otherwise + */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case ID: + return isSetId(); + case NAME: + return isSetName(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that == null) return false; + if (that instanceof SimpleThriftMessage) return this.equals((SimpleThriftMessage) that); + return false; + } + + public boolean equals(SimpleThriftMessage that) { + if (that == null) return false; + if (this == that) return true; + + boolean this_present_id = true; + boolean that_present_id = true; + if (this_present_id || that_present_id) { + if (!(this_present_id && that_present_id)) return false; + if (this.id != that.id) return false; + } + + boolean this_present_name = true && this.isSetName(); + boolean that_present_name = true && that.isSetName(); + if (this_present_name || that_present_name) { + if (!(this_present_name && that_present_name)) return false; + if (!this.name.equals(that.name)) return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + id; + + hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287); + if (isSetName()) hashCode = hashCode * 8191 + name.hashCode(); + + return hashCode; + } + + @Override + public int compareTo(SimpleThriftMessage other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetId()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetName()).compareTo(other.isSetName()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetName()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("SimpleThriftMessage("); + boolean first = true; + + sb.append("id:"); + sb.append(this.id); + first = false; + if (!first) sb.append(", "); + sb.append("name:"); + if (this.name == null) { + sb.append("null"); + } else { + sb.append(this.name); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // alas, we cannot check 'id' because it's a primitive and you chose the non-beans generator. + if (name == null) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'name' was not present! Struct: " + toString()); + } + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) + throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and + // doesn't call the default constructor. + __isset_bitfield = 0; + read( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class SimpleThriftMessageStandardSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public SimpleThriftMessageStandardScheme getScheme() { + return new SimpleThriftMessageStandardScheme(); + } + } + + private static class SimpleThriftMessageStandardScheme + extends org.apache.thrift.scheme.StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, SimpleThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // ID + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.id = iprot.readI32(); + struct.setIdIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // NAME + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.name = iprot.readString(); + struct.setNameIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + if (!struct.isSetId()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'id' was not found in serialized data! Struct: " + toString()); + } + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, SimpleThriftMessage struct) + throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + oprot.writeFieldBegin(ID_FIELD_DESC); + oprot.writeI32(struct.id); + oprot.writeFieldEnd(); + if (struct.name != null) { + oprot.writeFieldBegin(NAME_FIELD_DESC); + oprot.writeString(struct.name); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + } + + private static class SimpleThriftMessageTupleSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public SimpleThriftMessageTupleScheme getScheme() { + return new SimpleThriftMessageTupleScheme(); + } + } + + private static class SimpleThriftMessageTupleScheme + extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, SimpleThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + oprot.writeI32(struct.id); + oprot.writeString(struct.name); + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, SimpleThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + struct.id = iprot.readI32(); + struct.setIdIsSet(true); + struct.name = iprot.readString(); + struct.setNameIsSet(true); + } + } + + private static S scheme( + org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) + ? STANDARD_SCHEME_FACTORY + : TUPLE_SCHEME_FACTORY) + .getScheme(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/TestThriftMessage.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/TestThriftMessage.java new file mode 100644 index 000000000000..1f99d9a3ce31 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/thrift/TestThriftMessage.java @@ -0,0 +1,881 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift; + +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-20") +public class TestThriftMessage + implements org.apache.thrift.TBase, + java.io.Serializable, + Cloneable, + Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = + new org.apache.thrift.protocol.TStruct("TestThriftMessage"); + + private static final org.apache.thrift.protocol.TField F_LONG_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_long", org.apache.thrift.protocol.TType.I64, (short) 1); + private static final org.apache.thrift.protocol.TField F_INT_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_int", org.apache.thrift.protocol.TType.I32, (short) 2); + private static final org.apache.thrift.protocol.TField F_DOUBLE_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_double", org.apache.thrift.protocol.TType.DOUBLE, (short) 3); + private static final org.apache.thrift.protocol.TField F_STRING_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_string", org.apache.thrift.protocol.TType.STRING, (short) 4); + private static final org.apache.thrift.protocol.TField F_DOUBLE_ARRAY_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "f_double_array", org.apache.thrift.protocol.TType.LIST, (short) 5); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = + new TestThriftMessageStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = + new TestThriftMessageTupleSchemeFactory(); + + private long f_long; // required + private int f_int; // required + private double f_double; // required + private @org.apache.thrift.annotation.Nullable java.lang.String f_string; // required + private @org.apache.thrift.annotation.Nullable java.util.List + f_double_array; // required + + /** + * The set of fields this struct contains, along with convenience methods for finding and + * manipulating them. + */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + F_LONG((short) 1, "f_long"), + F_INT((short) 2, "f_int"), + F_DOUBLE((short) 3, "f_double"), + F_STRING((short) 4, "f_string"), + F_DOUBLE_ARRAY((short) 5, "f_double_array"); + + private static final java.util.Map byName = + new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** Find the _Fields constant that matches fieldId, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch (fieldId) { + case 1: // F_LONG + return F_LONG; + case 2: // F_INT + return F_INT; + case 3: // F_DOUBLE + return F_DOUBLE; + case 4: // F_STRING + return F_STRING; + case 5: // F_DOUBLE_ARRAY + return F_DOUBLE_ARRAY; + default: + return null; + } + } + + /** Find the _Fields constant that matches fieldId, throwing an exception if it is not found. */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) + throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** Find the _Fields constant that matches name, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __F_LONG_ISSET_ID = 0; + private static final int __F_INT_ISSET_ID = 1; + private static final int __F_DOUBLE_ISSET_ID = 2; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = + new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put( + _Fields.F_LONG, + new org.apache.thrift.meta_data.FieldMetaData( + "f_long", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I64))); + tmpMap.put( + _Fields.F_INT, + new org.apache.thrift.meta_data.FieldMetaData( + "f_int", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I32))); + tmpMap.put( + _Fields.F_DOUBLE, + new org.apache.thrift.meta_data.FieldMetaData( + "f_double", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.DOUBLE))); + tmpMap.put( + _Fields.F_STRING, + new org.apache.thrift.meta_data.FieldMetaData( + "f_string", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.STRING))); + tmpMap.put( + _Fields.F_DOUBLE_ARRAY, + new org.apache.thrift.meta_data.FieldMetaData( + "f_double_array", + org.apache.thrift.TFieldRequirementType.REQUIRED, + new org.apache.thrift.meta_data.ListMetaData( + org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.DOUBLE)))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( + TestThriftMessage.class, metaDataMap); + } + + public TestThriftMessage() { + this.f_double_array = new java.util.ArrayList(); + } + + public TestThriftMessage( + long f_long, + int f_int, + double f_double, + java.lang.String f_string, + java.util.List f_double_array) { + this(); + this.f_long = f_long; + setFLongIsSet(true); + this.f_int = f_int; + setFIntIsSet(true); + this.f_double = f_double; + setFDoubleIsSet(true); + this.f_string = f_string; + this.f_double_array = f_double_array; + } + + /** Performs a deep copy on other. */ + public TestThriftMessage(TestThriftMessage other) { + __isset_bitfield = other.__isset_bitfield; + this.f_long = other.f_long; + this.f_int = other.f_int; + this.f_double = other.f_double; + if (other.isSetFString()) { + this.f_string = other.f_string; + } + if (other.isSetFDoubleArray()) { + java.util.List __this__f_double_array = + new java.util.ArrayList(other.f_double_array); + this.f_double_array = __this__f_double_array; + } + } + + public TestThriftMessage deepCopy() { + return new TestThriftMessage(this); + } + + @Override + public void clear() { + setFLongIsSet(false); + this.f_long = 0; + setFIntIsSet(false); + this.f_int = 0; + setFDoubleIsSet(false); + this.f_double = 0.0; + this.f_string = null; + this.f_double_array = new java.util.ArrayList(); + } + + public long getFLong() { + return this.f_long; + } + + public TestThriftMessage setFLong(long f_long) { + this.f_long = f_long; + setFLongIsSet(true); + return this; + } + + public void unsetFLong() { + __isset_bitfield = + org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __F_LONG_ISSET_ID); + } + + /** Returns true if field f_long is set (has been assigned a value) and false otherwise */ + public boolean isSetFLong() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __F_LONG_ISSET_ID); + } + + public void setFLongIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __F_LONG_ISSET_ID, value); + } + + public int getFInt() { + return this.f_int; + } + + public TestThriftMessage setFInt(int f_int) { + this.f_int = f_int; + setFIntIsSet(true); + return this; + } + + public void unsetFInt() { + __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __F_INT_ISSET_ID); + } + + /** Returns true if field f_int is set (has been assigned a value) and false otherwise */ + public boolean isSetFInt() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __F_INT_ISSET_ID); + } + + public void setFIntIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __F_INT_ISSET_ID, value); + } + + public double getFDouble() { + return this.f_double; + } + + public TestThriftMessage setFDouble(double f_double) { + this.f_double = f_double; + setFDoubleIsSet(true); + return this; + } + + public void unsetFDouble() { + __isset_bitfield = + org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __F_DOUBLE_ISSET_ID); + } + + /** Returns true if field f_double is set (has been assigned a value) and false otherwise */ + public boolean isSetFDouble() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __F_DOUBLE_ISSET_ID); + } + + public void setFDoubleIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __F_DOUBLE_ISSET_ID, value); + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getFString() { + return this.f_string; + } + + public TestThriftMessage setFString( + @org.apache.thrift.annotation.Nullable java.lang.String f_string) { + this.f_string = f_string; + return this; + } + + public void unsetFString() { + this.f_string = null; + } + + /** Returns true if field f_string is set (has been assigned a value) and false otherwise */ + public boolean isSetFString() { + return this.f_string != null; + } + + public void setFStringIsSet(boolean value) { + if (!value) { + this.f_string = null; + } + } + + public int getFDoubleArraySize() { + return (this.f_double_array == null) ? 0 : this.f_double_array.size(); + } + + @org.apache.thrift.annotation.Nullable + public java.util.Iterator getFDoubleArrayIterator() { + return (this.f_double_array == null) ? null : this.f_double_array.iterator(); + } + + public void addToFDoubleArray(double elem) { + if (this.f_double_array == null) { + this.f_double_array = new java.util.ArrayList(); + } + this.f_double_array.add(elem); + } + + @org.apache.thrift.annotation.Nullable + public java.util.List getFDoubleArray() { + return this.f_double_array; + } + + public TestThriftMessage setFDoubleArray( + @org.apache.thrift.annotation.Nullable java.util.List f_double_array) { + this.f_double_array = f_double_array; + return this; + } + + public void unsetFDoubleArray() { + this.f_double_array = null; + } + + /** Returns true if field f_double_array is set (has been assigned a value) and false otherwise */ + public boolean isSetFDoubleArray() { + return this.f_double_array != null; + } + + public void setFDoubleArrayIsSet(boolean value) { + if (!value) { + this.f_double_array = null; + } + } + + public void setFieldValue( + _Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case F_LONG: + if (value == null) { + unsetFLong(); + } else { + setFLong((java.lang.Long) value); + } + break; + + case F_INT: + if (value == null) { + unsetFInt(); + } else { + setFInt((java.lang.Integer) value); + } + break; + + case F_DOUBLE: + if (value == null) { + unsetFDouble(); + } else { + setFDouble((java.lang.Double) value); + } + break; + + case F_STRING: + if (value == null) { + unsetFString(); + } else { + setFString((java.lang.String) value); + } + break; + + case F_DOUBLE_ARRAY: + if (value == null) { + unsetFDoubleArray(); + } else { + setFDoubleArray((java.util.List) value); + } + break; + } + } + + @org.apache.thrift.annotation.Nullable + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case F_LONG: + return getFLong(); + + case F_INT: + return getFInt(); + + case F_DOUBLE: + return getFDouble(); + + case F_STRING: + return getFString(); + + case F_DOUBLE_ARRAY: + return getFDoubleArray(); + } + throw new java.lang.IllegalStateException(); + } + + /** + * Returns true if field corresponding to fieldID is set (has been assigned a value) and false + * otherwise + */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case F_LONG: + return isSetFLong(); + case F_INT: + return isSetFInt(); + case F_DOUBLE: + return isSetFDouble(); + case F_STRING: + return isSetFString(); + case F_DOUBLE_ARRAY: + return isSetFDoubleArray(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that == null) return false; + if (that instanceof TestThriftMessage) return this.equals((TestThriftMessage) that); + return false; + } + + public boolean equals(TestThriftMessage that) { + if (that == null) return false; + if (this == that) return true; + + boolean this_present_f_long = true; + boolean that_present_f_long = true; + if (this_present_f_long || that_present_f_long) { + if (!(this_present_f_long && that_present_f_long)) return false; + if (this.f_long != that.f_long) return false; + } + + boolean this_present_f_int = true; + boolean that_present_f_int = true; + if (this_present_f_int || that_present_f_int) { + if (!(this_present_f_int && that_present_f_int)) return false; + if (this.f_int != that.f_int) return false; + } + + boolean this_present_f_double = true; + boolean that_present_f_double = true; + if (this_present_f_double || that_present_f_double) { + if (!(this_present_f_double && that_present_f_double)) return false; + if (this.f_double != that.f_double) return false; + } + + boolean this_present_f_string = true && this.isSetFString(); + boolean that_present_f_string = true && that.isSetFString(); + if (this_present_f_string || that_present_f_string) { + if (!(this_present_f_string && that_present_f_string)) return false; + if (!this.f_string.equals(that.f_string)) return false; + } + + boolean this_present_f_double_array = true && this.isSetFDoubleArray(); + boolean that_present_f_double_array = true && that.isSetFDoubleArray(); + if (this_present_f_double_array || that_present_f_double_array) { + if (!(this_present_f_double_array && that_present_f_double_array)) return false; + if (!this.f_double_array.equals(that.f_double_array)) return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(f_long); + + hashCode = hashCode * 8191 + f_int; + + hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(f_double); + + hashCode = hashCode * 8191 + ((isSetFString()) ? 131071 : 524287); + if (isSetFString()) hashCode = hashCode * 8191 + f_string.hashCode(); + + hashCode = hashCode * 8191 + ((isSetFDoubleArray()) ? 131071 : 524287); + if (isSetFDoubleArray()) hashCode = hashCode * 8191 + f_double_array.hashCode(); + + return hashCode; + } + + @Override + public int compareTo(TestThriftMessage other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.valueOf(isSetFLong()).compareTo(other.isSetFLong()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFLong()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_long, other.f_long); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetFInt()).compareTo(other.isSetFInt()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFInt()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_int, other.f_int); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetFDouble()).compareTo(other.isSetFDouble()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFDouble()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_double, other.f_double); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetFString()).compareTo(other.isSetFString()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFString()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.f_string, other.f_string); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = + java.lang.Boolean.valueOf(isSetFDoubleArray()).compareTo(other.isSetFDoubleArray()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetFDoubleArray()) { + lastComparison = + org.apache.thrift.TBaseHelper.compareTo(this.f_double_array, other.f_double_array); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("TestThriftMessage("); + boolean first = true; + + sb.append("f_long:"); + sb.append(this.f_long); + first = false; + if (!first) sb.append(", "); + sb.append("f_int:"); + sb.append(this.f_int); + first = false; + if (!first) sb.append(", "); + sb.append("f_double:"); + sb.append(this.f_double); + first = false; + if (!first) sb.append(", "); + sb.append("f_string:"); + if (this.f_string == null) { + sb.append("null"); + } else { + sb.append(this.f_string); + } + first = false; + if (!first) sb.append(", "); + sb.append("f_double_array:"); + if (this.f_double_array == null) { + sb.append("null"); + } else { + sb.append(this.f_double_array); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // alas, we cannot check 'f_long' because it's a primitive and you chose the non-beans + // generator. + // alas, we cannot check 'f_int' because it's a primitive and you chose the non-beans generator. + // alas, we cannot check 'f_double' because it's a primitive and you chose the non-beans + // generator. + if (f_string == null) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_string' was not present! Struct: " + toString()); + } + if (f_double_array == null) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_double_array' was not present! Struct: " + toString()); + } + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) + throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and + // doesn't call the default constructor. + __isset_bitfield = 0; + read( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class TestThriftMessageStandardSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public TestThriftMessageStandardScheme getScheme() { + return new TestThriftMessageStandardScheme(); + } + } + + private static class TestThriftMessageStandardScheme + extends org.apache.thrift.scheme.StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, TestThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // F_LONG + if (schemeField.type == org.apache.thrift.protocol.TType.I64) { + struct.f_long = iprot.readI64(); + struct.setFLongIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // F_INT + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.f_int = iprot.readI32(); + struct.setFIntIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 3: // F_DOUBLE + if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) { + struct.f_double = iprot.readDouble(); + struct.setFDoubleIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 4: // F_STRING + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.f_string = iprot.readString(); + struct.setFStringIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 5: // F_DOUBLE_ARRAY + if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { + { + org.apache.thrift.protocol.TList _list0 = iprot.readListBegin(); + struct.f_double_array = new java.util.ArrayList(_list0.size); + double _elem1; + for (int _i2 = 0; _i2 < _list0.size; ++_i2) { + _elem1 = iprot.readDouble(); + struct.f_double_array.add(_elem1); + } + iprot.readListEnd(); + } + struct.setFDoubleArrayIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + if (!struct.isSetFLong()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_long' was not found in serialized data! Struct: " + toString()); + } + if (!struct.isSetFInt()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_int' was not found in serialized data! Struct: " + toString()); + } + if (!struct.isSetFDouble()) { + throw new org.apache.thrift.protocol.TProtocolException( + "Required field 'f_double' was not found in serialized data! Struct: " + toString()); + } + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, TestThriftMessage struct) + throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + oprot.writeFieldBegin(F_LONG_FIELD_DESC); + oprot.writeI64(struct.f_long); + oprot.writeFieldEnd(); + oprot.writeFieldBegin(F_INT_FIELD_DESC); + oprot.writeI32(struct.f_int); + oprot.writeFieldEnd(); + oprot.writeFieldBegin(F_DOUBLE_FIELD_DESC); + oprot.writeDouble(struct.f_double); + oprot.writeFieldEnd(); + if (struct.f_string != null) { + oprot.writeFieldBegin(F_STRING_FIELD_DESC); + oprot.writeString(struct.f_string); + oprot.writeFieldEnd(); + } + if (struct.f_double_array != null) { + oprot.writeFieldBegin(F_DOUBLE_ARRAY_FIELD_DESC); + { + oprot.writeListBegin( + new org.apache.thrift.protocol.TList( + org.apache.thrift.protocol.TType.DOUBLE, struct.f_double_array.size())); + for (double _iter3 : struct.f_double_array) { + oprot.writeDouble(_iter3); + } + oprot.writeListEnd(); + } + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + } + + private static class TestThriftMessageTupleSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public TestThriftMessageTupleScheme getScheme() { + return new TestThriftMessageTupleScheme(); + } + } + + private static class TestThriftMessageTupleScheme + extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, TestThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + oprot.writeI64(struct.f_long); + oprot.writeI32(struct.f_int); + oprot.writeDouble(struct.f_double); + oprot.writeString(struct.f_string); + { + oprot.writeI32(struct.f_double_array.size()); + for (double _iter4 : struct.f_double_array) { + oprot.writeDouble(_iter4); + } + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, TestThriftMessage struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + struct.f_long = iprot.readI64(); + struct.setFLongIsSet(true); + struct.f_int = iprot.readI32(); + struct.setFIntIsSet(true); + struct.f_double = iprot.readDouble(); + struct.setFDoubleIsSet(true); + struct.f_string = iprot.readString(); + struct.setFStringIsSet(true); + { + org.apache.thrift.protocol.TList _list5 = + new org.apache.thrift.protocol.TList( + org.apache.thrift.protocol.TType.DOUBLE, iprot.readI32()); + struct.f_double_array = new java.util.ArrayList(_list5.size); + double _elem6; + for (int _i7 = 0; _i7 < _list5.size; ++_i7) { + _elem6 = iprot.readDouble(); + struct.f_double_array.add(_elem6); + } + } + struct.setFDoubleArrayIsSet(true); + } + } + + private static S scheme( + org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) + ? STANDARD_SCHEME_FACTORY + : TUPLE_SCHEME_FACTORY) + .getScheme(); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubAvroIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubAvroIT.java deleted file mode 100644 index 9b9ed68c6129..000000000000 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubAvroIT.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.extensions.sql.meta.provider.pubsub; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasProperty; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; -import org.apache.avro.generic.GenericRecord; -import org.apache.avro.generic.GenericRecordBuilder; -import org.apache.beam.sdk.coders.AvroCoder; -import org.apache.beam.sdk.io.gcp.pubsub.PubsubMessage; -import org.apache.beam.sdk.schemas.Schema; -import org.apache.beam.sdk.schemas.utils.AvroUtils; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; -import org.hamcrest.Matcher; -import org.joda.time.Instant; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Integration tests for querying Pubsub AVRO messages with SQL. */ -@RunWith(JUnit4.class) -public class PubsubAvroIT extends PubsubTableProviderIT { - private static final Schema NAME_HEIGHT_KNOWS_JS_SCHEMA = - Schema.builder() - .addNullableField("name", Schema.FieldType.STRING) - .addNullableField("height", Schema.FieldType.INT32) - .addNullableField("knowsJavascript", Schema.FieldType.BOOLEAN) - .build(); - - private static final Schema NAME_HEIGHT_SCHEMA = - Schema.builder() - .addNullableField("name", Schema.FieldType.STRING) - .addNullableField("height", Schema.FieldType.INT32) - .build(); - - @Override - protected String getPayloadFormat() { - return "avro"; - } - - @Override - protected PubsubMessage messageIdName(Instant timestamp, int id, String name) throws IOException { - byte[] encodedRecord = createEncodedGenericRecord(PAYLOAD_SCHEMA, ImmutableList.of(id, name)); - return message(timestamp, encodedRecord); - } - - @Override - protected Matcher matcherNames(String name) throws IOException { - Schema schema = Schema.builder().addStringField("name").build(); - byte[] encodedRecord = createEncodedGenericRecord(schema, ImmutableList.of(name)); - return hasProperty("payload", equalTo(encodedRecord)); - } - - @Override - protected Matcher matcherNameHeight(String name, int height) throws IOException { - byte[] encodedRecord = - createEncodedGenericRecord(NAME_HEIGHT_SCHEMA, ImmutableList.of(name, height)); - return hasProperty("payload", equalTo(encodedRecord)); - } - - @Override - protected Matcher matcherNameHeightKnowsJS( - String name, int height, boolean knowsJS) throws IOException { - byte[] encodedRecord = - createEncodedGenericRecord( - NAME_HEIGHT_KNOWS_JS_SCHEMA, ImmutableList.of(name, height, knowsJS)); - return hasProperty("payload", equalTo(encodedRecord)); - } - - private byte[] createEncodedGenericRecord(Schema beamSchema, List values) - throws IOException { - org.apache.avro.Schema avroSchema = AvroUtils.toAvroSchema(beamSchema); - GenericRecordBuilder builder = new GenericRecordBuilder(avroSchema); - List fields = avroSchema.getFields(); - for (int i = 0; i < fields.size(); ++i) { - builder.set(fields.get(i), values.get(i)); - } - AvroCoder coder = AvroCoder.of(avroSchema); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - coder.encode(builder.build(), out); - return out.toByteArray(); - } -} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubJsonIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubJsonIT.java deleted file mode 100644 index 8db903642cec..000000000000 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubJsonIT.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.extensions.sql.meta.provider.pubsub; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.apache.beam.sdk.testing.JsonMatcher.jsonBytesLike; -import static org.hamcrest.Matchers.hasProperty; - -import java.io.IOException; -import org.apache.beam.sdk.io.gcp.pubsub.PubsubMessage; -import org.hamcrest.Matcher; -import org.joda.time.Instant; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Integration tests for querying Pubsub JSON messages with SQL. */ -@RunWith(JUnit4.class) -@SuppressWarnings({"nullness", "keyfor"}) // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -public class PubsubJsonIT extends PubsubTableProviderIT { - - // Pubsub table provider should default to json - @Override - protected String getPayloadFormat() { - return null; - } - - @Override - protected PubsubMessage messageIdName(Instant timestamp, int id, String name) { - String jsonString = "{ \"id\" : " + id + ", \"name\" : \"" + name + "\" }"; - return message(timestamp, jsonString); - } - - @Override - protected Matcher matcherNames(String name) throws IOException { - return hasProperty("payload", toJsonByteLike(String.format("{\"name\":\"%s\"}", name))); - } - - @Override - protected Matcher matcherNameHeightKnowsJS( - String name, int height, boolean knowsJS) throws IOException { - String jsonString = - String.format( - "{\"name\":\"%s\", \"height\": %s, \"knowsJavascript\": %s}", name, height, knowsJS); - - return hasProperty("payload", toJsonByteLike(jsonString)); - } - - @Override - protected Matcher matcherNameHeight(String name, int height) throws IOException { - String jsonString = String.format("{\"name\":\"%s\", \"height\": %s}", name, height); - return hasProperty("payload", toJsonByteLike(jsonString)); - } - - private PubsubMessage message(Instant timestamp, String jsonPayload) { - return message(timestamp, jsonPayload.getBytes(UTF_8)); - } - - private Matcher toJsonByteLike(String jsonString) throws IOException { - return jsonBytesLike(jsonString); - } -} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubTableProviderIT.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubTableProviderIT.java index ab7880980422..4148b040543f 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubTableProviderIT.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/pubsub/PubsubTableProviderIT.java @@ -17,6 +17,8 @@ */ package org.apache.beam.sdk.extensions.sql.meta.provider.pubsub; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.beam.sdk.testing.JsonMatcher.jsonBytesLike; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.equalTo; @@ -25,11 +27,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.sql.ResultSet; -import java.sql.SQLException; import java.sql.Statement; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -38,6 +43,9 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import org.apache.avro.generic.GenericRecord; +import org.apache.avro.generic.GenericRecordBuilder; +import org.apache.beam.sdk.coders.AvroCoder; import org.apache.beam.sdk.extensions.gcp.options.GcpOptions; import org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv; import org.apache.beam.sdk.extensions.sql.impl.JdbcConnection; @@ -52,6 +60,7 @@ import org.apache.beam.sdk.options.PipelineOptions; import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.sdk.schemas.SchemaCoder; +import org.apache.beam.sdk.schemas.utils.AvroUtils; import org.apache.beam.sdk.testing.TestPipeline; import org.apache.beam.sdk.util.common.ReflectHelpers; import org.apache.beam.sdk.values.PCollection; @@ -66,16 +75,18 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; -@RunWith(JUnit4.class) +@RunWith(Parameterized.class) @SuppressWarnings({ "keyfor", "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) -public abstract class PubsubTableProviderIT implements Serializable { +public class PubsubTableProviderIT implements Serializable { - protected static final Schema PAYLOAD_SCHEMA = + private static final Schema PAYLOAD_SCHEMA = Schema.builder() .addNullableField("id", Schema.FieldType.INT32) .addNullableField("name", Schema.FieldType.STRING) @@ -88,14 +99,20 @@ public abstract class PubsubTableProviderIT implements Serializable { @Rule public transient TestPipeline pipeline = TestPipeline.create(); @Rule public transient TestPipeline filterPipeline = TestPipeline.create(); private final SchemaIOTableProviderWrapper tableProvider = new PubsubTableProvider(); - private final String payloadFormatParam = - getPayloadFormat() == null ? "" : String.format("\"format\" : \"%s\", ", getPayloadFormat()); + + @Parameters + public static Collection data() { + return Arrays.asList( + new Object[][] {{new PubsubJsonObjectProvider()}, {new PubsubAvroObjectProvider()}}); + } + + @Parameter public PubsubObjectProvider objectsProvider; /** * HACK: we need an objectmapper to turn pipelineoptions back into a map. We need to use * ReflectHelpers to get the extra PipelineOptions. */ - protected static final ObjectMapper MAPPER = + private static final ObjectMapper MAPPER = new ObjectMapper() .registerModules(ObjectMapper.findModules(ReflectHelpers.findClassLoader())); @@ -116,16 +133,16 @@ public void testSQLSelectsPayloadContent() throws Exception { + "TBLPROPERTIES '{ " + "%s" + "\"timestampAttributeKey\" : \"ts\" }'", - tableProvider.getTableType(), eventsTopic.topicPath(), payloadFormatParam); + tableProvider.getTableType(), eventsTopic.topicPath(), payloadFormatParam()); String queryString = "SELECT message.payload.id, message.payload.name from message"; // Prepare messages to send later List messages = ImmutableList.of( - messageIdName(ts(1), 3, "foo"), - messageIdName(ts(2), 5, "bar"), - messageIdName(ts(3), 7, "baz")); + objectsProvider.messageIdName(ts(1), 3, "foo"), + objectsProvider.messageIdName(ts(2), 5, "bar"), + objectsProvider.messageIdName(ts(3), 7, "baz")); // Initialize SQL environment and create the pubsub table BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new PubsubTableProvider()); @@ -161,6 +178,7 @@ public void testSQLSelectsPayloadContent() throws Exception { } @Test + @SuppressWarnings("unchecked") public void testUsesDlq() throws Exception { String createTableString = String.format( @@ -182,7 +200,7 @@ public void testUsesDlq() throws Exception { + " }'", tableProvider.getTableType(), eventsTopic.topicPath(), - payloadFormatParam, + payloadFormatParam(), dlqTopic.topicPath()); String queryString = "SELECT message.payload.id, message.payload.name from message"; @@ -190,9 +208,9 @@ public void testUsesDlq() throws Exception { // Prepare messages to send later List messages = ImmutableList.of( - messageIdName(ts(1), 3, "foo"), - messageIdName(ts(2), 5, "bar"), - messageIdName(ts(3), 7, "baz"), + objectsProvider.messageIdName(ts(1), 3, "foo"), + objectsProvider.messageIdName(ts(2), 5, "bar"), + objectsProvider.messageIdName(ts(3), 7, "baz"), messagePayload(ts(4), "{ - }"), // invalid message, will go to DLQ messagePayload(ts(5), "{ + }")); // invalid message, will go to DLQ @@ -230,10 +248,11 @@ public void testUsesDlq() throws Exception { dlqTopic .assertThatTopicEventuallyReceives( matcherPayload(ts(4), "{ - }"), matcherPayload(ts(5), "{ + }")) - .waitForUpTo(Duration.standardSeconds(20)); + .waitForUpTo(Duration.standardSeconds(40)); } @Test + @SuppressWarnings({"unchecked", "rawtypes"}) public void testSQLLimit() throws Exception { String createTableString = String.format( @@ -255,18 +274,18 @@ public void testSQLLimit() throws Exception { + " }'", tableProvider.getTableType(), eventsTopic.topicPath(), - payloadFormatParam, + payloadFormatParam(), dlqTopic.topicPath()); List messages = ImmutableList.of( - messageIdName(ts(1), 3, "foo"), - messageIdName(ts(2), 5, "bar"), - messageIdName(ts(3), 7, "baz"), - messageIdName(ts(4), 9, "ba2"), - messageIdName(ts(5), 10, "ba3"), - messageIdName(ts(6), 13, "ba4"), - messageIdName(ts(7), 15, "ba5")); + objectsProvider.messageIdName(ts(1), 3, "foo"), + objectsProvider.messageIdName(ts(2), 5, "bar"), + objectsProvider.messageIdName(ts(3), 7, "baz"), + objectsProvider.messageIdName(ts(4), 9, "ba2"), + objectsProvider.messageIdName(ts(5), 10, "ba3"), + objectsProvider.messageIdName(ts(6), 13, "ba4"), + objectsProvider.messageIdName(ts(7), 15, "ba5")); // We need the default options on the schema to include the project passed in for the // integration test @@ -316,16 +335,16 @@ public void testSQLSelectsPayloadContentFlat() throws Exception { + " %s" + " \"timestampAttributeKey\" : \"ts\" " + " }'", - tableProvider.getTableType(), eventsTopic.topicPath(), payloadFormatParam); + tableProvider.getTableType(), eventsTopic.topicPath(), payloadFormatParam()); String queryString = "SELECT message.id, message.name from message"; // Prepare messages to send later List messages = ImmutableList.of( - messageIdName(ts(1), 3, "foo"), - messageIdName(ts(2), 5, "bar"), - messageIdName(ts(3), 7, "baz")); + objectsProvider.messageIdName(ts(1), 3, "foo"), + objectsProvider.messageIdName(ts(2), 5, "bar"), + objectsProvider.messageIdName(ts(3), 7, "baz")); // Initialize SQL environment and create the pubsub table BeamSqlEnv sqlEnv = BeamSqlEnv.inMemory(new PubsubTableProvider()); @@ -361,6 +380,7 @@ public void testSQLSelectsPayloadContentFlat() throws Exception { } @Test + @SuppressWarnings("unchecked") public void testSQLInsertRowsToPubsubFlat() throws Exception { String createTableString = String.format( @@ -379,7 +399,7 @@ public void testSQLInsertRowsToPubsubFlat() throws Exception { + " }'", tableProvider.getTableType(), eventsTopic.topicPath(), - payloadFormatParam, + payloadFormatParam(), dlqTopic.topicPath()); // Initialize SQL environment and create the pubsub table @@ -395,18 +415,19 @@ public void testSQLInsertRowsToPubsubFlat() throws Exception { + "('person2', 70, FALSE)"; // Apply the PTransform to insert the rows - PCollection queryOutput = query(sqlEnv, pipeline, queryString); + query(sqlEnv, pipeline, queryString); pipeline.run().waitUntilFinish(Duration.standardMinutes(5)); eventsTopic .assertThatTopicEventuallyReceives( - matcherNameHeightKnowsJS("person1", 80, true), - matcherNameHeightKnowsJS("person2", 70, false)) - .waitForUpTo(Duration.standardSeconds(20)); + objectsProvider.matcherNameHeightKnowsJS("person1", 80, true), + objectsProvider.matcherNameHeightKnowsJS("person2", 70, false)) + .waitForUpTo(Duration.standardSeconds(40)); } @Test + @SuppressWarnings("unchecked") public void testSQLInsertRowsToPubsubWithTimestampAttributeFlat() throws Exception { String createTableString = String.format( @@ -426,7 +447,7 @@ public void testSQLInsertRowsToPubsubWithTimestampAttributeFlat() throws Excepti + " }'", tableProvider.getTableType(), eventsTopic.topicPath(), - payloadFormatParam, + payloadFormatParam(), dlqTopic.topicPath()); // Initialize SQL environment and create the pubsub table @@ -438,7 +459,7 @@ public void testSQLInsertRowsToPubsubWithTimestampAttributeFlat() throws Excepti + "VALUES " + "(TIMESTAMP '1970-01-01 00:00:00.001', 'person1', 80, TRUE), " + "(TIMESTAMP '1970-01-01 00:00:00.002', 'person2', 70, FALSE)"; - PCollection queryOutput = query(sqlEnv, pipeline, queryString); + query(sqlEnv, pipeline, queryString); pipeline.run().waitUntilFinish(Duration.standardMinutes(5)); @@ -446,10 +467,11 @@ public void testSQLInsertRowsToPubsubWithTimestampAttributeFlat() throws Excepti .assertThatTopicEventuallyReceives( matcherTsNameHeightKnowsJS(ts(1), "person1", 80, true), matcherTsNameHeightKnowsJS(ts(2), "person2", 70, false)) - .waitForUpTo(Duration.standardSeconds(20)); + .waitForUpTo(Duration.standardSeconds(40)); } @Test + @SuppressWarnings("unchecked") public void testSQLReadAndWriteWithSameFlatTableDefinition() throws Exception { // This test verifies that the same pubsub table definition can be used for both reading and // writing @@ -458,9 +480,10 @@ public void testSQLReadAndWriteWithSameFlatTableDefinition() throws Exception { // `javascript_people` String tblProperties = - getPayloadFormat() == null + objectsProvider.getPayloadFormat() == null ? "" - : String.format("TBLPROPERTIES '{\"format\": \"%s\"}'", getPayloadFormat()); + : String.format( + "TBLPROPERTIES '{\"format\": \"%s\"}'", objectsProvider.getPayloadFormat()); String createTableString = String.format( "CREATE EXTERNAL TABLE people (\n" @@ -529,14 +552,14 @@ public void testSQLReadAndWriteWithSameFlatTableDefinition() throws Exception { filteredEventsTopic .assertThatTopicEventuallyReceives( - matcherNameHeight("person1", 80), - matcherNameHeight("person3", 60), - matcherNameHeight("person5", 40)) + objectsProvider.matcherNameHeight("person1", 80), + objectsProvider.matcherNameHeight("person3", 60), + objectsProvider.matcherNameHeight("person5", 40)) .waitForUpTo(Duration.standardMinutes(5)); } - private CalciteConnection connect(PipelineOptions options, TableProvider... tableProviders) - throws SQLException { + @SuppressWarnings("unchecked") + private CalciteConnection connect(PipelineOptions options, TableProvider... tableProviders) { // HACK: PipelineOptions should expose a prominent method to do this reliably // The actual options are in the "options" field of the converted map Map argsMap = @@ -569,50 +592,180 @@ private static String toArg(Object o) { } } + private String payloadFormatParam() { + return objectsProvider.getPayloadFormat() == null + ? "" + : String.format("\"format\" : \"%s\", ", objectsProvider.getPayloadFormat()); + } + private PCollection query(BeamSqlEnv sqlEnv, TestPipeline pipeline, String queryString) { return BeamSqlRelUtils.toPCollection(pipeline, sqlEnv.parseQuery(queryString)); } - protected Row row(Schema schema, Object... values) { + private Row row(Schema schema, Object... values) { return Row.withSchema(schema).addValues(values).build(); } - protected PubsubMessage message(Instant timestamp, byte[] payload) { + private static PubsubMessage message(Instant timestamp, byte[] payload) { return new PubsubMessage(payload, ImmutableMap.of("ts", String.valueOf(timestamp.getMillis()))); } - protected Matcher matcherTsNameHeightKnowsJS( + private Matcher matcherTsNameHeightKnowsJS( Instant ts, String name, int height, boolean knowsJS) throws Exception { return allOf( - matcherNameHeightKnowsJS(name, height, knowsJS), + objectsProvider.matcherNameHeightKnowsJS(name, height, knowsJS), hasProperty("attributeMap", hasEntry("ts", String.valueOf(ts.getMillis())))); } - protected Matcher matcherPayload(Instant timestamp, String payload) { + private Matcher matcherPayload(Instant timestamp, String payload) { return allOf( hasProperty("payload", equalTo(payload.getBytes(StandardCharsets.US_ASCII))), hasProperty("attributeMap", hasEntry("ts", String.valueOf(timestamp.getMillis())))); } - protected Instant ts(long millis) { + private Instant ts(long millis) { return Instant.ofEpochMilli(millis); } - protected abstract String getPayloadFormat(); + private PubsubMessage messagePayload(Instant timestamp, String payload) { + return message(timestamp, payload.getBytes(StandardCharsets.US_ASCII)); + } - protected abstract PubsubMessage messageIdName(Instant timestamp, int id, String name) - throws Exception; + private abstract static class PubsubObjectProvider implements Serializable { + protected abstract String getPayloadFormat(); - protected abstract Matcher matcherNames(String name) throws Exception; + protected abstract PubsubMessage messageIdName(Instant timestamp, int id, String name) + throws Exception; - protected abstract Matcher matcherNameHeightKnowsJS( - String name, int height, boolean knowsJS) throws Exception; + protected abstract Matcher matcherNames(String name) throws Exception; - protected abstract Matcher matcherNameHeight(String name, int height) - throws Exception; + protected abstract Matcher matcherNameHeightKnowsJS( + String name, int height, boolean knowsJS) throws Exception; - private PubsubMessage messagePayload(Instant timestamp, String payload) { - return message(timestamp, payload.getBytes(StandardCharsets.US_ASCII)); + protected abstract Matcher matcherNameHeight(String name, int height) + throws Exception; + } + + private static class PubsubJsonObjectProvider extends PubsubObjectProvider { + + // Pubsub table provider should default to json + @Override + protected String getPayloadFormat() { + return null; + } + + @Override + protected PubsubMessage messageIdName(Instant timestamp, int id, String name) { + String jsonString = "{ \"id\" : " + id + ", \"name\" : \"" + name + "\" }"; + return message(timestamp, jsonString); + } + + @Override + protected Matcher matcherNames(String name) throws IOException { + return hasProperty("payload", toJsonByteLike(String.format("{\"name\":\"%s\"}", name))); + } + + @Override + protected Matcher matcherNameHeightKnowsJS( + String name, int height, boolean knowsJS) throws IOException { + String jsonString = + String.format( + "{\"name\":\"%s\", \"height\": %s, \"knowsJavascript\": %s}", name, height, knowsJS); + + return hasProperty("payload", toJsonByteLike(jsonString)); + } + + @Override + protected Matcher matcherNameHeight(String name, int height) throws IOException { + String jsonString = String.format("{\"name\":\"%s\", \"height\": %s}", name, height); + return hasProperty("payload", toJsonByteLike(jsonString)); + } + + private PubsubMessage message(Instant timestamp, String jsonPayload) { + return PubsubTableProviderIT.message(timestamp, jsonPayload.getBytes(UTF_8)); + } + + private Matcher toJsonByteLike(String jsonString) throws IOException { + return jsonBytesLike(jsonString); + } + } + + private static class PubsubAvroObjectProvider extends PubsubObjectProvider { + private static final Schema NAME_HEIGHT_KNOWS_JS_SCHEMA = + Schema.builder() + .addNullableField("name", Schema.FieldType.STRING) + .addNullableField("height", Schema.FieldType.INT32) + .addNullableField("knowsJavascript", Schema.FieldType.BOOLEAN) + .build(); + + private static final Schema NAME_HEIGHT_SCHEMA = + Schema.builder() + .addNullableField("name", Schema.FieldType.STRING) + .addNullableField("height", Schema.FieldType.INT32) + .build(); + + @Override + protected String getPayloadFormat() { + return "avro"; + } + + @Override + protected PubsubMessage messageIdName(Instant timestamp, int id, String name) + throws IOException { + byte[] encodedRecord = + createEncodedGenericRecord( + PAYLOAD_SCHEMA, + org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList.of( + id, name)); + return message(timestamp, encodedRecord); + } + + @Override + protected Matcher matcherNames(String name) throws IOException { + Schema schema = Schema.builder().addStringField("name").build(); + byte[] encodedRecord = + createEncodedGenericRecord( + schema, + org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList.of( + name)); + return hasProperty("payload", equalTo(encodedRecord)); + } + + @Override + protected Matcher matcherNameHeight(String name, int height) throws IOException { + byte[] encodedRecord = + createEncodedGenericRecord( + NAME_HEIGHT_SCHEMA, + org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList.of( + name, height)); + return hasProperty("payload", equalTo(encodedRecord)); + } + + @Override + protected Matcher matcherNameHeightKnowsJS( + String name, int height, boolean knowsJS) throws IOException { + byte[] encodedRecord = + createEncodedGenericRecord( + NAME_HEIGHT_KNOWS_JS_SCHEMA, + org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList.of( + name, height, knowsJS)); + return hasProperty("payload", equalTo(encodedRecord)); + } + + private byte[] createEncodedGenericRecord(Schema beamSchema, List values) + throws IOException { + org.apache.avro.Schema avroSchema = AvroUtils.toAvroSchema(beamSchema); + GenericRecordBuilder builder = new GenericRecordBuilder(avroSchema); + List fields = avroSchema.getFields(); + for (int i = 0; i < fields.size(); ++i) { + builder.set(fields.get(i), values.get(i)); + } + AvroCoder coder = AvroCoder.of(avroSchema); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + coder.encode(builder.build(), out); + return out.toByteArray(); + } } } diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/text/TextTableProviderTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/text/TextTableProviderTest.java index 1c1b6bab2420..3cfb8de1edd5 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/text/TextTableProviderTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/text/TextTableProviderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.extensions.sql.meta.provider.text; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.junit.Assert.assertThat; import java.io.File; import java.nio.file.Files; diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStoreTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStoreTest.java index 5929ac9118db..ba986e806d89 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStoreTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStoreTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.extensions.sql.meta.store; import static org.apache.beam.sdk.schemas.Schema.toSchema; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import com.alibaba.fastjson.JSONObject; import java.util.HashMap; diff --git a/sdks/java/extensions/sql/src/test/thrift/kafka/messages.thrift b/sdks/java/extensions/sql/src/test/thrift/kafka/messages.thrift new file mode 100644 index 000000000000..5f95b9fe6010 --- /dev/null +++ b/sdks/java/extensions/sql/src/test/thrift/kafka/messages.thrift @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +thrift --gen java:private-members,fullcamel \ + -out sdks/java/extensions/sql/src/test/java/ \ + sdks/java/extensions/sql/src/test/thrift/kafka/message.thrift + +./gradlew :sdks:java:extensions:sql:spotlessApply +*/ + +namespace java org.apache.beam.sdk.extensions.sql.meta.provider.kafka.thrift + +struct TestThriftMessage { + 1: required i64 f_long + 2: required i32 f_int + 3: required double f_double + 4: required string f_string + 5: required list f_double_array = 5 +} + +struct SimpleThriftMessage { + 1: required i32 id + 2: required string name +} + +struct ItThriftMessage { + 1: required i64 f_long + 2: required i32 f_int + 3: required string f_string +} diff --git a/sdks/java/extensions/sql/udf/build.gradle b/sdks/java/extensions/sql/udf/build.gradle new file mode 100644 index 000000000000..4fc392e06ff2 --- /dev/null +++ b/sdks/java/extensions/sql/udf/build.gradle @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * License); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { id 'org.apache.beam.module' } + +applyJavaNature(automaticModuleName: 'org.apache.beam.sdk.extensions.sql.udf') + +description = "Apache Beam :: SDKs :: Java :: Extensions :: SQL :: UDF" +ext.summary = "Provides interfaces for defining user-defined functions in Beam SQL." + +dependencies { + // None, except for those declared by applyJavaNature. + // Please think twice before adding dependencies here. The purpose of this module is to provide a way to define SQL + // functions in Java without depending on the rest of Beam. +} diff --git a/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/AggregateFn.java b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/AggregateFn.java new file mode 100644 index 000000000000..1c1cecedcdce --- /dev/null +++ b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/AggregateFn.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.udf; + +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * An aggregate function that can be executed as part of a SQL query. + * + *

AggregateFn contains a subset of the functionality of {@code + * org.apache.beam.sdk.transforms.Combine.CombineFn}. + * + *

AggregateFn is experimental. Compatibility is not guaranteed across Beam + * versions. + * + * @param type of input values + * @param type of mutable accumulator values + * @param type of output values + */ +public interface AggregateFn< + InputT extends @Nullable Object, + AccumT extends @Nullable Object, + OutputT extends @Nullable Object> { + + /** + * Returns a new, mutable accumulator value, representing the accumulation of zero input values. + */ + AccumT createAccumulator(); + + /** + * Adds the given input value to the given accumulator, returning the new accumulator value. + * + * @param mutableAccumulator may be modified and returned for efficiency + * @param input should not be mutated + */ + AccumT addInput(AccumT mutableAccumulator, InputT input); + + /** + * Returns an accumulator representing the accumulation of all the input values accumulated in the + * merging accumulators. + * + * @param mutableAccumulator This accumulator may be modified and returned for efficiency. + * @param immutableAccumulators These other accumulators should not be mutated, because they may + * be shared with other code and mutating them could lead to incorrect results or data + * corruption. + */ + AccumT mergeAccumulators(AccumT mutableAccumulator, Iterable immutableAccumulators); + + /** + * Returns the output value that is the result of combining all the input values represented by + * the given accumulator. + * + * @param mutableAccumulator can be modified for efficiency + */ + OutputT extractOutput(AccumT mutableAccumulator); +} diff --git a/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/ScalarFn.java b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/ScalarFn.java new file mode 100644 index 000000000000..1c6482c80007 --- /dev/null +++ b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/ScalarFn.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.udf; + +import java.io.Serializable; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A scalar function that can be executed as part of a SQL query. Subclasses must contain exactly + * one method annotated with {@link ApplyMethod}, which will be applied to the SQL function + * arguments at runtime. + * + *

For example: + * + *


+ * public class IncrementFn extends ScalarFn {
+ *  {@literal @ApplyMethod}
+ *   public Long increment(Long i) {
+ *     return i + 1;
+ *   }
+ * }
+ * 
+ * + *

ScalarFn is experimental. Compatibility is not guaranteed across Beam + * versions. + */ +public abstract class ScalarFn implements Serializable { + /** + * Annotates the single method in a {@link ScalarFn} implementation that is to be applied to SQL + * function arguments. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public static @interface ApplyMethod {} +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderAvroIT.java b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/UdfProvider.java similarity index 53% rename from sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderAvroIT.java rename to sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/UdfProvider.java index 22c834ec0cef..fe8b5b5a6bcb 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderAvroIT.java +++ b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/UdfProvider.java @@ -15,25 +15,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; +package org.apache.beam.sdk.extensions.sql.udf; -import org.apache.beam.sdk.schemas.utils.AvroUtils; -import org.apache.beam.sdk.transforms.SimpleFunction; -import org.apache.beam.sdk.values.Row; -import org.apache.kafka.clients.producer.ProducerRecord; +import java.util.Collections; +import java.util.Map; -public class KafkaTableProviderAvroIT extends KafkaTableProviderIT { - private final SimpleFunction toBytesFn = - AvroUtils.getRowToAvroBytesFunction(TEST_TABLE_SCHEMA); - - @Override - protected ProducerRecord generateProducerRecord(int i) { - return new ProducerRecord<>( - kafkaOptions.getKafkaTopic(), "k" + i, toBytesFn.apply(generateRow(i))); +/** + * Provider for user-defined functions written in Java. Implementations should be annotated with + * {@link com.google.auto.service.AutoService}. + */ +public interface UdfProvider { + /** Maps function names to scalar function implementations. */ + default Map userDefinedScalarFunctions() { + return Collections.emptyMap(); } - @Override - protected String getPayloadFormat() { - return "avro"; + /** Maps function names to aggregate function implementations. */ + default Map> userDefinedAggregateFunctions() { + return Collections.emptyMap(); } } diff --git a/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/package-info.java b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/package-info.java new file mode 100644 index 000000000000..a530cc322111 --- /dev/null +++ b/sdks/java/extensions/sql/udf/src/main/java/org/apache/beam/sdk/extensions/sql/udf/package-info.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Provides interfaces for defining user-defined functions in Beam SQL. + * + *

The contents of this package are experimental. (They are not marked + * {@code @Experimental} as usual because that would require a dependency on the {@code + * :sdks:java:core} module, which we want to avoid.) + */ +package org.apache.beam.sdk.extensions.sql.udf; diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/SqlAnalyzer.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/SqlAnalyzer.java index b4666cd11405..f4db1f194a94 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/SqlAnalyzer.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/SqlAnalyzer.java @@ -69,8 +69,14 @@ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) public class SqlAnalyzer { + // ZetaSQL function group identifiers. Different function groups may have divergent translation + // paths. public static final String PRE_DEFINED_WINDOW_FUNCTIONS = "pre_defined_window_functions"; public static final String USER_DEFINED_FUNCTIONS = "user_defined_functions"; + /** + * Same as {@link Function}.ZETASQL_FUNCTION_GROUP_NAME. Identifies built-in ZetaSQL functions. + */ + public static final String ZETASQL_FUNCTION_GROUP_NAME = "ZetaSQL"; private static final ImmutableSet SUPPORTED_STATEMENT_KINDS = ImmutableSet.of( diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSQLPlannerImpl.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSQLPlannerImpl.java index 6259d12485c3..ea9e332d9572 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSQLPlannerImpl.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/ZetaSQLPlannerImpl.java @@ -131,7 +131,10 @@ public RelRoot rel(String sql, QueryParameters params) { } UserFunctionDefinitions userFunctionDefinitions = - new UserFunctionDefinitions(udfBuilder.build(), udtvfBuilder.build()); + UserFunctionDefinitions.newBuilder() + .setSqlScalarFunctions(udfBuilder.build()) + .setSqlTableValuedFunctions(udtvfBuilder.build()) + .build(); ExpressionConverter expressionConverter = new ExpressionConverter(cluster, params, userFunctionDefinitions); diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ConversionContext.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ConversionContext.java index 9523b7669f15..3f87c540bda8 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ConversionContext.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ConversionContext.java @@ -79,7 +79,7 @@ QueryTrait getTrait() { } Map, ResolvedNode> getUserDefinedTableValuedFunctions() { - return getExpressionConverter().userFunctionDefinitions.sqlTableValuedFunctions; + return getExpressionConverter().userFunctionDefinitions.sqlTableValuedFunctions(); } Map getFunctionArgumentRefMapping() { diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ExpressionConverter.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ExpressionConverter.java index 24a5e1c74c09..c732c43f0e62 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ExpressionConverter.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ExpressionConverter.java @@ -26,6 +26,7 @@ import static com.google.zetasql.ZetaSQLType.TypeKind.TYPE_TIMESTAMP; import static org.apache.beam.sdk.extensions.sql.zetasql.SqlAnalyzer.PRE_DEFINED_WINDOW_FUNCTIONS; import static org.apache.beam.sdk.extensions.sql.zetasql.SqlAnalyzer.USER_DEFINED_FUNCTIONS; +import static org.apache.beam.sdk.extensions.sql.zetasql.SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; import com.google.common.base.Ascii; @@ -608,7 +609,7 @@ private RexNode convertResolvedFunctionCall( SqlOperator op = SqlOperatorMappingTable.ZETASQL_FUNCTION_TO_CALCITE_SQL_OPERATOR.get(funName); List operands = new ArrayList<>(); - if (funGroup.equals(PRE_DEFINED_WINDOW_FUNCTIONS)) { + if (PRE_DEFINED_WINDOW_FUNCTIONS.equals(funGroup)) { switch (funName) { case FIXED_WINDOW: case SESSION_WINDOW: @@ -646,7 +647,7 @@ private RexNode convertResolvedFunctionCall( throw new UnsupportedOperationException( "Unsupported function: " + funName + ". Only support TUMBLE, HOP, and SESSION now."); } - } else if (funGroup.equals("ZetaSQL")) { + } else if (ZETASQL_FUNCTION_GROUP_NAME.equals(funGroup)) { if (op == null) { Type returnType = functionCall.getSignature().getResultType().getType(); if (returnType != null) { @@ -664,9 +665,11 @@ private RexNode convertResolvedFunctionCall( operands.add( convertRexNodeFromResolvedExpr(expr, columnList, fieldList, outerFunctionArguments)); } - } else if (funGroup.equals(USER_DEFINED_FUNCTIONS)) { + } else if (USER_DEFINED_FUNCTIONS.equals(funGroup)) { ResolvedCreateFunctionStmt createFunctionStmt = - userFunctionDefinitions.sqlScalarFunctions.get(functionCall.getFunction().getNamePath()); + userFunctionDefinitions + .sqlScalarFunctions() + .get(functionCall.getFunction().getNamePath()); ResolvedExpr functionExpression = createFunctionStmt.getFunctionExpression(); ImmutableMap.Builder innerFunctionArguments = ImmutableMap.builder(); for (int i = 0; i < functionCall.getArgumentList().size(); i++) { diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/SqlOperators.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/SqlOperators.java index 1c0835c4d96d..592c8d25fa66 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/SqlOperators.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/SqlOperators.java @@ -26,6 +26,7 @@ import org.apache.beam.sdk.extensions.sql.impl.planner.BeamRelDataTypeSystem; import org.apache.beam.sdk.extensions.sql.impl.udaf.StringAgg; import org.apache.beam.sdk.extensions.sql.zetasql.DateTimeUtils; +import org.apache.beam.sdk.extensions.sql.zetasql.SqlAnalyzer; import org.apache.beam.sdk.extensions.sql.zetasql.translation.impl.BeamBuiltinMethods; import org.apache.beam.sdk.extensions.sql.zetasql.translation.impl.CastFunctionImpl; import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.jdbc.JavaTypeFactoryImpl; @@ -82,36 +83,57 @@ public class SqlOperators { new UdafImpl<>(new StringAgg.StringAggString())); public static final SqlOperator START_WITHS = - createUdfOperator("STARTS_WITH", BeamBuiltinMethods.STARTS_WITH_METHOD); + createUdfOperator( + "STARTS_WITH", + BeamBuiltinMethods.STARTS_WITH_METHOD, + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator CONCAT = - createUdfOperator("CONCAT", BeamBuiltinMethods.CONCAT_METHOD); + createUdfOperator( + "CONCAT", BeamBuiltinMethods.CONCAT_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator REPLACE = - createUdfOperator("REPLACE", BeamBuiltinMethods.REPLACE_METHOD); + createUdfOperator( + "REPLACE", BeamBuiltinMethods.REPLACE_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); - public static final SqlOperator TRIM = createUdfOperator("TRIM", BeamBuiltinMethods.TRIM_METHOD); + public static final SqlOperator TRIM = + createUdfOperator( + "TRIM", BeamBuiltinMethods.TRIM_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator LTRIM = - createUdfOperator("LTRIM", BeamBuiltinMethods.LTRIM_METHOD); + createUdfOperator( + "LTRIM", BeamBuiltinMethods.LTRIM_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator RTRIM = - createUdfOperator("RTRIM", BeamBuiltinMethods.RTRIM_METHOD); + createUdfOperator( + "RTRIM", BeamBuiltinMethods.RTRIM_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator SUBSTR = - createUdfOperator("SUBSTR", BeamBuiltinMethods.SUBSTR_METHOD); + createUdfOperator( + "SUBSTR", BeamBuiltinMethods.SUBSTR_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator REVERSE = - createUdfOperator("REVERSE", BeamBuiltinMethods.REVERSE_METHOD); + createUdfOperator( + "REVERSE", BeamBuiltinMethods.REVERSE_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator CHAR_LENGTH = - createUdfOperator("CHAR_LENGTH", BeamBuiltinMethods.CHAR_LENGTH_METHOD); + createUdfOperator( + "CHAR_LENGTH", + BeamBuiltinMethods.CHAR_LENGTH_METHOD, + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator ENDS_WITH = - createUdfOperator("ENDS_WITH", BeamBuiltinMethods.ENDS_WITH_METHOD); + createUdfOperator( + "ENDS_WITH", + BeamBuiltinMethods.ENDS_WITH_METHOD, + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator LIKE = - createUdfOperator("LIKE", BeamBuiltinMethods.LIKE_METHOD, SqlSyntax.BINARY); + createUdfOperator( + "LIKE", + BeamBuiltinMethods.LIKE_METHOD, + SqlSyntax.BINARY, + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator VALIDATE_TIMESTAMP = createUdfOperator( @@ -119,7 +141,8 @@ public class SqlOperators { DateTimeUtils.class, "validateTimestamp", x -> NULLABLE_TIMESTAMP, - ImmutableList.of(TIMESTAMP)); + ImmutableList.of(TIMESTAMP), + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator VALIDATE_TIME_INTERVAL = createUdfOperator( @@ -127,13 +150,18 @@ public class SqlOperators { DateTimeUtils.class, "validateTimeInterval", x -> NULLABLE_BIGINT, - ImmutableList.of(BIGINT, OTHER)); + ImmutableList.of(BIGINT, OTHER), + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator TIMESTAMP_OP = - createUdfOperator("TIMESTAMP", BeamBuiltinMethods.TIMESTAMP_METHOD); + createUdfOperator( + "TIMESTAMP", + BeamBuiltinMethods.TIMESTAMP_METHOD, + SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlOperator DATE_OP = - createUdfOperator("DATE", BeamBuiltinMethods.DATE_METHOD); + createUdfOperator( + "DATE", BeamBuiltinMethods.DATE_METHOD, SqlAnalyzer.ZETASQL_FUNCTION_GROUP_NAME); public static final SqlUserDefinedFunction CAST_OP = new SqlUserDefinedFunction( @@ -158,7 +186,7 @@ public static SqlFunction createZetaSqlFunction(String name, SqlTypeName returnT SqlFunctionCategory.USER_DEFINED_FUNCTION); } - private static SqlUserDefinedAggFunction createUdafOperator( + static SqlUserDefinedAggFunction createUdafOperator( String name, SqlReturnTypeInference returnTypeInference, AggregateFunction function) { return new SqlUserDefinedAggFunction( new SqlIdentifier(name, SqlParserPos.ZERO), @@ -177,26 +205,24 @@ private static SqlUserDefinedFunction createUdfOperator( Class methodClass, String methodName, SqlReturnTypeInference returnTypeInference, - List paramTypes) { + List paramTypes, + String funGroup) { return new SqlUserDefinedFunction( new SqlIdentifier(name, SqlParserPos.ZERO), returnTypeInference, null, null, paramTypes, - ScalarFunctionImpl.create(methodClass, methodName)); + ZetaSqlScalarFunctionImpl.create(methodClass, methodName, funGroup)); } - // Helper function to create SqlUserDefinedFunction based on a function name and a method. - // SqlUserDefinedFunction will be able to pass through Calcite codegen and get proper function - // called. - private static SqlUserDefinedFunction createUdfOperator(String name, Method method) { - return createUdfOperator(name, method, SqlSyntax.FUNCTION); + static SqlUserDefinedFunction createUdfOperator(String name, Method method, String funGroup) { + return createUdfOperator(name, method, SqlSyntax.FUNCTION, funGroup); } private static SqlUserDefinedFunction createUdfOperator( - String name, Method method, final SqlSyntax syntax) { - Function function = ScalarFunctionImpl.create(method); + String name, Method method, final SqlSyntax syntax, String funGroup) { + Function function = ZetaSqlScalarFunctionImpl.create(method, funGroup); final RelDataTypeFactory typeFactory = createTypeFactory(); List argTypes = new ArrayList<>(); diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/UserFunctionDefinitions.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/UserFunctionDefinitions.java index a4544e70fdad..395ad5e7a639 100644 --- a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/UserFunctionDefinitions.java +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/UserFunctionDefinitions.java @@ -17,27 +17,39 @@ */ package org.apache.beam.sdk.extensions.sql.zetasql.translation; +import com.google.auto.value.AutoValue; import com.google.zetasql.resolvedast.ResolvedNode; import com.google.zetasql.resolvedast.ResolvedNodes; import java.util.List; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; /** Holds user defined function definitions. */ -public class UserFunctionDefinitions { - public final ImmutableMap, ResolvedNodes.ResolvedCreateFunctionStmt> - sqlScalarFunctions; +@AutoValue +public abstract class UserFunctionDefinitions { + public abstract ImmutableMap, ResolvedNodes.ResolvedCreateFunctionStmt> + sqlScalarFunctions(); /** * SQL native user-defined table-valued function can be resolved by Analyzer. Keeping the function * name to its ResolvedNode mapping so during Plan conversion, UDTVF implementation can replace * inputs of TVFScanConverter. */ - public final ImmutableMap, ResolvedNode> sqlTableValuedFunctions; + public abstract ImmutableMap, ResolvedNode> sqlTableValuedFunctions(); - public UserFunctionDefinitions( - ImmutableMap, ResolvedNodes.ResolvedCreateFunctionStmt> sqlScalarFunctions, - ImmutableMap, ResolvedNode> sqlTableValuedFunctions) { - this.sqlScalarFunctions = sqlScalarFunctions; - this.sqlTableValuedFunctions = sqlTableValuedFunctions; + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setSqlScalarFunctions( + ImmutableMap, ResolvedNodes.ResolvedCreateFunctionStmt> sqlScalarFunctions); + + public abstract Builder setSqlTableValuedFunctions( + ImmutableMap, ResolvedNode> sqlTableValuedFunctions); + + public abstract UserFunctionDefinitions build(); + } + + public static Builder newBuilder() { + return new AutoValue_UserFunctionDefinitions.Builder() + .setSqlScalarFunctions(ImmutableMap.of()) + .setSqlTableValuedFunctions(ImmutableMap.of()); } } diff --git a/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ZetaSqlScalarFunctionImpl.java b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ZetaSqlScalarFunctionImpl.java new file mode 100644 index 000000000000..5255eec75e59 --- /dev/null +++ b/sdks/java/extensions/sql/zetasql/src/main/java/org/apache/beam/sdk/extensions/sql/zetasql/translation/ZetaSqlScalarFunctionImpl.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.zetasql.translation; + +import java.lang.reflect.Method; +import org.apache.beam.sdk.extensions.sql.impl.ScalarFunctionImpl; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.adapter.enumerable.CallImplementor; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.Function; +import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.ScalarFunction; + +/** ZetaSQL-specific extension to {@link ScalarFunctionImpl}. */ +public class ZetaSqlScalarFunctionImpl extends ScalarFunctionImpl { + /** + * ZetaSQL function group identifier. Different function groups may have divergent translation + * paths. + */ + public final String functionGroup; + + private ZetaSqlScalarFunctionImpl( + Method method, CallImplementor implementor, String functionGroup) { + super(method, implementor); + this.functionGroup = functionGroup; + } + + /** + * Creates {@link org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.Function} from + * given class. + * + *

If a method of the given name is not found or it does not suit, returns {@code null}. + * + * @param clazz class that is used to implement the function + * @param methodName Method name (typically "eval") + * @param functionGroup ZetaSQL function group identifier. Different function groups may have + * divergent translation paths. + * @return created {@link ScalarFunction} or null + */ + public static Function create(Class clazz, String methodName, String functionGroup) { + return create(findMethod(clazz, methodName)); + } + + /** + * Creates {@link org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.schema.Function} from + * given method. When {@code eval} method does not suit, {@code null} is returned. + * + * @param method method that is used to implement the function + * @param functionGroup ZetaSQL function group identifier. Different function groups may have + * divergent translation paths. + * @return created {@link Function} or null + */ + public static Function create(Method method, String functionGroup) { + validateMethod(method); + CallImplementor implementor = createImplementor(method); + return new ZetaSqlScalarFunctionImpl(method, implementor, functionGroup); + } + + /* + * Finds a method in a given class by name. + * @param clazz class to search method in + * @param name name of the method to find + * @return the first method with matching name or null when no method found + */ + private static Method findMethod(Class clazz, String name) { + for (Method method : clazz.getMethods()) { + if (method.getName().equals(name) && !method.isBridge()) { + return method; + } + } + throw new NoSuchMethodError( + String.format("Method %s not found in class %s.", name, clazz.getName())); + } +} diff --git a/sdks/java/extensions/zetasketch/src/main/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinct.java b/sdks/java/extensions/zetasketch/src/main/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinct.java new file mode 100644 index 000000000000..9b9daf5e0a48 --- /dev/null +++ b/sdks/java/extensions/zetasketch/src/main/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinct.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.zetasketch; + +import com.google.auto.value.AutoValue; +import java.util.List; +import javax.annotation.Nullable; +import org.apache.beam.sdk.annotations.Experimental; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.coders.KvCoder; +import org.apache.beam.sdk.extensions.zetasketch.HllCount.Init.Builder; +import org.apache.beam.sdk.transforms.Contextful; +import org.apache.beam.sdk.transforms.Contextful.Fn; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.ProcessFunction; +import org.apache.beam.sdk.transforms.display.DisplayData; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * {@code PTransform}s for estimating the number of distinct elements in a {@code PCollection}, or + * the number of distinct values associated with each key in a {@code PCollection} of {@code KV}s. + * + *

We make use of the {@link HllCount} implementation for this transform. Please use {@link + * HllCount} directly if you need access to the sketches. + * + *

If the object is not one of {@link Byte[]} {@link Integer} {@link Double} {@link String} make + * use of {@link Globally#via} or {@link PerKey#via} + * + *

Examples

+ * + *

Example 1: Approximate Count of Ints {@code PCollection} and specify precision

+ * + *
{@code
+ * p.apply("Int", Create.of(ints)).apply("IntHLL", ApproximateCountDistinct.globally()
+ *   .withPercision(PRECISION));
+ *
+ * }
+ * + *

Example 2: Approximate Count of Key Value {@code PCollection>}

+ * + *
{@code
+ * PCollection> result =
+ *   p.apply("Long", Create.of(longs)).apply("LongHLL", ApproximateCountDistinct.perKey());
+ *
+ * }
+ * + *

Example 3: Approximate Count of Key Value {@code PCollection>}

+ * + *
{@code
+ * PCollection> approxResultInteger =
+ *   p.apply("Int", Create.of(Foo))
+ *     .apply("IntHLL", ApproximateCountDistinct.>perKey()
+ *       .via(kv -> KV.of(kv.getKey(), (long) kv.getValue().hashCode())));
+ * }
+ */ +@Experimental +public class ApproximateCountDistinct { + + private static final Logger LOG = LoggerFactory.getLogger(ApproximateCountDistinct.class); + + private static final List> HLL_IMPLEMENTED_TYPES = + ImmutableList.of( + TypeDescriptors.strings(), + TypeDescriptors.longs(), + TypeDescriptors.integers(), + new TypeDescriptor() {}); + + public static Globally globally() { + return new AutoValue_ApproximateCountDistinct_Globally.Builder() + .setPrecision(HllCount.DEFAULT_PRECISION) + .build(); + } + + public static PerKey perKey() { + return new AutoValue_ApproximateCountDistinct_PerKey.Builder() + .setPrecision(HllCount.DEFAULT_PRECISION) + .build(); + } + + ///////////////////////////////////////////////////////////////////////////// + + /** + * {@code PTransform} for estimating the number of distinct elements in a {@code PCollection}. + * + * @param the type of the elements in the input {@code PCollection} + */ + @AutoValue + public abstract static class Globally extends PTransform, PCollection> { + + public abstract int getPrecision(); + + public abstract Builder toBuilder(); + + @Nullable + public abstract Contextful> getMapping(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setPrecision(int precision); + + public abstract Builder setMapping(Contextful> value); + + public abstract Globally build(); + } + + public Globally via(ProcessFunction fn) { + + return toBuilder().setMapping(Contextful.fn(fn)).build(); + } + + public Globally withPercision(Integer withPercision) { + @SuppressWarnings("unchecked") + Globally globally = (Globally) toBuilder().setPrecision(withPercision).build(); + return globally; + } + + @Override + public PCollection expand(PCollection input) { + + TypeDescriptor type = input.getCoder().getEncodedTypeDescriptor(); + + if (HLL_IMPLEMENTED_TYPES.contains(type)) { + + HllCount.Init.Builder builder = builderForType(type); + + return input.apply(builder.globally()).apply(HllCount.Extract.globally()); + } + + // Boiler plate to avoid [argument.type.incompatible] NonNull vs Nullable + Contextful> mapping = getMapping(); + + if (mapping != null) { + return input + .apply(MapElements.into(TypeDescriptors.longs()).via(mapping)) + .apply(HllCount.Init.forLongs().globally()) + .apply(HllCount.Extract.globally()); + } + + throw new IllegalArgumentException( + String.format( + "%s supports Integer," + + " Long, String and byte[] objects directly. For other types you must provide a Mapping function.", + this.getClass().getCanonicalName())); + } + + @Override + public void populateDisplayData(DisplayData.Builder builder) { + super.populateDisplayData(builder); + ApproximateCountDistinct.populateDisplayData(builder, getPrecision()); + } + } + + @AutoValue + public abstract static class PerKey + extends PTransform>, PCollection>> { + + public abstract Integer getPrecision(); + + @Nullable + public abstract Contextful, KV>> getMapping(); + + public abstract Builder toBuilder(); + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder setPrecision(Integer precision); + + public abstract Builder setMapping(Contextful, KV>> value); + + public abstract PerKey build(); + } + + public PerKey withPercision(Integer withPercision) { + // Work around for loss of type inference when using API. + @SuppressWarnings("unchecked") + PerKey perKey = (PerKey) this.toBuilder().setPrecision(withPercision).build(); + return perKey; + } + + public PerKey via(ProcessFunction, KV> fn) { + + return this.toBuilder().setMapping(Contextful., KV>fn(fn)).build(); + } + + @Override + public PCollection> expand(PCollection> input) { + + Coder coder = ((KvCoder) input.getCoder()).getValueCoder(); + + TypeDescriptor type = coder.getEncodedTypeDescriptor(); + + if (HLL_IMPLEMENTED_TYPES.contains(type)) { + + HllCount.Init.Builder builder = builderForType(type); + + return input.apply(builder.perKey()).apply(HllCount.Extract.perKey()); + } + + // Boiler plate to avoid [argument.type.incompatible] NonNull vs Nullable + Contextful, KV>> mapping = getMapping(); + + if (mapping != null) { + Coder keyCoder = ((KvCoder) input.getCoder()).getKeyCoder(); + return input + .apply( + MapElements.into( + TypeDescriptors.kvs( + keyCoder.getEncodedTypeDescriptor(), TypeDescriptors.longs())) + .via(mapping)) + .apply(HllCount.Init.forLongs().perKey()) + .apply(HllCount.Extract.perKey()); + } + + throw new IllegalArgumentException( + String.format( + "%s supports Integer," + + " Long, String and byte[] objects directly not for %s type, you must provide a Mapping use via.", + this.getClass().getCanonicalName(), type.toString())); + } + + @Override + public void populateDisplayData(DisplayData.Builder builder) { + super.populateDisplayData(builder); + ApproximateCountDistinct.populateDisplayData(builder, getPrecision()); + } + } + + ///////////////////////////////////////////////////////////////////////////// + + private static void populateDisplayData(DisplayData.Builder builder, Integer precision) { + builder.add(DisplayData.item("precision", precision).withLabel("Precision")); + } + + // HLLCount supports, Long, Integers, String and Byte primitives. + // We will return an appropriate builder + protected static Builder builderForType(TypeDescriptor input) { + + @SuppressWarnings("rawtypes") + HllCount.Init.Builder builder = null; + + if (input.equals(TypeDescriptors.strings())) { + builder = HllCount.Init.forStrings(); + } + if (input.equals(TypeDescriptors.longs())) { + builder = HllCount.Init.forLongs(); + } + if (input.equals(TypeDescriptors.integers())) { + builder = HllCount.Init.forIntegers(); + } + if (input.equals(new TypeDescriptor() {})) { + builder = HllCount.Init.forBytes(); + } + + if (builder == null) { + throw new IllegalArgumentException(String.format("Type not supported %s", input)); + } + + // Safe to ignore warning, as we know the type based on the check we do above. + @SuppressWarnings("unchecked") + Builder output = (Builder) builder; + + return output; + } +} diff --git a/sdks/java/extensions/zetasketch/src/test/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinctTest.java b/sdks/java/extensions/zetasketch/src/test/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinctTest.java new file mode 100644 index 000000000000..8796d83810d0 --- /dev/null +++ b/sdks/java/extensions/zetasketch/src/test/java/org/apache/beam/sdk/extensions/zetasketch/ApproximateCountDistinctTest.java @@ -0,0 +1,342 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.zetasketch; + +import com.google.zetasketch.HyperLogLogPlusPlus; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.beam.sdk.testing.NeedsRunner; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +/** Tests for {@link ApproximateCountDistinct}. */ +public class ApproximateCountDistinctTest { + + @Rule public final transient TestPipeline p = TestPipeline.create(); + + // Integer + private static final List INTS1 = Arrays.asList(1, 2, 3, 3, 1, 4); + private static final Long INTS1_ESTIMATE; + + private static final int TEST_PRECISION = 20; + + static { + HyperLogLogPlusPlus hll = new HyperLogLogPlusPlus.Builder().buildForIntegers(); + INTS1.forEach(hll::add); + INTS1_ESTIMATE = hll.longResult(); + } + + /** Test correct Builder is returned from Generic type. * */ + @Test + public void testIntegerBuilder() { + + PCollection ints = p.apply(Create.of(1)); + HllCount.Init.Builder builder = + ApproximateCountDistinct.builderForType( + ints.getCoder().getEncodedTypeDescriptor()); + PCollection result = ints.apply(builder.globally()).apply(HllCount.Extract.globally()); + PAssert.that(result).containsInAnyOrder(1L); + p.run(); + } + /** Test correct Builder is returned from Generic type. * */ + @Test + public void testStringBuilder() { + + PCollection strings = p.apply(Create.of("43")); + HllCount.Init.Builder builder = + ApproximateCountDistinct.builderForType( + strings.getCoder().getEncodedTypeDescriptor()); + PCollection result = strings.apply(builder.globally()).apply(HllCount.Extract.globally()); + PAssert.that(result).containsInAnyOrder(1L); + p.run(); + } + /** Test correct Builder is returned from Generic type. * */ + @Test + public void testLongBuilder() { + + PCollection longs = p.apply(Create.of(1L)); + HllCount.Init.Builder builder = + ApproximateCountDistinct.builderForType(longs.getCoder().getEncodedTypeDescriptor()); + PCollection result = longs.apply(builder.globally()).apply(HllCount.Extract.globally()); + PAssert.that(result).containsInAnyOrder(1L); + p.run(); + } + /** Test correct Builder is returned from Generic type. * */ + @Test + public void testBytesBuilder() { + + byte[] byteArray = new byte[] {'A'}; + PCollection bytes = p.apply(Create.of(byteArray)); + TypeDescriptor a = bytes.getCoder().getEncodedTypeDescriptor(); + HllCount.Init.Builder builder = + ApproximateCountDistinct.builderForType( + bytes.getCoder().getEncodedTypeDescriptor()); + PCollection result = bytes.apply(builder.globally()).apply(HllCount.Extract.globally()); + PAssert.that(result).containsInAnyOrder(1L); + p.run(); + } + + /** Test Integer Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesGlobalForInteger() { + PCollection approxResultInteger = + p.apply("Int", Create.of(INTS1)).apply("IntHLL", ApproximateCountDistinct.globally()); + PAssert.thatSingleton(approxResultInteger).isEqualTo(INTS1_ESTIMATE); + p.run(); + } + + /** Test Long Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesGlobalForLong() { + + PCollection approxResultLong = + p.apply("Long", Create.of(INTS1.stream().map(Long::valueOf).collect(Collectors.toList()))) + .apply("LongHLL", ApproximateCountDistinct.globally()); + + PAssert.thatSingleton(approxResultLong).isEqualTo(INTS1_ESTIMATE); + + p.run(); + } + + /** Test String Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesGlobalForStrings() { + PCollection approxResultString = + p.apply("Str", Create.of(INTS1.stream().map(String::valueOf).collect(Collectors.toList()))) + .apply("StrHLL", ApproximateCountDistinct.globally()); + + PAssert.thatSingleton(approxResultString).isEqualTo(INTS1_ESTIMATE); + + p.run(); + } + + /** Test Byte Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesGlobalForBytes() { + PCollection approxResultByte = + p.apply( + "BytesHLL", + Create.of( + INTS1.stream() + .map(x -> ByteBuffer.allocate(4).putInt(x).array()) + .collect(Collectors.toList()))) + .apply(ApproximateCountDistinct.globally()); + + PAssert.thatSingleton(approxResultByte).isEqualTo(INTS1_ESTIMATE); + + p.run(); + } + + /** Test Integer Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesPerKeyForInteger() { + + List> ints = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + ints.add(KV.of(i, k)); + } + } + + PCollection> result = + p.apply("Int", Create.of(ints)).apply("IntHLL", ApproximateCountDistinct.perKey()); + + PAssert.that(result) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } + + /** Test Long Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesPerKeyForLong() { + + List> longs = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + longs.add(KV.of(i, (long) k)); + } + } + + PCollection> result = + p.apply("Long", Create.of(longs)).apply("LongHLL", ApproximateCountDistinct.perKey()); + + PAssert.that(result) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } + + /** Test String Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesPerKeyForStrings() { + List> strings = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + strings.add(KV.of(i, String.valueOf(k))); + } + } + + PCollection> result = + p.apply("Str", Create.of(strings)).apply("StrHLL", ApproximateCountDistinct.perKey()); + + PAssert.that(result) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } + + /** Test Byte Globally. */ + @Test + @Category(NeedsRunner.class) + public void testStandardTypesPerKeyForBytes() { + + List> bytes = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + bytes.add(KV.of(i, ByteBuffer.allocate(4).putInt(k).array())); + } + } + + PCollection> result = + p.apply("BytesHLL", Create.of(bytes)).apply(ApproximateCountDistinct.perKey()); + + PAssert.that(result) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } + + /** Test a general object, we will make use of a KV as the object as it already has a coder. */ + @Test + @Category(NeedsRunner.class) + public void testObjectTypesGlobal() { + + PCollection approxResultInteger = + p.apply( + "Int", + Create.of( + INTS1.stream().map(x -> KV.of(x, KV.of(x, x))).collect(Collectors.toList()))) + .apply( + "IntHLL", + ApproximateCountDistinct.>>globally() + .via((KV> x) -> (long) x.getValue().hashCode())); + + PAssert.thatSingleton(approxResultInteger).isEqualTo(INTS1_ESTIMATE); + + p.run(); + } + + /** Test a general object, we will make use of a KV as the object as it already has a coder. */ + @Test + @Category(NeedsRunner.class) + public void testObjectTypesPerKey() { + + List>> ints = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + ints.add(KV.of(i, KV.of(i, k))); + } + } + + PCollection> approxResultInteger = + p.apply("Int", Create.of(ints)) + .apply( + "IntHLL", + ApproximateCountDistinct.>perKey() + .via(x -> KV.of(x.getKey(), (long) x.hashCode())) + .withPercision(TEST_PRECISION)); + + PAssert.that(approxResultInteger) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } + + /** Test a general object, we will make use of a KV as the object as it already has a coder. */ + @Test + @Category(NeedsRunner.class) + public void testGlobalPercision() { + + PCollection approxResultInteger = + p.apply("Int", Create.of(INTS1)) + .apply("IntHLL", ApproximateCountDistinct.globally().withPercision(TEST_PRECISION)); + + PAssert.thatSingleton(approxResultInteger).isEqualTo(INTS1_ESTIMATE); + + p.run(); + } + + /** Test a general object, we will make use of a KV as the object as it already has a coder. */ + @Test + @Category(NeedsRunner.class) + public void testPerKeyPercision() { + + List> ints = new ArrayList<>(); + + for (int i = 0; i < 3; i++) { + for (int k : INTS1) { + ints.add(KV.of(i, k)); + } + } + + PCollection> approxResultInteger = + p.apply("Int", Create.of(ints)) + .apply("IntHLL", ApproximateCountDistinct.perKey().withPercision(TEST_PRECISION)); + + PAssert.that(approxResultInteger) + .containsInAnyOrder( + ImmutableList.of( + KV.of(0, INTS1_ESTIMATE), KV.of(1, INTS1_ESTIMATE), KV.of(2, INTS1_ESTIMATE))); + + p.run(); + } +} diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java b/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java index be45a3abe745..ed1f178d37b5 100644 --- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java +++ b/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java @@ -17,9 +17,7 @@ */ package org.apache.beam.sdk.fn.data; -import java.io.InputStream; import java.util.function.BiConsumer; -import org.apache.beam.sdk.coders.Coder; import org.apache.beam.vendor.grpc.v1p26p0.com.google.protobuf.ByteString; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,30 +26,24 @@ * Decodes individually consumed {@link ByteString}s with the provided {@link Coder} passing the * individual decoded elements to the provided consumer. */ -public class BeamFnDataInboundObserver +public class BeamFnDataInboundObserver implements BiConsumer, InboundDataClient { private static final Logger LOG = LoggerFactory.getLogger(BeamFnDataInboundObserver.class); - public static BeamFnDataInboundObserver forConsumer( - LogicalEndpoint endpoint, Coder coder, FnDataReceiver receiver) { - return new BeamFnDataInboundObserver<>( - endpoint, coder, receiver, CompletableFutureInboundDataClient.create()); + public static BeamFnDataInboundObserver forConsumer( + LogicalEndpoint endpoint, FnDataReceiver receiver) { + return new BeamFnDataInboundObserver( + endpoint, receiver, CompletableFutureInboundDataClient.create()); } private final LogicalEndpoint endpoint; - private final FnDataReceiver consumer; - private final Coder coder; + private final FnDataReceiver consumer; private final InboundDataClient readFuture; private long byteCounter; - private long counter; public BeamFnDataInboundObserver( - LogicalEndpoint endpoint, - Coder coder, - FnDataReceiver consumer, - InboundDataClient readFuture) { + LogicalEndpoint endpoint, FnDataReceiver consumer, InboundDataClient readFuture) { this.endpoint = endpoint; - this.coder = coder; this.consumer = consumer; this.readFuture = readFuture; } @@ -64,22 +56,13 @@ public void accept(ByteString payload, Boolean isLast) { } try { if (isLast) { - LOG.debug( - "Closing stream for {} having consumed {} values {} bytes", - endpoint, - counter, - byteCounter); + LOG.debug("Closing stream for {} having consumed {} bytes", endpoint, byteCounter); readFuture.complete(); return; } byteCounter += payload.size(); - InputStream inputStream = payload.newInput(); - while (inputStream.available() > 0) { - counter += 1; - T value = coder.decode(inputStream); - consumer.accept(value); - } + consumer.accept(payload); } catch (Exception e) { readFuture.fail(e); } diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/DecodingFnDataReceiver.java b/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/DecodingFnDataReceiver.java new file mode 100644 index 000000000000..6723d8dd6aa6 --- /dev/null +++ b/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/DecodingFnDataReceiver.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.fn.data; + +import java.io.InputStream; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.vendor.grpc.v1p26p0.com.google.protobuf.ByteString; + +/** A receiver of encoded data, decoding it and passing it onto a downstream consumer. */ +public class DecodingFnDataReceiver implements FnDataReceiver { + + private final Coder coder; + private final FnDataReceiver consumer; + + public DecodingFnDataReceiver(Coder coder, FnDataReceiver consumer) { + this.coder = coder; + this.consumer = consumer; + } + + public static DecodingFnDataReceiver create(Coder coder, FnDataReceiver consumer) { + return new DecodingFnDataReceiver(coder, consumer); + } + + @Override + public void accept(ByteString input) throws Exception { + InputStream inputStream = input.newInput(); + while (inputStream.available() > 0) { + consumer.accept(coder.decode(inputStream)); + } + } +} diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/IdGeneratorsTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/IdGeneratorsTest.java index 8dfbf17956be..c119a5f85ecd 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/IdGeneratorsTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/IdGeneratorsTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.fn; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java index 91c1e170de96..0922e2b3dcf5 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.fn.channel; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.File; import java.net.InetSocketAddress; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java index f538158a05c3..b899f9dc6039 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.fn.data; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataSizeBasedBufferingOutboundObserverTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataSizeBasedBufferingOutboundObserverTest.java index f4f4641555e4..f0c017741fbe 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataSizeBasedBufferingOutboundObserverTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataSizeBasedBufferingOutboundObserverTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.fn.data; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.io.IOException; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java index d9fa3fb27b80..b11dc5d78db5 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.fn.data; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isA; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.concurrent.CancellationException; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java index 5ee09a2816f6..a5f2342cf764 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.fn.data; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.apache.beam.model.fnexecution.v1.BeamFnApi.RemoteGrpcPort; import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java index 200b893a2c12..6ac755dba7f3 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.fn.data; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.apache.beam.model.fnexecution.v1.BeamFnApi.RemoteGrpcPort; import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/splittabledofn/RestrictionTrackersTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/splittabledofn/RestrictionTrackersTest.java index f1be94268626..eb0ef1e86106 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/splittabledofn/RestrictionTrackersTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/splittabledofn/RestrictionTrackersTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.fn.splittabledofn; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java index f00dc002237c..9221a51de308 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.fn.stream; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java index 83657d2474af..1ac85ec8937a 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.fn.stream; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeTrue; import java.io.ByteArrayInputStream; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/OutboundObserverFactoryTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/OutboundObserverFactoryTest.java index fe3a21d97562..977260535d50 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/OutboundObserverFactoryTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/OutboundObserverFactoryTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.fn.stream; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.concurrent.Executors; import org.apache.beam.vendor.grpc.v1p26p0.io.grpc.stub.CallStreamObserver; diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java index 5aef195929c1..b47e71f46973 100644 --- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java +++ b/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.fn.test; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/ToStringFnRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/ToStringFnRunner.java new file mode 100644 index 000000000000..6ea0e0ce4ac0 --- /dev/null +++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/ToStringFnRunner.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.fn.harness; + +import com.google.auto.service.AutoService; +import java.util.Map; +import java.util.Objects; +import org.apache.beam.model.pipeline.v1.RunnerApi.PTransform; +import org.apache.beam.runners.core.construction.PTransformTranslation; +import org.apache.beam.sdk.function.ThrowingFunction; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; + +/** + * Translates from elements to human-readable string. + * + *

Translation function: + * + *

    + *
  • Input: {@code KV} + *
  • Output: {@code KV} + *
+ * + *

For each element, the human-readable string is returned. The nonce is used by a runner to + * associate each input with its output. The nonce is represented as an opaque set of bytes. + */ +public class ToStringFnRunner { + static final String URN = PTransformTranslation.TO_STRING_TRANSFORM_URN; + + /** + * A registrar which provides a factory to handle translating elements to a human readable string. + */ + @AutoService(PTransformRunnerFactory.Registrar.class) + public static class Registrar implements PTransformRunnerFactory.Registrar { + + @Override + @SuppressWarnings({ + "rawtypes" // TODO(https://issues.apache.org/jira/browse/BEAM-10556) + }) + public Map getPTransformRunnerFactories() { + return ImmutableMap.of( + URN, + MapFnRunners.forValueMapFnFactory(ToStringFnRunner::createToStringFunctionForPTransform)); + } + } + + static ThrowingFunction, KV> createToStringFunctionForPTransform( + String ptransformId, PTransform pTransform) { + return (KV input) -> KV.of(input.getKey(), Objects.toString(input.getValue())); + } +} diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java index e93c67b9e128..4ecb5f5e25c1 100644 --- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java +++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java @@ -293,55 +293,60 @@ public BeamFnApi.InstructionResponse.Builder processBundle(BeamFnApi.Instruction ExecutionStateTracker stateTracker = bundleProcessor.getStateTracker(); QueueingBeamFnDataClient queueingClient = bundleProcessor.getQueueingClient(); - try (HandleStateCallsForBundle beamFnStateClient = bundleProcessor.getBeamFnStateClient()) { - try (Closeable closeTracker = stateTracker.activate()) { - // Already in reverse topological order so we don't need to do anything. - for (ThrowingRunnable startFunction : startFunctionRegistry.getFunctions()) { - LOG.debug("Starting function {}", startFunction); - startFunction.run(); - } + try { + try (HandleStateCallsForBundle beamFnStateClient = bundleProcessor.getBeamFnStateClient()) { + try (Closeable closeTracker = stateTracker.activate()) { + // Already in reverse topological order so we don't need to do anything. + for (ThrowingRunnable startFunction : startFunctionRegistry.getFunctions()) { + LOG.debug("Starting function {}", startFunction); + startFunction.run(); + } - queueingClient.drainAndBlock(); + queueingClient.drainAndBlock(); - // Need to reverse this since we want to call finish in topological order. - for (ThrowingRunnable finishFunction : - Lists.reverse(finishFunctionRegistry.getFunctions())) { - LOG.debug("Finishing function {}", finishFunction); - finishFunction.run(); + // Need to reverse this since we want to call finish in topological order. + for (ThrowingRunnable finishFunction : + Lists.reverse(finishFunctionRegistry.getFunctions())) { + LOG.debug("Finishing function {}", finishFunction); + finishFunction.run(); + } } - } - // Add all checkpointed residuals to the response. - response.addAllResidualRoots(bundleProcessor.getSplitListener().getResidualRoots()); - - // TODO(BEAM-6597): This should be reporting monitoring infos using the short id system. - // Get start bundle Execution Time Metrics. - response.addAllMonitoringInfos( - bundleProcessor.getStartFunctionRegistry().getExecutionTimeMonitoringInfos()); - // Get process bundle Execution Time Metrics. - response.addAllMonitoringInfos( - bundleProcessor.getpCollectionConsumerRegistry().getExecutionTimeMonitoringInfos()); - // Get finish bundle Execution Time Metrics. - response.addAllMonitoringInfos( - bundleProcessor.getFinishFunctionRegistry().getExecutionTimeMonitoringInfos()); - // Extract MonitoringInfos that come from the metrics container registry. - response.addAllMonitoringInfos( - bundleProcessor.getMetricsContainerRegistry().getMonitoringInfos()); - // Add any additional monitoring infos that the "runners" report explicitly. - for (ProgressRequestCallback progressRequestCallback : - bundleProcessor.getProgressRequestCallbacks()) { - response.addAllMonitoringInfos(progressRequestCallback.getMonitoringInfos()); - } + // Add all checkpointed residuals to the response. + response.addAllResidualRoots(bundleProcessor.getSplitListener().getResidualRoots()); + + // TODO(BEAM-6597): This should be reporting monitoring infos using the short id system. + // Get start bundle Execution Time Metrics. + response.addAllMonitoringInfos( + bundleProcessor.getStartFunctionRegistry().getExecutionTimeMonitoringInfos()); + // Get process bundle Execution Time Metrics. + response.addAllMonitoringInfos( + bundleProcessor.getpCollectionConsumerRegistry().getExecutionTimeMonitoringInfos()); + // Get finish bundle Execution Time Metrics. + response.addAllMonitoringInfos( + bundleProcessor.getFinishFunctionRegistry().getExecutionTimeMonitoringInfos()); + // Extract MonitoringInfos that come from the metrics container registry. + response.addAllMonitoringInfos( + bundleProcessor.getMetricsContainerRegistry().getMonitoringInfos()); + // Add any additional monitoring infos that the "runners" report explicitly. + for (ProgressRequestCallback progressRequestCallback : + bundleProcessor.getProgressRequestCallbacks()) { + response.addAllMonitoringInfos(progressRequestCallback.getMonitoringInfos()); + } - if (!bundleProcessor.getBundleFinalizationCallbackRegistrations().isEmpty()) { - finalizeBundleHandler.registerCallbacks( - bundleProcessor.getInstructionId(), - ImmutableList.copyOf(bundleProcessor.getBundleFinalizationCallbackRegistrations())); - response.setRequiresFinalization(true); + if (!bundleProcessor.getBundleFinalizationCallbackRegistrations().isEmpty()) { + finalizeBundleHandler.registerCallbacks( + bundleProcessor.getInstructionId(), + ImmutableList.copyOf(bundleProcessor.getBundleFinalizationCallbackRegistrations())); + response.setRequiresFinalization(true); + } } - bundleProcessorCache.release( request.getProcessBundle().getProcessBundleDescriptorId(), bundleProcessor); + } catch (Exception e) { + bundleProcessorCache.release( + request.getProcessBundle().getProcessBundleDescriptorId(), bundleProcessor); + throw e; } return BeamFnApi.InstructionResponse.newBuilder().setProcessBundle(response); } diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java index 26b37f43eec6..1d0ad35eed29 100644 --- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java +++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java @@ -21,9 +21,11 @@ import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor; import org.apache.beam.sdk.coders.Coder; import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver; +import org.apache.beam.sdk.fn.data.DecodingFnDataReceiver; import org.apache.beam.sdk.fn.data.FnDataReceiver; import org.apache.beam.sdk.fn.data.InboundDataClient; import org.apache.beam.sdk.fn.data.LogicalEndpoint; +import org.apache.beam.vendor.grpc.v1p26p0.com.google.protobuf.ByteString; /** * The {@link BeamFnDataClient} is able to forward inbound elements to a {@link FnDataReceiver} and @@ -41,11 +43,19 @@ public interface BeamFnDataClient { * *

The receiver is not required to be thread safe. */ - InboundDataClient receive( + default InboundDataClient receive( ApiServiceDescriptor apiServiceDescriptor, LogicalEndpoint inputLocation, Coder coder, - FnDataReceiver receiver); + FnDataReceiver receiver) { + return receive( + apiServiceDescriptor, inputLocation, new DecodingFnDataReceiver(coder, receiver)); + } + + InboundDataClient receive( + ApiServiceDescriptor apiServiceDescriptor, + LogicalEndpoint inputLocation, + FnDataReceiver receiver); /** * Creates a {@link CloseableFnDataReceiver} using the provided instruction id and target. diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java index 75665db40ab5..f9242613c689 100644 --- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java +++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java @@ -33,6 +33,7 @@ import org.apache.beam.sdk.fn.data.LogicalEndpoint; import org.apache.beam.sdk.fn.stream.OutboundObserverFactory; import org.apache.beam.sdk.options.PipelineOptions; +import org.apache.beam.vendor.grpc.v1p26p0.com.google.protobuf.ByteString; import org.apache.beam.vendor.grpc.v1p26p0.io.grpc.ManagedChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,16 +70,15 @@ public BeamFnDataGrpcClient( * (signaled by an empty data block), the returned future is completed successfully. */ @Override - public InboundDataClient receive( + public InboundDataClient receive( ApiServiceDescriptor apiServiceDescriptor, LogicalEndpoint inputLocation, - Coder coder, - FnDataReceiver consumer) { + FnDataReceiver consumer) { LOG.debug("Registering consumer for {}", inputLocation); BeamFnDataGrpcMultiplexer client = getClientFor(apiServiceDescriptor); - BeamFnDataInboundObserver inboundObserver = - BeamFnDataInboundObserver.forConsumer(inputLocation, coder, consumer); + BeamFnDataInboundObserver inboundObserver = + BeamFnDataInboundObserver.forConsumer(inputLocation, consumer); client.registerConsumer(inputLocation, inboundObserver); return inboundObserver; } diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClient.java index 50ac9486e74a..634ea2a6033b 100644 --- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClient.java +++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClient.java @@ -28,6 +28,7 @@ import org.apache.beam.sdk.fn.data.FnDataReceiver; import org.apache.beam.sdk.fn.data.InboundDataClient; import org.apache.beam.sdk.fn.data.LogicalEndpoint; +import org.apache.beam.vendor.grpc.v1p26p0.com.google.protobuf.ByteString; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,19 +57,19 @@ public QueueingBeamFnDataClient(BeamFnDataClient mainClient) { } @Override - public InboundDataClient receive( + public InboundDataClient receive( ApiServiceDescriptor apiServiceDescriptor, LogicalEndpoint inputLocation, - Coder coder, - FnDataReceiver consumer) { + FnDataReceiver consumer) { LOG.debug( "Registering consumer for instruction {} and transform {}", inputLocation.getInstructionId(), inputLocation.getTransformId()); - QueueingFnDataReceiver queueingConsumer = new QueueingFnDataReceiver(consumer); + QueueingFnDataReceiver queueingConsumer = + new QueueingFnDataReceiver(consumer); InboundDataClient inboundDataClient = - this.mainClient.receive(apiServiceDescriptor, inputLocation, coder, queueingConsumer); + this.mainClient.receive(apiServiceDescriptor, inputLocation, queueingConsumer); queueingConsumer.inboundDataClient = inboundDataClient; this.inboundDataClients.computeIfAbsent( inboundDataClient, (InboundDataClient idcToStore) -> idcToStore); diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/AssignWindowsRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/AssignWindowsRunnerTest.java index ae6c4321a07d..c72e5add7ff0 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/AssignWindowsRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/AssignWindowsRunnerTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.fn.harness; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.io.Serializable; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java index e032e8f02c23..81beeeba2045 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyDouble; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java index 2c842470832c..e3f7923747d1 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/CombineRunnersTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/CombineRunnersTest.java index 60cae35eaf1a..bf42b2989c26 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/CombineRunnersTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/CombineRunnersTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.util.ArrayDeque; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java index 285c5f532228..0bc5759e9f25 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java @@ -18,10 +18,10 @@ package org.apache.beam.fn.harness; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.util.ArrayList; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java index 055f830454ae..6db8c0971981 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java @@ -21,6 +21,7 @@ import static org.apache.beam.sdk.util.WindowedValue.timestampedValueInGlobalWindow; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; @@ -29,7 +30,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnersTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnersTest.java index 339657c13d1b..200d640fe5d7 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnersTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnersTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import java.util.ArrayList; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/PrecombineGroupingTableTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/PrecombineGroupingTableTest.java index 4454eb37de76..a5504f934c8c 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/PrecombineGroupingTableTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/PrecombineGroupingTableTest.java @@ -17,13 +17,13 @@ */ package org.apache.beam.fn.harness; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.in; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.Arrays; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/ToStringFnRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/ToStringFnRunnerTest.java new file mode 100644 index 000000000000..cc5e6465c865 --- /dev/null +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/ToStringFnRunnerTest.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.fn.harness; + +import static org.junit.Assert.assertEquals; + +import org.apache.beam.model.pipeline.v1.RunnerApi; +import org.apache.beam.runners.core.construction.Environments; +import org.apache.beam.runners.core.construction.SdkComponents; +import org.apache.beam.sdk.function.ThrowingFunction; +import org.apache.beam.sdk.values.KV; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link WindowMappingFnRunner}. */ +@RunWith(JUnit4.class) +public class ToStringFnRunnerTest { + @Test + public void testPrimitiveToString() throws Exception { + String pTransformId = "pTransformId"; + + SdkComponents components = SdkComponents.create(); + components.registerEnvironment(Environments.createDockerEnvironment("java")); + RunnerApi.PTransform pTransform = RunnerApi.PTransform.newBuilder().build(); + + ThrowingFunction, KV> toStringFunction = + ToStringFnRunner.createToStringFunctionForPTransform(pTransformId, pTransform); + + KV input = KV.of("key", 12345); + + assertEquals(KV.of("key", "12345"), toStringFunction.apply(input)); + } + + @Test + public void testToStringOverride() throws Exception { + class ClassWithToStringOverride { + @Override + public String toString() { + return "Some string"; + } + } + + String pTransformId = "pTransformId"; + + SdkComponents components = SdkComponents.create(); + components.registerEnvironment(Environments.createDockerEnvironment("java")); + RunnerApi.PTransform pTransform = RunnerApi.PTransform.newBuilder().build(); + + ThrowingFunction, KV> toStringFunction = + ToStringFnRunner.createToStringFunctionForPTransform(pTransformId, pTransform); + + KV input = KV.of("key", new ClassWithToStringOverride()); + + assertEquals(KV.of("key", "Some string"), toStringFunction.apply(input)); + } +} diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/WindowMergingFnRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/WindowMergingFnRunnerTest.java index b936cfb7934f..9816ed6ff669 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/WindowMergingFnRunnerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/WindowMergingFnRunnerTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.fn.harness; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.util.Collections; import org.apache.beam.model.pipeline.v1.RunnerApi; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java index be7d2e3e4aa3..2779215999f1 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness.control; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables.getStackTraceAsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.EnumMap; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BundleSplitListenerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BundleSplitListenerTest.java index 5a48efeccf33..fc392eca5665 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BundleSplitListenerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BundleSplitListenerTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.fn.harness.control; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; -import static org.junit.Assert.assertThat; import java.util.Collections; import org.apache.beam.model.fnexecution.v1.BeamFnApi.BundleApplication; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java index a8c939c86a6c..18a756adbad0 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java @@ -19,13 +19,13 @@ import static org.apache.beam.fn.harness.control.ProcessBundleHandler.REGISTERED_RUNNER_FACTORIES; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.argThat; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java index 290b8e83cf18..6103858b90a9 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java @@ -19,10 +19,10 @@ import static org.apache.beam.sdk.util.CoderUtils.encodeToByteArray; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.Collection; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java index 09a134986954..8218bea4c9c5 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness.data; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.ArrayList; @@ -32,6 +32,7 @@ import org.apache.beam.sdk.coders.StringUtf8Coder; import org.apache.beam.sdk.fn.data.BeamFnDataInboundObserver; import org.apache.beam.sdk.fn.data.CompletableFutureInboundDataClient; +import org.apache.beam.sdk.fn.data.DecodingFnDataReceiver; import org.apache.beam.sdk.fn.data.InboundDataClient; import org.apache.beam.sdk.fn.data.LogicalEndpoint; import org.apache.beam.sdk.transforms.windowing.GlobalWindow; @@ -56,8 +57,9 @@ public class BeamFnDataInboundObserverTest { public void testDecodingElements() throws Exception { Collection> values = new ArrayList<>(); InboundDataClient readFuture = CompletableFutureInboundDataClient.create(); - BeamFnDataInboundObserver> observer = - new BeamFnDataInboundObserver<>(DATA_ENDPOINT, CODER, values::add, readFuture); + BeamFnDataInboundObserver observer = + new BeamFnDataInboundObserver( + DATA_ENDPOINT, DecodingFnDataReceiver.create(CODER, values::add), readFuture); // Test decoding multiple messages observer.accept(dataWith("ABC", "DEF", "GHI"), false); @@ -80,8 +82,9 @@ public void testDecodingElements() throws Exception { @Test public void testConsumptionFailureCompletesReadFutureAndDiscardsMessages() throws Exception { InboundDataClient readClient = CompletableFutureInboundDataClient.create(); - BeamFnDataInboundObserver> observer = - new BeamFnDataInboundObserver<>(DATA_ENDPOINT, CODER, this::throwOnDefValue, readClient); + BeamFnDataInboundObserver observer = + new BeamFnDataInboundObserver( + DATA_ENDPOINT, DecodingFnDataReceiver.create(CODER, this::throwOnDefValue), readClient); assertFalse(readClient.isDone()); observer.accept(dataWith("ABC", "DEF", "GHI"), false); diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/PCollectionConsumerRegistryTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/PCollectionConsumerRegistryTest.java index 7a88942a753a..cedb3fa78b97 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/PCollectionConsumerRegistryTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/PCollectionConsumerRegistryTest.java @@ -18,9 +18,9 @@ package org.apache.beam.fn.harness.data; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doThrow; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClientTest.java index c5f60b60e8b6..535b4258e264 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClientTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/QueueingBeamFnDataClientTest.java @@ -19,8 +19,8 @@ import static org.apache.beam.sdk.util.CoderUtils.encodeToByteArray; import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java index 93c1b3d0ef1d..6e6f38dec27a 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java @@ -18,11 +18,11 @@ package org.apache.beam.fn.harness.logging; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Throwables.getStackTraceAsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Collection; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java index f274358b0ff3..102693d381e7 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.fn.harness.state; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import java.util.UUID; diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java index e5e7ec60345f..2358eedc5b41 100644 --- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java +++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.fn.harness.stream; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.fn.stream.BufferingStreamObserver; import org.apache.beam.sdk.fn.stream.DirectStreamObserver; diff --git a/sdks/java/io/amazon-web-services/src/main/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIO.java b/sdks/java/io/amazon-web-services/src/main/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIO.java index 319f2bea5b4e..dcbf0a170c2e 100644 --- a/sdks/java/io/amazon-web-services/src/main/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIO.java +++ b/sdks/java/io/amazon-web-services/src/main/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIO.java @@ -32,6 +32,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -97,6 +98,11 @@ * writeRequest> * * + * If primary keys could repeat in your stream (i.e. an upsert stream), you could encounter a + * ValidationError, as AWS does not allow writing duplicate keys within a single batch operation. + * For such use cases, you can explicitly set the key names corresponding to the primary key to be + * deduplicated using the withDeduplicateKeys method + * *

Reading from DynamoDB

* *

Example usage: @@ -131,7 +137,7 @@ public static Read read() { } public static Write write() { - return new AutoValue_DynamoDBIO_Write.Builder().build(); + return new AutoValue_DynamoDBIO_Write.Builder().setDeduplicateKeys(new ArrayList<>()).build(); } /** Read data from DynamoDB and return ScanResult. */ @@ -346,6 +352,8 @@ public abstract static class Write extends PTransform, PCollec abstract @Nullable SerializableFunction> getWriteItemMapperFn(); + abstract List getDeduplicateKeys(); + abstract Builder builder(); @AutoValue.Builder @@ -358,6 +366,8 @@ abstract static class Builder { abstract Builder setWriteItemMapperFn( SerializableFunction> writeItemMapperFn); + abstract Builder setDeduplicateKeys(List deduplicateKeys); + abstract Write build(); } @@ -406,6 +416,10 @@ public Write withWriteRequestMapperFn( return builder().setWriteItemMapperFn(writeItemMapperFn).build(); } + public Write withDeduplicateKeys(List deduplicateKeys) { + return builder().setDeduplicateKeys(deduplicateKeys).build(); + } + @Override public PCollection expand(PCollection input) { return input.apply(ParDo.of(new WriteFn<>(this))); @@ -424,7 +438,7 @@ static class WriteFn extends DoFn { private static final int BATCH_SIZE = 25; private transient AmazonDynamoDB client; private final DynamoDBIO.Write spec; - private List> batch; + private Map>, KV> batch; WriteFn(DynamoDBIO.Write spec) { this.spec = spec; @@ -447,19 +461,35 @@ public void setup() { @StartBundle public void startBundle(StartBundleContext context) { - batch = new ArrayList<>(); + batch = new HashMap<>(); } @ProcessElement public void processElement(ProcessContext context) throws Exception { final KV writeRequest = (KV) spec.getWriteItemMapperFn().apply(context.element()); - batch.add(writeRequest); + batch.put( + KV.of(writeRequest.getKey(), extractDeduplicateKeyValues(writeRequest.getValue())), + writeRequest); if (batch.size() >= BATCH_SIZE) { flushBatch(); } } + private Map extractDeduplicateKeyValues(WriteRequest request) { + if (request.getPutRequest() != null) { + return request.getPutRequest().getItem().entrySet().stream() + .filter(entry -> spec.getDeduplicateKeys().contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } else if (request.getDeleteRequest() != null) { + return request.getDeleteRequest().getKey().entrySet().stream() + .filter(entry -> spec.getDeduplicateKeys().contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } else { + return Collections.emptyMap(); + } + } + @FinishBundle public void finishBundle(FinishBundleContext context) throws Exception { flushBatch(); @@ -474,7 +504,7 @@ private void flushBatch() throws IOException, InterruptedException { // Since each element is a KV in the batch, we need to group them // by tableName Map> mapTableRequest = - batch.stream() + batch.values().stream() .collect( Collectors.groupingBy( KV::getKey, Collectors.mapping(KV::getValue, Collectors.toList()))); diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/coders/AwsCodersTest.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/coders/AwsCodersTest.java index 92b86ddf4eba..e2d75c3eb557 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/coders/AwsCodersTest.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/coders/AwsCodersTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.aws.coders; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import com.amazonaws.ResponseMetadata; import com.amazonaws.http.HttpResponse; diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTest.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTest.java index 9e737283bb2d..9578d57a65e9 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTest.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTest.java @@ -27,28 +27,32 @@ import com.amazonaws.services.dynamodbv2.model.ScanRequest; import com.amazonaws.services.dynamodbv2.model.WriteRequest; import java.io.Serializable; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.testing.ExpectedLogs; import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.testing.TestPipeline; import org.apache.beam.sdk.transforms.Count; import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.ParDo; import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; import org.joda.time.Duration; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; import org.mockito.Mockito; /** Test Coverage for the IO. */ -@Ignore("[BEAM-7794] DynamoDBIOTest is blocking forever") @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) @@ -215,4 +219,64 @@ public void testRetries() throws Throwable { } fail("Pipeline is expected to fail because we were unable to write to DynamoDB."); } + + /** + * A DoFn used to generate outputs duplicated N times, where N is the input. Used to generate + * bundles with duplicate elements. + */ + private static class WriteDuplicateGeneratorDoFn extends DoFn { + @ProcessElement + public void processElement(ProcessContext ctx) { + for (int i = 0; i < ctx.element(); i++) { + DynamoDBIOTestHelper.generateWriteRequests(numOfItems).forEach(ctx::output); + } + } + } + + @Test + public void testWriteDeduplication() { + // designate duplication factor for each bundle + final List duplications = Arrays.asList(1, 2, 3); + + final List deduplicateKeys = + Arrays.asList(DynamoDBIOTestHelper.ATTR_NAME_1, DynamoDBIOTestHelper.ATTR_NAME_2); + + AmazonDynamoDB amazonDynamoDBMock = Mockito.mock(AmazonDynamoDB.class); + + pipeline + .apply(Create.of(duplications)) + .apply("duplicate", ParDo.of(new WriteDuplicateGeneratorDoFn())) + .apply( + DynamoDBIO.write() + .withWriteRequestMapperFn( + (SerializableFunction>) + writeRequest -> KV.of(tableName, writeRequest)) + .withRetryConfiguration( + DynamoDBIO.RetryConfiguration.create(5, Duration.standardMinutes(1))) + .withAwsClientsProvider(AwsClientsProviderMock.of(amazonDynamoDBMock)) + .withDeduplicateKeys(deduplicateKeys)); + + pipeline.run().waitUntilFinish(); + + ArgumentCaptor argumentCaptor = + ArgumentCaptor.forClass(BatchWriteItemRequest.class); + Mockito.verify(amazonDynamoDBMock, Mockito.times(3)).batchWriteItem(argumentCaptor.capture()); + List batchRequests = argumentCaptor.getAllValues(); + batchRequests.forEach( + batchRequest -> { + List requests = batchRequest.getRequestItems().get(tableName); + // assert that each bundle contains expected number of items + assertEquals(numOfItems, requests.size()); + List> requestKeys = + requests.stream() + .map( + request -> + request.getPutRequest() != null + ? request.getPutRequest().getItem() + : request.getDeleteRequest().getKey()) + .collect(Collectors.toList()); + // assert no duplicate keys in each bundle + assertEquals(new HashSet<>(requestKeys).size(), requestKeys.size()); + }); + } } diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTestHelper.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTestHelper.java index 0eaabee7382d..bbea6a6b2247 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTestHelper.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/dynamodb/DynamoDBIOTestHelper.java @@ -49,7 +49,7 @@ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) class DynamoDBIOTestHelper implements Serializable { - private static final String LOCALSTACK_VERSION = "0.11.3"; + private static final String LOCALSTACK_VERSION = "0.11.4"; @Rule private static final LocalStackContainer localStackContainer = diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/options/AwsModuleTest.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/options/AwsModuleTest.java index d49d60ed6678..4b06511d5da8 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/options/AwsModuleTest.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/options/AwsModuleTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.aws.options; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentialsProvider; diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/s3/S3FileSystemTest.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/s3/S3FileSystemTest.java index 6b8e5086f13f..ca52e33e7006 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/s3/S3FileSystemTest.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/s3/S3FileSystemTest.java @@ -24,10 +24,10 @@ import static org.apache.beam.sdk.io.aws.s3.S3TestUtils.s3OptionsWithSSECustomerKey; import static org.apache.beam.sdk.io.fs.CreateOptions.StandardCreateOptions.builder; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Matchers.anyObject; diff --git a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/sns/PublishResultCodersTest.java b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/sns/PublishResultCodersTest.java index 013535d6ca72..b7db1deb596f 100644 --- a/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/sns/PublishResultCodersTest.java +++ b/sdks/java/io/amazon-web-services/src/test/java/org/apache/beam/sdk/io/aws/sns/PublishResultCodersTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.aws.sns; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import com.amazonaws.ResponseMetadata; import com.amazonaws.http.HttpResponse; diff --git a/sdks/java/io/amazon-web-services2/build.gradle b/sdks/java/io/amazon-web-services2/build.gradle index fb705c082f65..854263ec973d 100644 --- a/sdks/java/io/amazon-web-services2/build.gradle +++ b/sdks/java/io/amazon-web-services2/build.gradle @@ -66,7 +66,7 @@ dependencies { test { systemProperty "beamTestPipelineOptions", JsonOutput.toJson([ - '--region=us-west-2', + '--awsRegion=us-west-2', '--awsCredentialsProvider={"@type": "StaticCredentialsProvider", "accessKeyId": "key_id_value", "secretAccessKey": "secret_value"}' ]) // Forking every test resolves an issue where KinesisMockReadTest gets stuck forever. diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProvider.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProvider.java index 80b19e6830d4..80b9243d2e4b 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProvider.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProvider.java @@ -18,8 +18,11 @@ package org.apache.beam.sdk.io.aws2.dynamodb; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Objects; +import org.apache.beam.sdk.io.aws2.options.AwsSerializableUtils; import org.checkerframework.checker.nullness.qual.Nullable; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -28,7 +31,7 @@ /** Basic implementation of {@link DynamoDbClientProvider} used by default in {@link DynamoDBIO}. */ public class BasicDynamoDbClientProvider implements DynamoDbClientProvider { - private final AwsCredentialsProvider awsCredentialsProvider; + private final String awsCredentialsProviderSerialized; private final String region; private final @Nullable URI serviceEndpoint; @@ -36,7 +39,9 @@ public class BasicDynamoDbClientProvider implements DynamoDbClientProvider { AwsCredentialsProvider awsCredentialsProvider, String region, @Nullable URI serviceEndpoint) { checkArgument(awsCredentialsProvider != null, "awsCredentialsProvider can not be null"); checkArgument(region != null, "region can not be null"); - this.awsCredentialsProvider = awsCredentialsProvider; + this.awsCredentialsProviderSerialized = + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + checkNotNull(awsCredentialsProviderSerialized, "awsCredentialsProviderString can not be null"); this.region = region; this.serviceEndpoint = serviceEndpoint; } @@ -45,7 +50,9 @@ public class BasicDynamoDbClientProvider implements DynamoDbClientProvider { public DynamoDbClient getDynamoDbClient() { DynamoDbClientBuilder builder = DynamoDbClient.builder() - .credentialsProvider(awsCredentialsProvider) + .credentialsProvider( + AwsSerializableUtils.deserializeAwsCredentialsProvider( + awsCredentialsProviderSerialized)) .region(Region.of(region)); if (serviceEndpoint != null) { @@ -54,4 +61,23 @@ public DynamoDbClient getDynamoDbClient() { return builder.build(); } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BasicDynamoDbClientProvider that = (BasicDynamoDbClientProvider) o; + return Objects.equals(awsCredentialsProviderSerialized, that.awsCredentialsProviderSerialized) + && Objects.equals(region, that.region) + && Objects.equals(serviceEndpoint, that.serviceEndpoint); + } + + @Override + public int hashCode() { + return Objects.hash(awsCredentialsProviderSerialized, region, serviceEndpoint); + } } diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIO.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIO.java index 16f5dae47d87..e247b6a721bb 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIO.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIO.java @@ -25,6 +25,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -126,6 +127,11 @@ *

  • Mapper function with a table name to map or transform your object into KV * + * + * If primary keys could repeat in your stream (i.e. an upsert stream), you could encounter a + * ValidationError, as AWS does not allow writing duplicate keys within a single batch operation. + * For such use cases, you can explicitly set the key names corresponding to the primary key to be + * deduplicated using the withDeduplicateKeys method */ @Experimental(Kind.SOURCE_SINK) @SuppressWarnings({ @@ -138,7 +144,7 @@ public static Read read() { } public static Write write() { - return new AutoValue_DynamoDBIO_Write.Builder().build(); + return new AutoValue_DynamoDBIO_Write.Builder().setDeduplicateKeys(new ArrayList<>()).build(); } /** Read data from DynamoDB and return ScanResult. */ @@ -360,6 +366,8 @@ public abstract static class Write extends PTransform, PCollec abstract @Nullable SerializableFunction> getWriteItemMapperFn(); + abstract List getDeduplicateKeys(); + abstract Builder toBuilder(); @AutoValue.Builder @@ -372,6 +380,8 @@ abstract static class Builder { abstract Builder setWriteItemMapperFn( SerializableFunction> writeItemMapperFn); + abstract Builder setDeduplicateKeys(List deduplicateKeys); + abstract Write build(); } @@ -424,6 +434,10 @@ public Write withWriteRequestMapperFn( return toBuilder().setWriteItemMapperFn(writeItemMapperFn).build(); } + public Write withDeduplicateKeys(List deduplicateKeys) { + return toBuilder().setDeduplicateKeys(deduplicateKeys).build(); + } + @Override public PCollection expand(PCollection input) { return input.apply(ParDo.of(new WriteFn<>(this))); @@ -442,7 +456,7 @@ static class WriteFn extends DoFn { private static final int BATCH_SIZE = 25; private transient DynamoDbClient client; private final Write spec; - private List> batch; + private Map>, KV> batch; WriteFn(Write spec) { this.spec = spec; @@ -465,19 +479,35 @@ public void setup() { @StartBundle public void startBundle(StartBundleContext context) { - batch = new ArrayList<>(); + batch = new HashMap<>(); } @ProcessElement public void processElement(ProcessContext context) throws Exception { final KV writeRequest = (KV) spec.getWriteItemMapperFn().apply(context.element()); - batch.add(writeRequest); + batch.put( + KV.of(writeRequest.getKey(), extractDeduplicateKeyValues(writeRequest.getValue())), + writeRequest); if (batch.size() >= BATCH_SIZE) { flushBatch(); } } + private Map extractDeduplicateKeyValues(WriteRequest request) { + if (request.putRequest() != null) { + return request.putRequest().item().entrySet().stream() + .filter(entry -> spec.getDeduplicateKeys().contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } else if (request.deleteRequest() != null) { + return request.deleteRequest().key().entrySet().stream() + .filter(entry -> spec.getDeduplicateKeys().contains(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } else { + return Collections.emptyMap(); + } + } + @FinishBundle public void finishBundle(FinishBundleContext context) throws Exception { flushBatch(); @@ -492,7 +522,7 @@ private void flushBatch() throws IOException, InterruptedException { // Since each element is a KV in the batch, we need to group them // by tableName Map> mapTableRequest = - batch.stream() + batch.values().stream() .collect( Collectors.groupingBy( KV::getKey, Collectors.mapping(KV::getValue, Collectors.toList()))); diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsOptions.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsOptions.java index 92f052a178f3..6eaf9a8cd334 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsOptions.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsOptions.java @@ -38,9 +38,9 @@ public interface AwsOptions extends PipelineOptions { /** AWS region used by the AWS client. */ @Description("AWS region used by the AWS client") @Validation.Required - String getRegion(); + String getAwsRegion(); - void setRegion(String value); + void setAwsRegion(String value); /** The AWS service endpoint used by the AWS client. */ @Description("AWS service endpoint used by the AWS client") diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtils.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtils.java new file mode 100644 index 000000000000..7f24fb7a6049 --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtils.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.options; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; + +/** Utilities for working with AWS Serializables. */ +public class AwsSerializableUtils { + + public static String serializeAwsCredentialsProvider( + AwsCredentialsProvider awsCredentialsProvider) { + ObjectMapper om = new ObjectMapper(); + om.registerModule(new AwsModule()); + try { + return om.writeValueAsString(awsCredentialsProvider); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException("AwsCredentialsProvider can not be serialized to Json", e); + } + } + + public static AwsCredentialsProvider deserializeAwsCredentialsProvider( + String awsCredentialsProviderSerialized) { + ObjectMapper om = new ObjectMapper(); + om.registerModule(new AwsModule()); + try { + return om.readValue(awsCredentialsProviderSerialized, AwsCredentialsProvider.class); + } catch (IOException e) { + throw new IllegalArgumentException( + "AwsCredentialsProvider can not be deserialized from Json", e); + } + } +} diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProvider.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProvider.java index b436d0f8b04f..691124c83c68 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProvider.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProvider.java @@ -18,8 +18,11 @@ package org.apache.beam.sdk.io.aws2.sns; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Objects; +import org.apache.beam.sdk.io.aws2.options.AwsSerializableUtils; import org.checkerframework.checker.nullness.qual.Nullable; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -28,7 +31,7 @@ /** Basic implementation of {@link SnsAsyncClientProvider} used by default in {@link SnsIO}. */ class BasicSnsAsyncClientProvider implements SnsAsyncClientProvider { - private final AwsCredentialsProvider awsCredentialsProvider; + private final String awsCredentialsProviderSerialized; private final String region; private final @Nullable URI serviceEndpoint; @@ -36,7 +39,9 @@ class BasicSnsAsyncClientProvider implements SnsAsyncClientProvider { AwsCredentialsProvider awsCredentialsProvider, String region, @Nullable URI serviceEndpoint) { checkArgument(awsCredentialsProvider != null, "awsCredentialsProvider can not be null"); checkArgument(region != null, "region can not be null"); - this.awsCredentialsProvider = awsCredentialsProvider; + this.awsCredentialsProviderSerialized = + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + checkNotNull(awsCredentialsProviderSerialized, "awsCredentialsProviderString can not be null"); this.region = region; this.serviceEndpoint = serviceEndpoint; } @@ -45,7 +50,9 @@ class BasicSnsAsyncClientProvider implements SnsAsyncClientProvider { public SnsAsyncClient getSnsAsyncClient() { SnsAsyncClientBuilder builder = SnsAsyncClient.builder() - .credentialsProvider(awsCredentialsProvider) + .credentialsProvider( + AwsSerializableUtils.deserializeAwsCredentialsProvider( + awsCredentialsProviderSerialized)) .region(Region.of(region)); if (serviceEndpoint != null) { @@ -54,4 +61,23 @@ public SnsAsyncClient getSnsAsyncClient() { return builder.build(); } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BasicSnsAsyncClientProvider that = (BasicSnsAsyncClientProvider) o; + return Objects.equals(awsCredentialsProviderSerialized, that.awsCredentialsProviderSerialized) + && Objects.equals(region, that.region) + && Objects.equals(serviceEndpoint, that.serviceEndpoint); + } + + @Override + public int hashCode() { + return Objects.hash(awsCredentialsProviderSerialized, region, serviceEndpoint); + } } diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProvider.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProvider.java index 24144eccdf31..68306cc17f7d 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProvider.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProvider.java @@ -18,8 +18,11 @@ package org.apache.beam.sdk.io.aws2.sns; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Objects; +import org.apache.beam.sdk.io.aws2.options.AwsSerializableUtils; import org.checkerframework.checker.nullness.qual.Nullable; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -28,7 +31,7 @@ /** Basic implementation of {@link SnsClientProvider} used by default in {@link SnsIO}. */ class BasicSnsClientProvider implements SnsClientProvider { - private final AwsCredentialsProvider awsCredentialsProvider; + private final String awsCredentialsProviderSerialized; private final String region; private final @Nullable URI serviceEndpoint; @@ -36,7 +39,9 @@ class BasicSnsClientProvider implements SnsClientProvider { AwsCredentialsProvider awsCredentialsProvider, String region, @Nullable URI serviceEndpoint) { checkArgument(awsCredentialsProvider != null, "awsCredentialsProvider can not be null"); checkArgument(region != null, "region can not be null"); - this.awsCredentialsProvider = awsCredentialsProvider; + this.awsCredentialsProviderSerialized = + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + checkNotNull(awsCredentialsProviderSerialized, "awsCredentialsProviderString can not be null"); this.region = region; this.serviceEndpoint = serviceEndpoint; } @@ -44,7 +49,11 @@ class BasicSnsClientProvider implements SnsClientProvider { @Override public SnsClient getSnsClient() { SnsClientBuilder builder = - SnsClient.builder().credentialsProvider(awsCredentialsProvider).region(Region.of(region)); + SnsClient.builder() + .credentialsProvider( + AwsSerializableUtils.deserializeAwsCredentialsProvider( + awsCredentialsProviderSerialized)) + .region(Region.of(region)); if (serviceEndpoint != null) { builder.endpointOverride(serviceEndpoint); @@ -52,4 +61,23 @@ public SnsClient getSnsClient() { return builder.build(); } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BasicSnsClientProvider that = (BasicSnsClientProvider) o; + return Objects.equals(awsCredentialsProviderSerialized, that.awsCredentialsProviderSerialized) + && Objects.equals(region, that.region) + && Objects.equals(serviceEndpoint, that.serviceEndpoint); + } + + @Override + public int hashCode() { + return Objects.hash(awsCredentialsProviderSerialized, region, serviceEndpoint); + } } diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProvider.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProvider.java index a4c508c13dd4..f5861664b59e 100644 --- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProvider.java +++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProvider.java @@ -18,8 +18,11 @@ package org.apache.beam.sdk.io.aws2.sqs; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Objects; +import org.apache.beam.sdk.io.aws2.options.AwsSerializableUtils; import org.checkerframework.checker.nullness.qual.Nullable; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -28,7 +31,7 @@ /** Basic implementation of {@link SqsClientProvider} used by default in {@link SqsIO}. */ class BasicSqsClientProvider implements SqsClientProvider { - private final AwsCredentialsProvider awsCredentialsProvider; + private final String awsCredentialsProviderSerialized; private final String region; private final @Nullable URI serviceEndpoint; @@ -36,7 +39,9 @@ class BasicSqsClientProvider implements SqsClientProvider { AwsCredentialsProvider awsCredentialsProvider, String region, @Nullable URI serviceEndpoint) { checkArgument(awsCredentialsProvider != null, "awsCredentialsProvider can not be null"); checkArgument(region != null, "region can not be null"); - this.awsCredentialsProvider = awsCredentialsProvider; + this.awsCredentialsProviderSerialized = + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + checkNotNull(awsCredentialsProviderSerialized, "awsCredentialsProviderString can not be null"); this.region = region; this.serviceEndpoint = serviceEndpoint; } @@ -44,7 +49,11 @@ class BasicSqsClientProvider implements SqsClientProvider { @Override public SqsClient getSqsClient() { SqsClientBuilder builder = - SqsClient.builder().credentialsProvider(awsCredentialsProvider).region(Region.of(region)); + SqsClient.builder() + .credentialsProvider( + AwsSerializableUtils.deserializeAwsCredentialsProvider( + awsCredentialsProviderSerialized)) + .region(Region.of(region)); if (serviceEndpoint != null) { builder.endpointOverride(serviceEndpoint); @@ -52,4 +61,23 @@ public SqsClient getSqsClient() { return builder.build(); } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BasicSqsClientProvider that = (BasicSqsClientProvider) o; + return Objects.equals(awsCredentialsProviderSerialized, that.awsCredentialsProviderSerialized) + && Objects.equals(region, that.region) + && Objects.equals(serviceEndpoint, that.serviceEndpoint); + } + + @Override + public int hashCode() { + return Objects.hash(awsCredentialsProviderSerialized, region, serviceEndpoint); + } } diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProviderTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProviderTest.java new file mode 100644 index 000000000000..29c41ad6a517 --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/BasicDynamoDbClientProviderTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.dynamodb; + +import static org.junit.Assert.assertEquals; + +import org.apache.beam.sdk.util.SerializableUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + +/** Tests on {@link BasicDynamoDbClientProvider}. */ +@RunWith(JUnit4.class) +public class BasicDynamoDbClientProviderTest { + + @Test + public void testSerialization() { + AwsCredentialsProvider awsCredentialsProvider = + StaticCredentialsProvider.create( + AwsBasicCredentials.create("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")); + + BasicDynamoDbClientProvider dynamoDbClientProvider = + new BasicDynamoDbClientProvider(awsCredentialsProvider, "us-east-1", null); + + byte[] serializedBytes = SerializableUtils.serializeToByteArray(dynamoDbClientProvider); + + BasicDynamoDbClientProvider dynamoDbClientProviderDeserialized = + (BasicDynamoDbClientProvider) + SerializableUtils.deserializeFromByteArray(serializedBytes, "Aws Credentials Provider"); + + assertEquals(dynamoDbClientProvider, dynamoDbClientProviderDeserialized); + } +} diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIOTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIOTest.java index 785a5bd7eeeb..a204cec2a556 100644 --- a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIOTest.java +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/dynamodb/DynamoDBIOTest.java @@ -22,8 +22,11 @@ import static org.junit.Assert.fail; import java.io.Serializable; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.testing.ExpectedLogs; import org.apache.beam.sdk.testing.PAssert; @@ -45,10 +48,10 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -59,7 +62,6 @@ import software.amazon.awssdk.services.dynamodb.model.WriteRequest; /** Test Coverage for the IO. */ -@Ignore("[BEAM-7794] DynamoDBIOTest is blocking forever") @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) @@ -313,4 +315,83 @@ public void testRetries() throws Throwable { } fail("Pipeline is expected to fail because we were unable to write to DynamoDb."); } + + /** + * A DoFn used to generate outputs duplicated N times, where N is the input. Used to generate + * bundles with duplicate elements. + */ + private static class WriteDuplicateGeneratorDoFn extends DoFn> { + @ProcessElement + public void processElement(ProcessContext ctx) { + for (int i = 0; i < ctx.element(); i++) { + for (int j = 1; j <= numOfItems; j++) { + KV item = KV.of("test" + j, 1000 + j); + ctx.output(item); + } + } + } + } + + @Test + public void testWriteDeduplication() { + // designate duplication factor for each bundle + final List duplications = Arrays.asList(1, 2, 3); + + final List deduplicateKeys = Arrays.asList("hashKey1", "rangeKey2"); + + DynamoDbClient amazonDynamoDBMock = Mockito.mock(DynamoDbClient.class); + + pipeline + .apply(Create.of(duplications)) + .apply("duplicate", ParDo.of(new WriteDuplicateGeneratorDoFn())) + .apply( + DynamoDBIO.>write() + .withWriteRequestMapperFn( + (SerializableFunction, KV>) + entry -> { + Map putRequest = + ImmutableMap.of( + "hashKey1", + AttributeValue.builder().s(entry.getKey()).build(), + "rangeKey2", + AttributeValue.builder().n(entry.getValue().toString()).build()); + + WriteRequest writeRequest = + WriteRequest.builder() + .putRequest(PutRequest.builder().item(putRequest).build()) + .build(); + return KV.of(tableName, writeRequest); + }) + .withRetryConfiguration( + DynamoDBIO.RetryConfiguration.builder() + .setMaxAttempts(5) + .setMaxDuration(Duration.standardMinutes(1)) + .setRetryPredicate(DEFAULT_RETRY_PREDICATE) + .build()) + .withDynamoDbClientProvider(DynamoDbClientProviderMock.of(amazonDynamoDBMock)) + .withDeduplicateKeys(deduplicateKeys)); + + pipeline.run().waitUntilFinish(); + + ArgumentCaptor argumentCaptor = + ArgumentCaptor.forClass(BatchWriteItemRequest.class); + Mockito.verify(amazonDynamoDBMock, Mockito.times(3)).batchWriteItem(argumentCaptor.capture()); + List batchRequests = argumentCaptor.getAllValues(); + batchRequests.forEach( + batchRequest -> { + List requests = batchRequest.requestItems().get(tableName); + // assert that each bundle contains expected number of items + assertEquals(numOfItems, requests.size()); + List> requestKeys = + requests.stream() + .map( + request -> + request.putRequest() != null + ? request.putRequest().item() + : request.deleteRequest().key()) + .collect(Collectors.toList()); + // assert no duplicate keys in each bundle + assertEquals(new HashSet<>(requestKeys).size(), requestKeys.size()); + }); + } } diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsModuleTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsModuleTest.java index dda5ad9568c4..2f0e038c1090 100644 --- a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsModuleTest.java +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsModuleTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.aws2.options; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtilsTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtilsTest.java new file mode 100644 index 000000000000..90c97b2fe329 --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/options/AwsSerializableUtilsTest.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.options; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + +/** Tests on {@link AwsSerializableUtils}. */ +public class AwsSerializableUtilsTest { + + private static final String ACCESS_KEY_ID = "ACCESS_KEY_ID"; + private static final String SECRET_ACCESS_KEY = "SECRET_ACCESS_KEY"; + + @Test + public void testAwsCredentialsProviderSerialization() { + AwsCredentialsProvider awsCredentialsProvider = + StaticCredentialsProvider.create( + AwsBasicCredentials.create(ACCESS_KEY_ID, SECRET_ACCESS_KEY)); + + String awsCredentialsProviderSerialized = + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + + AwsCredentialsProvider awsCredentialsProviderDeserialized = + AwsSerializableUtils.deserializeAwsCredentialsProvider(awsCredentialsProviderSerialized); + + assertTrue(awsCredentialsProviderDeserialized instanceof StaticCredentialsProvider); + AwsCredentials awsCredentials = awsCredentialsProviderDeserialized.resolveCredentials(); + assertEquals(ACCESS_KEY_ID, awsCredentials.accessKeyId()); + assertEquals(SECRET_ACCESS_KEY, awsCredentials.secretAccessKey()); + } + + static class UnknownAwsCredentialsProvider implements AwsCredentialsProvider { + @Override + public AwsCredentials resolveCredentials() { + return AwsBasicCredentials.create(ACCESS_KEY_ID, SECRET_ACCESS_KEY); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testFailOnAwsCredentialsProviderSerialization() { + AwsCredentialsProvider awsCredentialsProvider = new UnknownAwsCredentialsProvider(); + AwsSerializableUtils.serializeAwsCredentialsProvider(awsCredentialsProvider); + } + + @Test(expected = IllegalArgumentException.class) + public void testFailOnAwsCredentialsProviderDeserialization() { + AwsSerializableUtils.deserializeAwsCredentialsProvider("invalid string"); + } +} diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProviderTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProviderTest.java new file mode 100644 index 000000000000..4b94750a8bb2 --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsAsyncClientProviderTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.sns; + +import static org.junit.Assert.assertEquals; + +import org.apache.beam.sdk.util.SerializableUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + +/** Tests on {@link BasicSnsAsyncClientProvider}. */ +@RunWith(JUnit4.class) +public class BasicSnsAsyncClientProviderTest { + + @Test + public void testSerialization() { + AwsCredentialsProvider awsCredentialsProvider = + StaticCredentialsProvider.create( + AwsBasicCredentials.create("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")); + + BasicSnsAsyncClientProvider snsAsyncClientProvider = + new BasicSnsAsyncClientProvider(awsCredentialsProvider, "us-east-1", null); + + byte[] serializedBytes = SerializableUtils.serializeToByteArray(snsAsyncClientProvider); + + BasicSnsAsyncClientProvider snsAsyncClientProviderDeserialized = + (BasicSnsAsyncClientProvider) + SerializableUtils.deserializeFromByteArray(serializedBytes, "Aws Credentials Provider"); + + assertEquals(snsAsyncClientProvider, snsAsyncClientProviderDeserialized); + } +} diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProviderTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProviderTest.java new file mode 100644 index 000000000000..76665a4af7cf --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sns/BasicSnsClientProviderTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.sns; + +import static org.junit.Assert.assertEquals; + +import org.apache.beam.sdk.util.SerializableUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + +/** Tests on {@link BasicSnsClientProvider}. */ +@RunWith(JUnit4.class) +public class BasicSnsClientProviderTest { + + @Test + public void testSerialization() { + AwsCredentialsProvider awsCredentialsProvider = + StaticCredentialsProvider.create( + AwsBasicCredentials.create("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")); + + BasicSnsClientProvider snsClientProvider = + new BasicSnsClientProvider(awsCredentialsProvider, "us-east-1", null); + + byte[] serializedBytes = SerializableUtils.serializeToByteArray(snsClientProvider); + + BasicSnsClientProvider snsClientProviderDeserialized = + (BasicSnsClientProvider) + SerializableUtils.deserializeFromByteArray(serializedBytes, "Aws Credentials Provider"); + + assertEquals(snsClientProvider, snsClientProviderDeserialized); + } +} diff --git a/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProviderTest.java b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProviderTest.java new file mode 100644 index 000000000000..0970f9de0d5c --- /dev/null +++ b/sdks/java/io/amazon-web-services2/src/test/java/org/apache/beam/sdk/io/aws2/sqs/BasicSqsClientProviderTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.aws2.sqs; + +import static org.junit.Assert.assertEquals; + +import org.apache.beam.sdk.util.SerializableUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + +/** Tests on {@link BasicSqsClientProvider}. */ +@RunWith(JUnit4.class) +public class BasicSqsClientProviderTest { + + @Test + public void testSerialization() { + AwsCredentialsProvider awsCredentialsProvider = + StaticCredentialsProvider.create( + AwsBasicCredentials.create("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")); + + BasicSqsClientProvider sqsClientProvider = + new BasicSqsClientProvider(awsCredentialsProvider, "us-east-1", null); + + byte[] serializedBytes = SerializableUtils.serializeToByteArray(sqsClientProvider); + + BasicSqsClientProvider sqsClientProviderDeserialized = + (BasicSqsClientProvider) + SerializableUtils.deserializeFromByteArray(serializedBytes, "Aws Credentials Provider"); + + assertEquals(sqsClientProvider, sqsClientProviderDeserialized); + } +} diff --git a/sdks/java/io/azure/src/test/java/org/apache/beam/sdk/io/azure/blobstore/AzureBlobStoreFileSystemTest.java b/sdks/java/io/azure/src/test/java/org/apache/beam/sdk/io/azure/blobstore/AzureBlobStoreFileSystemTest.java index 7f89119a713d..92d8ad07f04b 100644 --- a/sdks/java/io/azure/src/test/java/org/apache/beam/sdk/io/azure/blobstore/AzureBlobStoreFileSystemTest.java +++ b/sdks/java/io/azure/src/test/java/org/apache/beam/sdk/io/azure/blobstore/AzureBlobStoreFileSystemTest.java @@ -19,10 +19,10 @@ import static java.util.UUID.randomUUID; import static org.apache.beam.sdk.io.fs.CreateOptions.StandardCreateOptions.builder; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; diff --git a/sdks/java/io/cassandra/src/test/java/org/apache/beam/sdk/io/cassandra/CassandraIOTest.java b/sdks/java/io/cassandra/src/test/java/org/apache/beam/sdk/io/cassandra/CassandraIOTest.java index bd85cb158d4f..40a5a4e20837 100644 --- a/sdks/java/io/cassandra/src/test/java/org/apache/beam/sdk/io/cassandra/CassandraIOTest.java +++ b/sdks/java/io/cassandra/src/test/java/org/apache/beam/sdk/io/cassandra/CassandraIOTest.java @@ -23,11 +23,11 @@ import static org.apache.beam.sdk.io.cassandra.CassandraIO.CassandraSource.getRingFraction; import static org.apache.beam.sdk.io.cassandra.CassandraIO.CassandraSource.isMurmur3Partitioner; import static org.apache.beam.sdk.testing.SourceTestUtils.readFromSource; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.ResultSet; diff --git a/sdks/java/io/contextualtextio/src/test/java/org/apache/beam/sdk/io/contextualtextio/ContextualTextIOTest.java b/sdks/java/io/contextualtextio/src/test/java/org/apache/beam/sdk/io/contextualtextio/ContextualTextIOTest.java index 62b53fbdde79..c3b12332bcee 100644 --- a/sdks/java/io/contextualtextio/src/test/java/org/apache/beam/sdk/io/contextualtextio/ContextualTextIOTest.java +++ b/sdks/java/io/contextualtextio/src/test/java/org/apache/beam/sdk/io/contextualtextio/ContextualTextIOTest.java @@ -32,11 +32,11 @@ import static org.apache.beam.sdk.io.Compression.ZIP; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; import static org.apache.beam.sdk.values.TypeDescriptors.strings; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; import java.io.File; import java.io.FileOutputStream; diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/src/test/java/org/apache/beam/sdk/io/elasticsearch/ElasticsearchIOTestCommon.java b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/src/test/java/org/apache/beam/sdk/io/elasticsearch/ElasticsearchIOTestCommon.java index 68931fd8451b..72dc0100b171 100644 --- a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/src/test/java/org/apache/beam/sdk/io/elasticsearch/ElasticsearchIOTestCommon.java +++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/src/test/java/org/apache/beam/sdk/io/elasticsearch/ElasticsearchIOTestCommon.java @@ -29,12 +29,12 @@ import static org.apache.beam.sdk.io.elasticsearch.ElasticsearchIOTestUtils.countByScientistName; import static org.apache.beam.sdk.io.elasticsearch.ElasticsearchIOTestUtils.refreshIndexAndGetCurrentNumDocs; import static org.apache.beam.sdk.testing.SourceTestUtils.readFromSource; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.core.Is.isA; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java index 0334a0c6644f..2a324f17fde0 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java @@ -1936,6 +1936,8 @@ public enum WriteDisposition { /** * An enumeration type for the BigQuery schema update options strings. * + *

    Not supported for {@link Method#STREAMING_INSERTS}. + * *

    Note from the BigQuery API doc -- Schema update options are supported in two cases: when * writeDisposition is WRITE_APPEND; when writeDisposition is WRITE_TRUNCATE and the destination * table is a partition of a table, specified by partition decorators. @@ -2180,7 +2182,12 @@ public Write withWriteDisposition(WriteDisposition writeDisposition) { return toBuilder().setWriteDisposition(writeDisposition).build(); } - /** Allows the schema of the destination table to be updated as a side effect of the write. */ + /** + * Allows the schema of the destination table to be updated as a side effect of the write. + * + *

    This configuration applies only when writing to BigQuery with {@link Method#FILE_LOADS} as + * method. + */ public Write withSchemaUpdateOptions(Set schemaUpdateOptions) { checkArgument(schemaUpdateOptions != null, "schemaUpdateOptions can not be null"); return toBuilder().setSchemaUpdateOptions(schemaUpdateOptions).build(); @@ -2654,6 +2661,9 @@ private WriteResult continueExpandTyped( checkArgument( rowWriterFactory.getOutputType() == RowWriterFactory.OutputType.JsonTableRow, "Avro output is not supported when method == STREAMING_INSERTS"); + checkArgument( + getSchemaUpdateOptions() == null || getSchemaUpdateOptions().isEmpty(), + "SchemaUpdateOptions are not supported when method == STREAMING_INSERTS"); RowWriterFactory.TableRowWriterFactory tableRowWriterFactory = (RowWriterFactory.TableRowWriterFactory) rowWriterFactory; diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryStorageStreamSource.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryStorageStreamSource.java index d220bcba8bd2..1d59dcb67b40 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryStorageStreamSource.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryStorageStreamSource.java @@ -163,6 +163,7 @@ public static class BigQueryStorageStreamReader extends BoundedSource.Bounded private long currentOffset; // Values used for progress reporting. + private boolean splitPossible = true; private double fractionConsumed; private double progressAtResponseStart; private double progressAtResponseEnd; @@ -288,6 +289,10 @@ public BoundedSource splitAtFraction(double fraction) { return null; } + if (!splitPossible) { + return null; + } + SplitReadStreamRequest splitRequest = SplitReadStreamRequest.newBuilder() .setName(source.readStream.getName()) @@ -305,6 +310,7 @@ public BoundedSource splitAtFraction(double fraction) { "BigQuery Storage API stream {} cannot be split at {}.", source.readStream.getName(), fraction); + splitPossible = false; return null; } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutation.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutation.java new file mode 100644 index 000000000000..f394cbed607a --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutation.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; + +import com.google.bigtable.v2.Mutation; +import com.google.protobuf.ByteString; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; + +/** + * Bigtable reference: . + * + *

    Requires a flat schema and a mapping which column family corresponds to which column. + * + *

    {@link Row} represents Bigtable {@link Mutation} in the following way: + * + *

    Mapped Beam {@link Row}: + * + *

    BEAM_ROW: ROW + * + *

    VALUE: Beam {@link Schema} type except for ARRAY, DECIMAL, ITERABLE, MAP, ROW + * + *

    Mapped {@link Mutation}: + * + *

    mutation: key, setCell[] + * + *

    setCell: familyName, columnQualifier, ROW[columnQualifier] - familyName comes from the column: + * family mapping + */ +public class BeamRowToBigtableMutation + extends PTransform, PCollection>>> + implements Serializable { + + private final Map columnFamilyMapping; + + public BeamRowToBigtableMutation(Map> familyColumnMapping) { + columnFamilyMapping = + familyColumnMapping.entrySet().stream() + .flatMap(kv -> kv.getValue().stream().map(column -> KV.of(column, kv.getKey()))) + .collect(toMap(KV::getKey, KV::getValue)); + } + + @Override + public PCollection>> expand(PCollection input) { + return input.apply(MapElements.via(new ToBigtableRowFn(columnFamilyMapping))); + } + + public static class ToBigtableRowFn + extends SimpleFunction>> { + + private final Map columnFamilyMapping; + private final CellValueParser cellValueParser = new CellValueParser(); + + public ToBigtableRowFn(Map columnFamilyMapping) { + this.columnFamilyMapping = columnFamilyMapping; + } + + @Override + public KV> apply(Row row) { + List mutations = + columnFamilyMapping.entrySet().stream() + .map(columnFamily -> mutation(columnFamily.getValue(), columnFamily.getKey(), row)) + .collect(toList()); + String key = row.getString(KEY); + if (key != null) { + return KV.of(ByteString.copyFromUtf8(key), mutations); + } else { + throw new NullPointerException("Null key"); + } + } + + private Mutation mutation(String family, String column, Row row) { + return Mutation.newBuilder() + .setSetCell( + Mutation.SetCell.newBuilder() + .setValue(convertValueToByteString(row, column)) + .setColumnQualifier(ByteString.copyFromUtf8(column)) + .setFamilyName(family) + .build()) + .build(); + } + + private ByteString convertValueToByteString(Row row, String column) { + Schema.Field field = row.getSchema().getField(column); + Schema.TypeName typeName = field.getType().getTypeName(); + Object value = row.getValue(column); + if (value == null) { + throw new NullPointerException("Null value at column " + column); + } else { + return cellValueParser.valueToByteString(value, typeName); + } + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfig.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfig.java index bfac6563c4b2..8592d45cee7d 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfig.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfig.java @@ -66,6 +66,9 @@ abstract class BigtableConfig implements Serializable { /** {@link BigtableService} used only for testing. */ abstract @Nullable BigtableService getBigtableService(); + /** Bigtable emulator. Used only for testing. */ + abstract @Nullable String getEmulatorHost(); + abstract Builder toBuilder(); static BigtableConfig.Builder builder() { @@ -92,6 +95,8 @@ abstract Builder setBigtableOptionsConfigurator( abstract Builder setBigtableService(BigtableService bigtableService); + abstract Builder setEmulatorHost(String emulatorHost); + abstract BigtableConfig build(); } @@ -133,6 +138,12 @@ BigtableConfig withBigtableService(BigtableService bigtableService) { return toBuilder().setBigtableService(bigtableService).build(); } + @VisibleForTesting + BigtableConfig withEmulator(String emulatorHost) { + checkArgument(emulatorHost != null, "emulatorHost can not be null"); + return toBuilder().setEmulatorHost(emulatorHost).build(); + } + void validate() { checkArgument( getTableId() != null && (!getTableId().isAccessible() || !getTableId().get().isEmpty()), @@ -225,6 +236,10 @@ private BigtableOptions.Builder effectiveUserProvidedBigtableOptions() { effectiveOptions.setProjectId(getProjectId().get()); } + if (getEmulatorHost() != null) { + effectiveOptions.enableEmulator(getEmulatorHost()); + } + return effectiveOptions; } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIO.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIO.java index c9aa5a04dda7..a55221936887 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIO.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIO.java @@ -455,6 +455,17 @@ Read withBigtableService(BigtableService bigtableService) { return toBuilder().setBigtableConfig(config.withBigtableService(bigtableService)).build(); } + /** + * Returns a new {@link BigtableIO.Read} that will use an official Bigtable emulator. + * + *

    This is used for testing. + */ + @VisibleForTesting + public Read withEmulator(String emulatorHost) { + BigtableConfig config = getBigtableConfig(); + return toBuilder().setBigtableConfig(config.withEmulator(emulatorHost)).build(); + } + @Override public PCollection expand(PBegin input) { getBigtableConfig().validate(); @@ -686,6 +697,17 @@ Write withBigtableService(BigtableService bigtableService) { return toBuilder().setBigtableConfig(config.withBigtableService(bigtableService)).build(); } + /** + * Returns a new {@link BigtableIO.Write} that will use an official Bigtable emulator. + * + *

    This is used for testing. + */ + @VisibleForTesting + public Write withEmulator(String emulatorHost) { + BigtableConfig config = getBigtableConfig(); + return toBuilder().setBigtableConfig(config.withEmulator(emulatorHost)).build(); + } + /** * Returns a {@link BigtableIO.WriteWithResults} that will emit a {@link BigtableWriteResult} * for each batch of rows written. diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRow.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRow.java new file mode 100644 index 000000000000..6dff82dd98c5 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRow.java @@ -0,0 +1,176 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.LABELS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.TIMESTAMP_MICROS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.VALUE; + +import com.google.bigtable.v2.Cell; +import com.google.bigtable.v2.Column; +import com.google.bigtable.v2.Family; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * Bigtable reference: . + * + *

    Bigtable {@link com.google.bigtable.v2.Row} is mapped to Beam {@link Row} in the following + * way: + * + *

    row: key, columnFamily[] -> BEAM_ROW + * + *

    columnFamily: familyName, column[] -> FAMILY + * + *

    column: columnQualifier, cell[] -> most recent cell or ARRAY + * + *

    cell: value, timestampMicros, labels -> VALUE + * + *

    Mapped Beam {@link Row}: + * + *

    BEAM_ROW: ROW + * + *

    FAMILY: ROW<[columnName ARRAY or VALUE]+> + * + *

    VALUE:ROW_CELL or {@link Schema} type except for: ARRAY, DECIMAL, ITERABLE, MAP, ROW + * + *

    ROW_CELL: ROW]> + * + *

    Note: ARRAY is not supported for now. + */ +public class BigtableRowToBeamRow + extends PTransform, PCollection> + implements Serializable { + + private final Schema schema; + + public BigtableRowToBeamRow(Schema schema) { + this.schema = schema; + } + + @Override + public PCollection expand(PCollection input) { + return input.apply(MapElements.via(new ToBeamRowFn(schema))); + } + + private static class ToBeamRowFn extends BigtableRowToBeamRowFn { + ToBeamRowFn(Schema schema) { + super(schema); + } + + @Override + public Row apply(com.google.bigtable.v2.Row bigtableRow) { + return bigtableRowToBeamRow(bigtableRow); + } + + private Row cellToRow(Cell cell, Schema cellSchema) { + + Row.FieldValueBuilder rowBuilder = + Row.withSchema(cellSchema) + .withFieldValue( + VALUE, getCellValue(cell, cellSchema.getField(VALUE).getType().getTypeName())); + if (cellSchema.hasField(TIMESTAMP_MICROS)) { + rowBuilder.withFieldValue(TIMESTAMP_MICROS, cell.getTimestampMicros()); + } + if (cellSchema.hasField(LABELS)) { + rowBuilder.withFieldValue(LABELS, cell.getLabelsList()); + } + return rowBuilder.build(); + } + + // Returns Simple type, List or Row + private Object columnToRow(Column column, Schema schema) { + String columnName = column.getQualifier().toStringUtf8(); + Schema.FieldType columnType = schema.getField(columnName).getType(); + List cells = column.getCellsList(); + switch (columnType.getTypeName()) { + case ARRAY: + Schema.FieldType collectionElementType = columnType.getCollectionElementType(); + if (collectionElementType != null) { + return cells.stream() + .map(cell -> getCellValue(cell, collectionElementType.getTypeName())) + .collect(toList()); + } else { + throw new NullPointerException("Null collectionElementType at column " + columnName); + } + case ROW: + @Nullable Schema rowSchema = columnType.getRowSchema(); + if (rowSchema == null) { + throw new NullPointerException("Null row schema at column " + columnName); + } else { + return cellToRow(getLastCell(cells), rowSchema); + } + default: + return getCellValue(getLastCell(cells), columnType.getTypeName()); + } + } + + private Row familyToRow(Family family, Schema schema) { + Map columns = + family.getColumnsList().stream() + .filter(column -> schema.hasField(column.getQualifier().toStringUtf8())) + .map( + column -> { + String columnName = column.getQualifier().toStringUtf8(); + return KV.of(columnName, columnToRow(column, schema)); + }) + .collect( + Collectors.toMap( + KV::getKey, + kv -> { + Object value = kv.getValue(); + if (value == null) { + throw new NullPointerException("Null value at column " + kv.getKey()); + } else { + return value; + } + })); + return Row.withSchema(schema).withFieldValues(columns).build(); + } + + private Row bigtableRowToBeamRow(com.google.bigtable.v2.Row bigtableRow) { + Row.FieldValueBuilder rowBuilder = + Row.withSchema(schema).withFieldValue(KEY, bigtableRow.getKey().toStringUtf8()); + bigtableRow.getFamiliesList().stream() + .filter(family -> schema.hasField(family.getName())) + .forEach( + family -> { + Schema familySchema = schema.getField(family.getName()).getType().getRowSchema(); + if (familySchema == null) { + throw new NullPointerException( + "Null family schema at family " + family.getName()); + } else { + rowBuilder.withFieldValue(family.getName(), familyToRow(family, familySchema)); + } + }); + return rowBuilder.build(); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlat.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlat.java new file mode 100644 index 000000000000..55cecbcaf2c8 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlat.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; + +import com.google.bigtable.v2.Column; +import com.google.bigtable.v2.Family; +import java.util.Map; +import java.util.Set; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; + +/** + * Bigtable reference: . + * + *

    Requires a mapping which column family corresponds to which column + * + *

    Bigtable {@link com.google.bigtable.v2.Row} is mapped to Beam {@link Row} in the following + * way: + * + *

    row: key, columnFamily[] -> BEAM_ROW + * + *

    columnFamily: familyName, column[] -> not mapped directly + * + *

    column: columnQualifier, cell[] -> most recent cell + * + *

    cell: value, timestampMicros, labels -> VALUE + * + *

    Mapped Beam {@link Row}: + * + *

    BEAM_ROW: ROW + * + *

    VALUE: Beam {@link Schema} type except for ARRAY, DECIMAL, ITERABLE, MAP, ROW + */ +public class BigtableRowToBeamRowFlat + extends PTransform, PCollection> { + + private final Schema schema; + private final Map> columnsMapping; + + public BigtableRowToBeamRowFlat(Schema schema, Map> columnsMapping) { + this.schema = schema; + this.columnsMapping = columnsMapping; + } + + @Override + public PCollection expand(PCollection input) { + return input.apply( + MapElements.via(new BigtableRowToBeamRowFlat.ToBeamRowFn(schema, columnsMapping))); + } + + private static class ToBeamRowFn extends BigtableRowToBeamRowFn { + private final Map> columnsMapping; + + public ToBeamRowFn(Schema schema, Map> columnsMapping) { + super(schema); + this.columnsMapping = columnsMapping; + } + + @Override + public Row apply(com.google.bigtable.v2.Row bigtableRow) { + Row.FieldValueBuilder rowBuilder = + Row.withSchema(schema).withFieldValue(KEY, bigtableRow.getKey().toStringUtf8()); + + bigtableRow.getFamiliesList().stream() + .filter(family -> columnsMapping.containsKey(family.getName())) + .forEach(family -> setFamily(rowBuilder, family)); + return rowBuilder.build(); + } + + private void setFamily(Row.FieldValueBuilder rowBuilder, Family family) { + Set columns = columnsMapping.get(family.getName()); + if (columns == null) { + throw new NullPointerException("Null column list at family " + family.getName()); + } else { + family.getColumnsList().stream() + .filter(column -> columns.contains(column.getQualifier().toStringUtf8())) + .forEach(column -> setColumn(rowBuilder, column)); + } + } + + private void setColumn(Row.FieldValueBuilder rowBuilder, Column column) { + String columnName = column.getQualifier().toStringUtf8(); + Schema.TypeName type = schema.getField(columnName).getType().getTypeName(); + rowBuilder.withFieldValue(columnName, getCellValue(getLastCell(column.getCellsList()), type)); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFn.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFn.java new file mode 100644 index 000000000000..0e7da66fc89e --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFn.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import com.google.bigtable.v2.Cell; +import java.util.Comparator; +import java.util.List; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.Row; + +class BigtableRowToBeamRowFn extends SimpleFunction { + + protected final Schema schema; + + private final CellValueParser valueParser = new CellValueParser(); + + public BigtableRowToBeamRowFn(Schema schema) { + this.schema = schema; + } + + protected Cell getLastCell(List cells) { + return cells.stream() + .max(Comparator.comparingLong(Cell::getTimestampMicros)) + .orElseThrow(() -> new RuntimeException("Couldn't retrieve the most recent cell value")); + } + + protected Object getCellValue(Cell cell, Schema.TypeName typeName) { + return valueParser.getCellValue(cell, typeName); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java new file mode 100644 index 000000000000..2388615f0ae2 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParser.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; + +import com.google.bigtable.v2.Cell; +import com.google.protobuf.ByteString; +import java.io.Serializable; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Ints; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Longs; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Shorts; +import org.joda.time.DateTime; + +class CellValueParser implements Serializable { + + Object getCellValue(Cell cell, Schema.TypeName type) { + ByteString cellValue = cell.getValue(); + int valueSize = cellValue.size(); + switch (type) { + case BOOLEAN: + checkArgument(valueSize == 1, message("Boolean", 1)); + return cellValue.toByteArray()[0] != 0; + case BYTE: + checkArgument(valueSize == 1, message("Byte", 1)); + return cellValue.toByteArray()[0]; + case INT16: + checkArgument(valueSize == 2, message("Int16", 2)); + return Shorts.fromByteArray(cellValue.toByteArray()); + case INT32: + checkArgument(valueSize == 4, message("Int32", 4)); + return Ints.fromByteArray(cellValue.toByteArray()); + case INT64: + checkArgument(valueSize == 8, message("Int64", 8)); + return Longs.fromByteArray(cellValue.toByteArray()); + case FLOAT: + checkArgument(valueSize == 4, message("Float", 4)); + return Float.intBitsToFloat(Ints.fromByteArray(cellValue.toByteArray())); + case DOUBLE: + checkArgument(valueSize == 8, message("Double", 8)); + return Double.longBitsToDouble(Longs.fromByteArray(cellValue.toByteArray())); + case DATETIME: + return DateTime.parse(cellValue.toStringUtf8()); + case STRING: + return cellValue.toStringUtf8(); + case BYTES: + return cellValue.toByteArray(); + default: + throw new IllegalArgumentException( + String.format("Unsupported cell value type '%s'.", type)); + } + } + + ByteString valueToByteString(Object value, Schema.TypeName type) { + switch (type) { + case BOOLEAN: + return byteString(((Boolean) value) ? new byte[] {1} : new byte[] {0}); + case FLOAT: + return byteString(Ints.toByteArray(Float.floatToIntBits((Float) value))); + case DOUBLE: + return byteString(Longs.toByteArray(Double.doubleToLongBits((Double) value))); + case BYTE: + return byteString(new byte[] {(Byte) value}); + case INT16: + return byteString(Shorts.toByteArray((Short) value)); + case INT32: + return byteString(Ints.toByteArray((Integer) value)); + case INT64: + return byteString(Longs.toByteArray((Long) value)); + case STRING: + return byteString(((String) value).getBytes(UTF_8)); + case BYTES: + return byteString((byte[]) value); + case DATETIME: + return byteString(value.toString().getBytes(UTF_8)); + default: + throw new IllegalStateException("Unsupported type: " + type); + } + } + + private ByteString byteString(byte[] value) { + return ByteString.copyFrom(value); + } + + private String message(String type, int byteSize) { + return String.format( + "%s has to be %s-byte%s long bytearray", type, byteSize, byteSize == 1 ? "" : "s"); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderJsonIT.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/RowUtils.java similarity index 54% rename from sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderJsonIT.java rename to sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/RowUtils.java index 735fabf80fce..a79a432cb89f 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderJsonIT.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/RowUtils.java @@ -15,26 +15,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; +package org.apache.beam.sdk.io.gcp.bigtable; -import static java.nio.charset.StandardCharsets.UTF_8; +import com.google.protobuf.ByteString; -import org.apache.kafka.clients.producer.ProducerRecord; +public class RowUtils { + public static final String KEY = "key"; + public static final String VALUE = "val"; + public static final String TIMESTAMP_MICROS = "timestampMicros"; + public static final String LABELS = "labels"; + public static final String COLUMNS_MAPPING = "columnsMapping"; -public class KafkaTableProviderJsonIT extends KafkaTableProviderIT { - @Override - protected ProducerRecord generateProducerRecord(int i) { - return new ProducerRecord<>( - kafkaOptions.getKafkaTopic(), "k" + i, createJson(i).getBytes(UTF_8)); + public static ByteString byteString(byte[] bytes) { + return ByteString.copyFrom(bytes); } - @Override - protected String getPayloadFormat() { - return "json"; - } - - private String createJson(int i) { - return String.format( - "{\"f_long\": %s, \"f_int\": %s, \"f_string\": \"%s\"}", i, i % 3 + 1, "value" + i); + public static ByteString byteStringUtf8(String value) { + return ByteString.copyFromUtf8(value); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIO.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIO.java new file mode 100644 index 000000000000..8bb17f10ca28 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIO.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import org.apache.beam.sdk.Pipeline; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionTuple; +import org.apache.beam.sdk.values.PInput; +import org.apache.beam.sdk.values.POutput; +import org.apache.beam.sdk.values.PValue; +import org.apache.beam.sdk.values.TupleTag; +import org.apache.beam.sdk.values.TupleTagList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; + +/** + * The DicomIO connectors allows Beam pipelines to make calls to the Dicom API of the Google Cloud + * Healthcare API (https://cloud.google.com/healthcare/docs/how-tos#dicom-guide). + * + *

    Reading Study-Level Metadata

    + * + * The study-level metadata for a dicom instance can be read with {@link ReadStudyMetadata}. + * Retrieve the metadata of a dicom instance given its store path as a string. This will return a + * {@link ReadStudyMetadata.Result}. You can fetch the successful calls using getReadResponse(), and + * any failed reads using getFailedReads(). + * + *

    Example

    + * + * {@code Pipeline p = ... String webPath = ... DicomIO.ReadStudyMetadata.Result readMetadataResult + * = p .apply(Create.of(webPath)) PCollection goodRead = + * readMetadataResult.getReadResponse() PCollection failRead = + * readMetadataResult.getFailedReads() } + */ +public class DicomIO { + + public static ReadStudyMetadata readStudyMetadata() { + return new ReadStudyMetadata(); + } + + /** + * This class makes a call to the retrieve metadata endpoint + * (https://cloud.google.com/healthcare/docs/how-tos/dicomweb#retrieving_metadata). It defines a + * function that can be used to process a Pubsub message from a DICOM store, read the DICOM study + * path and get the metadata of the specified study. You can learn how to configure PubSub + * messages to be published when an instance is stored by following: + * https://cloud.google.com/healthcare/docs/how-tos/pubsub. The connector will output a {@link + * ReadStudyMetadata.Result} which will contain metadata of the study encoded as a json array. + */ + public static class ReadStudyMetadata + extends PTransform, ReadStudyMetadata.Result> { + + private ReadStudyMetadata() {} + + /** TupleTag for the main output. */ + public static final TupleTag METADATA = new TupleTag() {}; + /** TupleTag for any error response. */ + public static final TupleTag ERROR_MESSAGE = new TupleTag() {}; + + public static class Result implements POutput, PInput { + private PCollection readResponse; + + private PCollection failedReads; + + /** Contains both the response and error outputs from the transformation. */ + PCollectionTuple pct; + + /** + * Create DicomIO.ReadStudyMetadata.Result from PCollectionTuple which contains the response + * (with METADATA and ERROR_MESSAGE tags). + * + * @param pct the pct + * @return the read result + * @throws IllegalArgumentException the illegal argument exception + */ + static ReadStudyMetadata.Result of(PCollectionTuple pct) throws IllegalArgumentException { + if (pct.getAll() + .keySet() + .containsAll((Collection) TupleTagList.of(METADATA).and(ERROR_MESSAGE))) { + return new ReadStudyMetadata.Result(pct); + } else { + throw new IllegalArgumentException( + "The PCollection tuple must have the DicomIO.ReadStudyMetadata.METADATA " + + "and DicomIO.ReadStudyMetadata.ERROR_MESSAGE tuple tags"); + } + } + + private Result(PCollectionTuple pct) { + this.pct = pct; + this.readResponse = pct.get(METADATA); + this.failedReads = pct.get(ERROR_MESSAGE); + } + + /** + * Gets failed reads. + * + * @return the failed reads + */ + public PCollection getFailedReads() { + return failedReads; + } + + /** + * Gets resources. + * + * @return the resources + */ + public PCollection getReadResponse() { + return readResponse; + } + + @Override + public Pipeline getPipeline() { + return this.pct.getPipeline(); + } + + @Override + public Map, PValue> expand() { + return ImmutableMap.of(METADATA, readResponse); + } + + @Override + public void finishSpecifyingOutput( + String transformName, PInput input, PTransform transform) {} + } + + /** + * DoFn to fetch the metadata of a study from a Dicom store based on it's location and study id. + */ + @SuppressWarnings({"nullness", "rawtypes"}) + static class FetchStudyMetadataFn extends DoFn { + + private HealthcareApiClient dicomStore; + + FetchStudyMetadataFn() {} + + /** + * Instantiate the healthcare client. + * + * @throws IOException + */ + @Setup + public void instantiateHealthcareClient() throws IOException { + if (dicomStore == null) { + this.dicomStore = new HttpHealthcareApiClient(); + } + } + + /** + * Process The Pub/Sub message. + * + * @param context The input containing the pub/sub message + */ + @ProcessElement + public void processElement(ProcessContext context) { + String dicomWebPath = context.element(); + try { + // TODO [BEAM-11259] Change to non-blocking async calls + String responseData = dicomStore.retrieveDicomStudyMetadata(dicomWebPath); + context.output(METADATA, responseData); + } catch (IOException e) { + String errorMessage = e.getMessage(); + if (errorMessage != null) { + context.output(ERROR_MESSAGE, errorMessage); + } + } + } + } + + @Override + public ReadStudyMetadata.Result expand(PCollection input) { + return new Result( + input.apply( + ParDo.of(new FetchStudyMetadataFn()) + .withOutputTags( + ReadStudyMetadata.METADATA, + TupleTagList.of(ReadStudyMetadata.ERROR_MESSAGE)))); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIO.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIO.java index 895c8da0cb81..244eab0a6f16 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIO.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIO.java @@ -26,6 +26,7 @@ import com.google.api.services.healthcare.v1beta1.model.Operation; import com.google.auto.value.AutoValue; import com.google.gson.Gson; +import com.google.gson.JsonArray; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; @@ -35,6 +36,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; @@ -58,6 +60,7 @@ import org.apache.beam.sdk.io.gcp.healthcare.HttpHealthcareApiClient.HealthcareHttpException; import org.apache.beam.sdk.io.gcp.pubsub.PubsubIO; import org.apache.beam.sdk.metrics.Counter; +import org.apache.beam.sdk.metrics.Distribution; import org.apache.beam.sdk.metrics.Metrics; import org.apache.beam.sdk.options.ValueProvider; import org.apache.beam.sdk.options.ValueProvider.StaticValueProvider; @@ -131,6 +134,11 @@ *

    Deidentify This is to de-identify FHIR resources from a source FHIR store and write the result * to a destination FHIR store. It is important that the destination store must already exist. * + *

    Search This is to search FHIR resources within a given FHIR store. The inputs are individual + * FHIR Search queries, represented by KV. The outputs are results + * of each Search, represented as a Json array of FHIR resources in string form, with pagination + * handled. + * * @see https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores.fhir/executeBundle> * @see https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores/export> * @see https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores/deidentify> + * @see https://cloud.google.com/healthcare/docs/reference/rest/v1beta1/projects.locations.datasets.fhirStores/search> * A {@link PCollection} of {@link String} can be ingested into an Fhir store using {@link * FhirIO.Write#fhirStoresImport(String, String, String, FhirIO.Import.ContentStructure)} This * will return a {@link FhirIO.Write.Result} on which you can call {@link @@ -196,6 +206,11 @@ * DeidentifyConfig deidConfig = new DeidentifyConfig(); // use default DeidentifyConfig * pipeline.apply(FhirIO.deidentify(fhirStoreName, destinationFhirStoreName, deidConfig)); * + * // Search FHIR resources. + * PCollection>> searchQueries = ...; + * FhirIO.Search.Result searchResult = + * searchQueries.apply(FhirIO.searchResources(options.getFhirStore())); + * * }*** * */ @@ -215,6 +230,16 @@ public static Read readResources() { return new Read(); } + /** + * Search resources from a Fhir store. + * + * @return the search + * @see Search + */ + public static Search searchResources(String fhirStore) { + return new Search(fhirStore); + } + /** * Import resources. Intended for use on empty FHIR stores * @@ -845,6 +870,7 @@ public static class Import extends Write { @Nullable ContentStructure contentStructure) { this(fhirStore, null, deadLetterGcsPath, contentStructure); } + /** * Instantiates a new Import. * @@ -1388,4 +1414,210 @@ public void deidentify(ProcessContext context) } } } + + /** The type Search. */ + public static class Search + extends PTransform>>, FhirIO.Search.Result> { + private static final Logger LOG = LoggerFactory.getLogger(Search.class); + + private final ValueProvider fhirStore; + + Search(ValueProvider fhirStore) { + this.fhirStore = fhirStore; + } + + Search(String fhirStore) { + this.fhirStore = StaticValueProvider.of(fhirStore); + } + + public static class Result implements POutput, PInput { + private PCollection resources; + + private PCollection> failedSearches; + PCollectionTuple pct; + + /** + * Create FhirIO.Search.Result form PCollectionTuple with OUT and DEAD_LETTER tags. + * + * @param pct the pct + * @return the search result + * @throws IllegalArgumentException the illegal argument exception + */ + static FhirIO.Search.Result of(PCollectionTuple pct) throws IllegalArgumentException { + if (pct.getAll() + .keySet() + .containsAll((Collection) TupleTagList.of(OUT).and(DEAD_LETTER))) { + return new FhirIO.Search.Result(pct); + } else { + throw new IllegalArgumentException( + "The PCollection tuple must have the FhirIO.Search.OUT " + + "and FhirIO.Search.DEAD_LETTER tuple tags"); + } + } + + private Result(PCollectionTuple pct) { + this.pct = pct; + this.resources = pct.get(OUT).setCoder(JsonArrayCoder.of()); + this.failedSearches = + pct.get(DEAD_LETTER).setCoder(HealthcareIOErrorCoder.of(StringUtf8Coder.of())); + } + + /** + * Gets failed searches. + * + * @return the failed searches + */ + public PCollection> getFailedSearches() { + return failedSearches; + } + + /** + * Gets resources. + * + * @return the resources + */ + public PCollection getResources() { + return resources; + } + + @Override + public Pipeline getPipeline() { + return this.pct.getPipeline(); + } + + @Override + public Map, PValue> expand() { + return ImmutableMap.of(OUT, resources); + } + + @Override + public void finishSpecifyingOutput( + String transformName, PInput input, PTransform transform) {} + } + + /** The tag for the main output of Fhir Messages. */ + public static final TupleTag OUT = new TupleTag() {}; + /** The tag for the deadletter output of Fhir Messages. */ + public static final TupleTag> DEAD_LETTER = + new TupleTag>() {}; + + @Override + public FhirIO.Search.Result expand(PCollection>> input) { + return input.apply("Fetch Fhir messages", new SearchResourcesJsonString(this.fhirStore)); + } + + /** + * DoFn to fetch resources from an Google Cloud Healthcare FHIR store based on search request + * + *

    This DoFn consumes a {@link PCollection} of search requests consisting of resource type + * and search parameters, and fetches all matching resources based on the search criteria and + * will output a {@link PCollectionTuple} which contains the output and dead-letter {@link + * PCollection}*. + * + *

    The {@link PCollectionTuple} output will contain the following {@link PCollection}: + * + *

      + *
    • {@link FhirIO.Search#OUT} - Contains all {@link PCollection} records successfully + * search from the Fhir store. + *
    • {@link FhirIO.Search#DEAD_LETTER} - Contains all {@link PCollection} of {@link + * HealthcareIOError}* of failed searches from the Fhir store, with error message and + * stacktrace. + *
    + */ + static class SearchResourcesJsonString + extends PTransform>>, FhirIO.Search.Result> { + + private final ValueProvider fhirStore; + + public SearchResourcesJsonString(ValueProvider fhirStore) { + this.fhirStore = fhirStore; + } + + @Override + public FhirIO.Search.Result expand(PCollection>> resourceIds) { + return new FhirIO.Search.Result( + resourceIds.apply( + ParDo.of(new SearchResourcesFn(this.fhirStore)) + .withOutputTags( + FhirIO.Search.OUT, TupleTagList.of(FhirIO.Search.DEAD_LETTER)))); + } + + /** DoFn for searching messages from the Fhir store with error handling. */ + static class SearchResourcesFn extends DoFn>, JsonArray> { + + private Distribution searchLatencyMs = + Metrics.distribution(SearchResourcesFn.class, "fhir-search-latency-ms"); + private Counter failedSearches = + Metrics.counter(SearchResourcesFn.class, "failed-fhir-searches"); + private static final Logger LOG = LoggerFactory.getLogger(SearchResourcesFn.class); + private final Counter successfulSearches = + Metrics.counter(SearchResourcesFn.class, "successful-fhir-searches"); + private HealthcareApiClient client; + private final ValueProvider fhirStore; + + /** Instantiates a new Fhir resources search fn. */ + SearchResourcesFn(ValueProvider fhirStore) { + this.fhirStore = fhirStore; + } + + /** + * Instantiate healthcare client. + * + * @throws IOException the io exception + */ + @Setup + public void instantiateHealthcareClient() throws IOException { + this.client = new HttpHealthcareApiClient(); + } + + /** + * Process element. + * + * @param context the context + */ + @ProcessElement + public void processElement(ProcessContext context) { + KV> elementValues = context.element(); + try { + context.output( + searchResources( + this.client, + this.fhirStore.toString(), + elementValues.getKey(), + elementValues.getValue())); + } catch (IllegalArgumentException | NoSuchElementException e) { + failedSearches.inc(); + LOG.warn( + String.format( + "Error search FHIR messages writing to Dead Letter " + + "Queue. Cause: %s Stack Trace: %s", + e.getMessage(), Throwables.getStackTraceAsString(e))); + context.output( + FhirIO.Search.DEAD_LETTER, HealthcareIOError.of(this.fhirStore.toString(), e)); + } + } + + private JsonArray searchResources( + HealthcareApiClient client, + String fhirStore, + String resourceType, + @Nullable Map parameters) + throws NoSuchElementException { + long startTime = System.currentTimeMillis(); + + HttpHealthcareApiClient.FhirResourcePages.FhirResourcePagesIterator iter = + new HttpHealthcareApiClient.FhirResourcePages.FhirResourcePagesIterator( + client, fhirStore, resourceType, parameters); + JsonArray result = new JsonArray(); + result.addAll(iter.next()); + while (iter.hasNext()) { + result.addAll(iter.next()); + } + searchLatencyMs.update(System.currentTimeMillis() - startTime); + this.successfulSearches.inc(); + return result; + } + } + } + } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HealthcareApiClient.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HealthcareApiClient.java index 013440a909cf..dbbedc8375d0 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HealthcareApiClient.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HealthcareApiClient.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.io.gcp.healthcare; import com.google.api.services.healthcare.v1beta1.model.DeidentifyConfig; +import com.google.api.services.healthcare.v1beta1.model.DicomStore; import com.google.api.services.healthcare.v1beta1.model.Empty; import com.google.api.services.healthcare.v1beta1.model.FhirStore; import com.google.api.services.healthcare.v1beta1.model.Hl7V2Store; @@ -27,8 +28,10 @@ import com.google.api.services.healthcare.v1beta1.model.Message; import com.google.api.services.healthcare.v1beta1.model.Operation; import java.io.IOException; +import java.net.URISyntaxException; import java.text.ParseException; import java.util.List; +import java.util.Map; import org.apache.beam.sdk.io.gcp.healthcare.HttpHealthcareApiClient.HealthcareHttpException; import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Instant; @@ -167,6 +170,22 @@ HttpBody executeFhirBundle(String fhirStore, String bundle) */ HttpBody readFhirResource(String resourceId) throws IOException; + /** + * Search fhir resource http body. + * + * @param fhirStore the fhir store + * @param resourceType the resource type + * @param parameters the parameters + * @return the http body + * @throws IOException + */ + HttpBody searchFhirResource( + String fhirStore, + String resourceType, + @Nullable Map parameters, + String pageToken) + throws IOException; + /** * Create hl 7 v 2 store hl 7 v 2 store. * @@ -202,4 +221,14 @@ FhirStore createFhirStore(String dataset, String name, String version, String pu Empty deleteHL7v2Store(String store) throws IOException; Empty deleteFhirStore(String store) throws IOException; + + String retrieveDicomStudyMetadata(String dicomWebPath) throws IOException; + + DicomStore createDicomStore(String dataset, String name) throws IOException; + + DicomStore createDicomStore(String dataset, String name, String pubsubTopic) throws IOException; + + Empty deleteDicomStore(String name) throws IOException; + + Empty uploadToDicomStore(String webPath, String filePath) throws IOException, URISyntaxException; } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HttpHealthcareApiClient.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HttpHealthcareApiClient.java index 2b6fe6477a44..47cbfe6d0d78 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HttpHealthcareApiClient.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/HttpHealthcareApiClient.java @@ -17,6 +17,7 @@ */ package org.apache.beam.sdk.io.gcp.healthcare; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestInitializer; @@ -24,11 +25,13 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.healthcare.v1beta1.CloudHealthcare; +import com.google.api.services.healthcare.v1beta1.CloudHealthcare.Projects.Locations.Datasets.FhirStores.Fhir.Search; import com.google.api.services.healthcare.v1beta1.CloudHealthcare.Projects.Locations.Datasets.Hl7V2Stores.Messages; import com.google.api.services.healthcare.v1beta1.CloudHealthcareScopes; import com.google.api.services.healthcare.v1beta1.model.CreateMessageRequest; import com.google.api.services.healthcare.v1beta1.model.DeidentifyConfig; import com.google.api.services.healthcare.v1beta1.model.DeidentifyFhirStoreRequest; +import com.google.api.services.healthcare.v1beta1.model.DicomStore; import com.google.api.services.healthcare.v1beta1.model.Empty; import com.google.api.services.healthcare.v1beta1.model.ExportResourcesRequest; import com.google.api.services.healthcare.v1beta1.model.FhirStore; @@ -44,12 +47,22 @@ import com.google.api.services.healthcare.v1beta1.model.Message; import com.google.api.services.healthcare.v1beta1.model.NotificationConfig; import com.google.api.services.healthcare.v1beta1.model.Operation; +import com.google.api.services.healthcare.v1beta1.model.SearchResourcesRequest; import com.google.api.services.storage.StorageScopes; import com.google.auth.oauth2.GoogleCredentials; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import java.io.IOException; import java.io.Serializable; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLDecoder; +import java.nio.file.Files; +import java.nio.file.Paths; import java.text.ParseException; import java.util.ArrayList; import java.util.Iterator; @@ -59,6 +72,7 @@ import java.util.stream.Collectors; import org.apache.beam.sdk.extensions.gcp.util.RetryHttpRequestInitializer; import org.apache.beam.sdk.util.ReleaseInfo; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Splitter; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Strings; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; @@ -66,6 +80,7 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; @@ -199,6 +214,81 @@ public Empty deleteFhirStore(String name) throws IOException { return client.projects().locations().datasets().fhirStores().delete(name).execute(); } + @Override + public String retrieveDicomStudyMetadata(String dicomWebPath) throws IOException { + WebPathParser parser = new WebPathParser(); + WebPathParser.DicomWebPath parsedDicomWebPath = parser.parseDicomWebpath(dicomWebPath); + + String searchQuery = String.format("studies/%s/metadata", parsedDicomWebPath.studyId); + + return makeRetrieveStudyMetadataRequest(parsedDicomWebPath.dicomStorePath, searchQuery); + } + + @Override + public DicomStore createDicomStore(String dataset, String name) throws IOException { + return createDicomStore(dataset, name, null); + } + + @Override + public Empty deleteDicomStore(String name) throws IOException { + return client.projects().locations().datasets().dicomStores().delete(name).execute(); + } + + @Override + public Empty uploadToDicomStore(String webPath, String filePath) + throws IOException, URISyntaxException { + byte[] dcmFile = Files.readAllBytes(Paths.get(filePath)); + ByteArrayEntity requestEntity = new ByteArrayEntity(dcmFile); + + String uri = String.format("%sv1/%s/dicomWeb/studies", client.getRootUrl(), webPath); + URIBuilder uriBuilder = + new URIBuilder(uri) + .setParameter("access_token", credentials.getAccessToken().getTokenValue()); + HttpUriRequest request = + RequestBuilder.post(uriBuilder.build()) + .setEntity(requestEntity) + .addHeader("Content-Type", "application/dicom") + .build(); + HttpResponse response = httpClient.execute(request); + return new Empty(); + } + + @Override + public DicomStore createDicomStore(String dataset, String name, @Nullable String pubsubTopic) + throws IOException { + DicomStore store = new DicomStore(); + + if (pubsubTopic != null) { + NotificationConfig notificationConfig = new NotificationConfig(); + notificationConfig.setPubsubTopic(pubsubTopic); + store.setNotificationConfig(notificationConfig); + } + + return client + .projects() + .locations() + .datasets() + .dicomStores() + .create(dataset, store) + .setDicomStoreId(name) + .execute(); + } + + private String makeRetrieveStudyMetadataRequest(String dicomStorePath, String searchQuery) + throws IOException { + CloudHealthcare.Projects.Locations.Datasets.DicomStores.Studies.RetrieveMetadata request = + this.client + .projects() + .locations() + .datasets() + .dicomStores() + .studies() + .retrieveMetadata(dicomStorePath, searchQuery); + com.google.api.client.http.HttpResponse response = request.executeUnparsed(); + + return response.parseAsString(); + } + @Override public Instant getEarliestHL7v2SendTime(String hl7v2Store, @Nullable String filter) throws IOException { @@ -545,6 +635,25 @@ public HttpBody readFhirResource(String resourceId) throws IOException { return client.projects().locations().datasets().fhirStores().fhir().read(resourceId).execute(); } + @Override + public HttpBody searchFhirResource( + String fhirStore, + String resourceType, + @Nullable Map parameters, + String pageToken) + throws IOException { + SearchResourcesRequest request = new SearchResourcesRequest().setResourceType(resourceType); + Search search = + client.projects().locations().datasets().fhirStores().fhir().search(fhirStore, request); + if (parameters != null && !parameters.isEmpty()) { + parameters.forEach(search::set); + } + if (pageToken != null && !pageToken.isEmpty()) { + search.set("_page_token", URLDecoder.decode(pageToken, "UTF-8")); + } + return search.execute(); + } + public static class AuthenticatedRetryInitializer extends RetryHttpRequestInitializer { GoogleCredentials credentials; @@ -754,4 +863,148 @@ public List next() throws NoSuchElementException { } } } + + public static class FhirResourcePages implements Iterable { + + private final String fhirStore; + private final String resourceType; + private final Map parameters; + private transient HealthcareApiClient client; + + /** + * Instantiates a new Fhir resource pages. + * + * @param client the client + * @param fhirStore the Fhir store + * @param resourceType the Fhir resource type to search for + * @param parameters the search parameters + */ + FhirResourcePages( + HealthcareApiClient client, + String fhirStore, + String resourceType, + @Nullable Map parameters) { + this.client = client; + this.fhirStore = fhirStore; + this.resourceType = resourceType; + this.parameters = parameters; + } + + /** + * Make search request. + * + * @param client the client + * @param fhirStore the Fhir store + * @param resourceType the Fhir resource type to search for + * @param parameters the search parameters + * @param pageToken the page token + * @return the search response + * @throws IOException the io exception + */ + public static HttpBody makeSearchRequest( + HealthcareApiClient client, + String fhirStore, + String resourceType, + @Nullable Map parameters, + String pageToken) + throws IOException { + return client.searchFhirResource(fhirStore, resourceType, parameters, pageToken); + } + + @Override + public Iterator iterator() { + return new FhirResourcePagesIterator( + this.client, this.fhirStore, this.resourceType, this.parameters); + } + + /** The type Fhir resource pages iterator. */ + public static class FhirResourcePagesIterator implements Iterator { + + private final String fhirStore; + private final String resourceType; + private final Map parameters; + private HealthcareApiClient client; + private String pageToken; + private boolean isFirstRequest; + private ObjectMapper mapper; + + /** + * Instantiates a new Fhir resource pages iterator. + * + * @param client the client + * @param fhirStore the Fhir store + * @param resourceType the Fhir resource type to search for + * @param parameters the search parameters + */ + FhirResourcePagesIterator( + HealthcareApiClient client, + String fhirStore, + String resourceType, + @Nullable Map parameters) { + this.client = client; + this.fhirStore = fhirStore; + this.resourceType = resourceType; + this.parameters = parameters; + this.pageToken = null; + this.isFirstRequest = true; + this.mapper = new ObjectMapper(); + } + + @Override + public boolean hasNext() throws NoSuchElementException { + if (!isFirstRequest) { + return this.pageToken != null && !this.pageToken.isEmpty(); + } + try { + HttpBody response = + makeSearchRequest(client, fhirStore, resourceType, parameters, this.pageToken); + JsonObject jsonResponse = + JsonParser.parseString(mapper.writeValueAsString(response)).getAsJsonObject(); + JsonArray resources = jsonResponse.getAsJsonArray("entry"); + return resources.size() != 0; + } catch (IOException e) { + throw new NoSuchElementException( + String.format( + "Failed to list first page of Fhir resources from %s: %s", + fhirStore, e.getMessage())); + } + } + + @Override + public JsonArray next() throws NoSuchElementException { + try { + HttpBody response = + makeSearchRequest(client, fhirStore, resourceType, parameters, this.pageToken); + this.isFirstRequest = false; + JsonObject jsonResponse = + JsonParser.parseString(mapper.writeValueAsString(response)).getAsJsonObject(); + JsonArray links = jsonResponse.getAsJsonArray("link"); + this.pageToken = parsePageToken(links); + JsonArray resources = jsonResponse.getAsJsonArray("entry"); + return resources; + } catch (IOException e) { + this.pageToken = null; + throw new NoSuchElementException( + String.format("Error listing Fhir resources from %s: %s", fhirStore, e.getMessage())); + } + } + + private static String parsePageToken(JsonArray links) throws MalformedURLException { + for (JsonElement e : links) { + JsonObject link = e.getAsJsonObject(); + if (link.get("relation").getAsString().equalsIgnoreCase("next")) { + URL url = new URL(link.get("url").getAsString()); + List parameters = Splitter.on("&").splitToList(url.getQuery()); + for (String parameter : parameters) { + List parts = Splitter.on("=").limit(2).splitToList(parameter); + if (parts.get(0).equalsIgnoreCase("_page_token")) { + return parts.get(1); + } + } + } + } + return ""; + } + } + } } diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderCSVIT.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/JsonArrayCoder.java similarity index 52% rename from sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderCSVIT.java rename to sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/JsonArrayCoder.java index 935ac833442a..6f4c2db538a2 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/meta/provider/kafka/KafkaTableProviderCSVIT.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/JsonArrayCoder.java @@ -15,28 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.beam.sdk.extensions.sql.meta.provider.kafka; +package org.apache.beam.sdk.io.gcp.healthcare; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.apache.beam.sdk.extensions.sql.impl.schema.BeamTableUtils.beamRow2CsvLine; - -import org.apache.commons.csv.CSVFormat; -import org.apache.kafka.clients.producer.ProducerRecord; +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.beam.sdk.coders.CustomCoder; +import org.apache.beam.sdk.coders.StringUtf8Coder; @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) -public class KafkaTableProviderCSVIT extends KafkaTableProviderIT { +public class JsonArrayCoder extends CustomCoder { + private static final JsonArrayCoder CODER = new JsonArrayCoder(); + private static final StringUtf8Coder STRING_CODER = StringUtf8Coder.of(); + + public static JsonArrayCoder of() { + return CODER; + } + @Override - protected ProducerRecord generateProducerRecord(int i) { - return new ProducerRecord<>( - kafkaOptions.getKafkaTopic(), - "k" + i, - beamRow2CsvLine(generateRow(i), CSVFormat.DEFAULT).getBytes(UTF_8)); + public void encode(JsonArray value, OutputStream outStream) throws IOException { + STRING_CODER.encode(value.toString(), outStream); } @Override - protected String getPayloadFormat() { - return null; + public JsonArray decode(InputStream inStream) throws IOException { + return JsonParser.parseString(STRING_CODER.decode(inStream)).getAsJsonArray(); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParser.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParser.java new file mode 100644 index 000000000000..07fa6857f208 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParser.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import java.io.IOException; + +@SuppressWarnings({"StringSplitter"}) +public class WebPathParser { + + public static class DicomWebPath { + public String studyId = ""; + public String seriesId = ""; + public String instanceId = ""; + public String dicomStorePath = ""; + public String project = ""; + public String location = ""; + public String dataset = ""; + public String storeId = ""; + } + + public DicomWebPath parseDicomWebpath(String unparsedWebpath) throws IOException { + String[] webPathSplit = unparsedWebpath.split("/dicomWeb/"); + + if (webPathSplit.length != 2) { + throw new IOException("Invalid DICOM web path"); + } + + DicomWebPath dicomWebPath = new DicomWebPath(); + + dicomWebPath.dicomStorePath = webPathSplit[0]; + String[] storePathElements = dicomWebPath.dicomStorePath.split("/"); + dicomWebPath.project = storePathElements[1]; + dicomWebPath.location = storePathElements[3]; + dicomWebPath.dataset = storePathElements[5]; + dicomWebPath.storeId = storePathElements[7]; + + String[] searchParameters; + searchParameters = webPathSplit[1].split("/"); + if (searchParameters.length < 2) { + throw new IOException("Invalid DICOM web path"); + } + dicomWebPath.studyId = searchParameters[1]; + dicomWebPath.seriesId = searchParameters[3]; + dicomWebPath.instanceId = searchParameters[5]; + + return dicomWebPath; + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/RowToPubsubMessage.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/RowToPubsubMessage.java index 4208e7fcb5bc..27a8807b36d3 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/RowToPubsubMessage.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/RowToPubsubMessage.java @@ -35,6 +35,8 @@ import org.apache.beam.sdk.values.Row; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.checkerframework.checker.nullness.qual.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A {@link PTransform} to convert {@link Row} to {@link PubsubMessage} with JSON/AVRO payload. @@ -48,6 +50,7 @@ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) class RowToPubsubMessage extends PTransform, PCollection> { + private static final Logger LOG = LoggerFactory.getLogger(RowToPubsubMessage.class); private final boolean useTimestampAttribute; private final PayloadFormat payloadFormat; private final @Nullable Schema payloadSchema; @@ -70,21 +73,36 @@ public static RowToPubsubMessage of( @Override public PCollection expand(PCollection input) { + // If a timestamp attribute is used, make sure the TIMESTAMP_FIELD is propagated to the + // element's event time. PubSubIO will populate the attribute from there. PCollection withTimestamp = useTimestampAttribute ? input.apply(WithTimestamps.of((row) -> row.getDateTime(TIMESTAMP_FIELD).toInstant())) : input; - withTimestamp = withTimestamp.apply(DropFields.fields(TIMESTAMP_FIELD)); + PCollection rows; + if (withTimestamp.getSchema().hasField(TIMESTAMP_FIELD)) { + if (!useTimestampAttribute) { + // Warn the user if they're writing data to TIMESTAMP_FIELD, but event timestamp is mapped + // to publish time. The data will be dropped. + LOG.warn( + String.format( + "Dropping output field '%s' before writing to PubSub because this is a read-only " + + "column. To preserve this information you must configure a timestamp attribute.", + TIMESTAMP_FIELD)); + } + rows = withTimestamp.apply(DropFields.fields(TIMESTAMP_FIELD)); + } else { + rows = withTimestamp; + } + switch (payloadFormat) { case JSON: - return withTimestamp - .apply("MapRowToJsonString", ToJson.of()) + return rows.apply("MapRowToJsonString", ToJson.of()) .apply("MapToJsonBytes", MapElements.via(new StringToBytes())) .apply("MapToPubsubMessage", MapElements.via(new ToPubsubMessage())); case AVRO: - return withTimestamp - .apply( + return rows.apply( "MapRowToAvroBytes", MapElements.via(AvroUtils.getRowToAvroBytesFunction(payloadSchema))) .apply("MapToPubsubMessage", MapElements.via(new ToPubsubMessage())); diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsub.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsub.java index 2c32c550886a..27071cc968db 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsub.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsub.java @@ -32,7 +32,6 @@ import com.google.cloud.pubsub.v1.TopicAdminSettings; import com.google.protobuf.ByteString; import com.google.pubsub.v1.PushConfig; -import com.google.pubsub.v1.Subscription; import java.io.IOException; import java.util.List; import java.util.concurrent.BlockingQueue; @@ -142,21 +141,23 @@ private void initializePubsub(Description description) throws IOException { pipelineOptions.getProject(), createTopicName(description, EVENTS_TOPIC_NAME)); topicAdmin.createTopic(eventsTopicPathTmp.getPath()); + // Set this after successful creation; it signals that the topic needs teardown eventsTopicPath = eventsTopicPathTmp; String subscriptionName = topicPath().getName() + "_beam_" + ThreadLocalRandom.current().nextLong(); - subscriptionPath = + SubscriptionPath subscriptionPathTmp = new SubscriptionPath( String.format( "projects/%s/subscriptions/%s", pipelineOptions.getProject(), subscriptionName)); - Subscription subscription = - subscriptionAdmin.createSubscription( - subscriptionPath.getPath(), - topicPath().getPath(), - PushConfig.getDefaultInstance(), - DEFAULT_ACK_DEADLINE_SECONDS); + subscriptionAdmin.createSubscription( + subscriptionPathTmp.getPath(), + topicPath().getPath(), + PushConfig.getDefaultInstance(), + DEFAULT_ACK_DEADLINE_SECONDS); + + subscriptionPath = subscriptionPathTmp; } private void tearDown() throws IOException { diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsubSignal.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsubSignal.java index c185914c093e..d0753cc799d2 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsubSignal.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsub/TestPubsubSignal.java @@ -17,18 +17,23 @@ */ package org.apache.beam.sdk.io.gcp.pubsub; -import static java.util.stream.Collectors.toList; import static org.apache.beam.sdk.io.gcp.pubsub.TestPubsub.createTopicName; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; -import io.grpc.Status; -import io.grpc.StatusRuntimeException; +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsub.v1.AckReplyConsumer; +import com.google.cloud.pubsub.v1.MessageReceiver; +import com.google.cloud.pubsub.v1.Subscriber; +import com.google.cloud.pubsub.v1.SubscriptionAdminClient; +import com.google.cloud.pubsub.v1.SubscriptionAdminSettings; +import com.google.cloud.pubsub.v1.TopicAdminClient; +import com.google.cloud.pubsub.v1.TopicAdminSettings; +import com.google.pubsub.v1.PushConfig; import java.io.IOException; -import java.util.List; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicReference; import org.apache.beam.sdk.coders.Coder; -import org.apache.beam.sdk.io.gcp.pubsub.PubsubClient.IncomingMessage; import org.apache.beam.sdk.io.gcp.pubsub.PubsubClient.SubscriptionPath; import org.apache.beam.sdk.io.gcp.pubsub.PubsubClient.TopicPath; import org.apache.beam.sdk.state.BagState; @@ -55,6 +60,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.DateTime; import org.joda.time.Duration; +import org.joda.time.Seconds; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -76,12 +82,16 @@ public class TestPubsubSignal implements TestRule { private static final String RESULT_SUCCESS_MESSAGE = "SUCCESS"; private static final String START_TOPIC_NAME = "start"; private static final String START_SIGNAL_MESSAGE = "START SIGNAL"; + private static final Integer DEFAULT_ACK_DEADLINE_SECONDS = 60; private static final String NO_ID_ATTRIBUTE = null; private static final String NO_TIMESTAMP_ATTRIBUTE = null; - PubsubClient pubsub; - private TestPubsubOptions pipelineOptions; + private final TestPubsubOptions pipelineOptions; + private final String pubsubEndpoint; + + private @Nullable TopicAdminClient topicAdmin = null; + private @Nullable SubscriptionAdminClient subscriptionAdmin = null; private @Nullable TopicPath resultTopicPath = null; private @Nullable TopicPath startTopicPath = null; @@ -97,6 +107,7 @@ public static TestPubsubSignal create() { private TestPubsubSignal(TestPubsubOptions pipelineOptions) { this.pipelineOptions = pipelineOptions; + this.pubsubEndpoint = PubsubOptions.targetForRootUrl(this.pipelineOptions.getPubsubRootUrl()); } @Override @@ -104,7 +115,7 @@ public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - if (TestPubsubSignal.this.pubsub != null) { + if (topicAdmin != null || subscriptionAdmin != null) { throw new AssertionError( "Pubsub client was not shutdown in previous test. " + "Topic path is'" @@ -125,9 +136,18 @@ public void evaluate() throws Throwable { } private void initializePubsub(Description description) throws IOException { - pubsub = - PubsubGrpcClient.FACTORY.newClient( - NO_TIMESTAMP_ATTRIBUTE, NO_ID_ATTRIBUTE, pipelineOptions); + topicAdmin = + TopicAdminClient.create( + TopicAdminSettings.newBuilder() + .setCredentialsProvider(pipelineOptions::getGcpCredential) + .setEndpoint(pubsubEndpoint) + .build()); + subscriptionAdmin = + SubscriptionAdminClient.create( + SubscriptionAdminSettings.newBuilder() + .setCredentialsProvider(pipelineOptions::getGcpCredential) + .setEndpoint(pubsubEndpoint) + .build()); // Example topic name: // integ-test-TestClassName-testMethodName-2018-12-11-23-32-333--result @@ -138,8 +158,8 @@ private void initializePubsub(Description description) throws IOException { PubsubClient.topicPathFromName( pipelineOptions.getProject(), createTopicName(description, START_TOPIC_NAME)); - pubsub.createTopic(resultTopicPathTmp); - pubsub.createTopic(startTopicPathTmp); + topicAdmin.createTopic(resultTopicPathTmp.getPath()); + topicAdmin.createTopic(startTopicPathTmp.getPath()); // Set these after successful creation; this signals that they need teardown resultTopicPath = resultTopicPathTmp; @@ -147,21 +167,34 @@ private void initializePubsub(Description description) throws IOException { } private void tearDown() throws IOException { - if (pubsub == null) { + if (subscriptionAdmin == null || topicAdmin == null) { return; } try { if (resultTopicPath != null) { - pubsub.deleteTopic(resultTopicPath); + for (String subscriptionPath : + topicAdmin.listTopicSubscriptions(resultTopicPath.getPath()).iterateAll()) { + subscriptionAdmin.deleteSubscription(subscriptionPath); + } + topicAdmin.deleteTopic(resultTopicPath.getPath()); } if (startTopicPath != null) { - pubsub.deleteTopic(startTopicPath); + for (String subscriptionPath : + topicAdmin.listTopicSubscriptions(startTopicPath.getPath()).iterateAll()) { + subscriptionAdmin.deleteSubscription(subscriptionPath); + } + topicAdmin.deleteTopic(startTopicPath.getPath()); } } finally { - pubsub.close(); - pubsub = null; + subscriptionAdmin.close(); + topicAdmin.close(); + + subscriptionAdmin = null; + topicAdmin = null; + resultTopicPath = null; + startTopicPath = null; } } @@ -215,8 +248,11 @@ public Supplier waitForStart(Duration duration) throws IOException { pipelineOptions.getProject(), "start-subscription-" + String.valueOf(ThreadLocalRandom.current().nextLong())); - pubsub.createSubscription( - startTopicPath, startSubscriptionPath, (int) duration.getStandardSeconds()); + subscriptionAdmin.createSubscription( + startSubscriptionPath.getPath(), + startTopicPath.getPath(), + PushConfig.getDefaultInstance(), + (int) duration.getStandardSeconds()); return Suppliers.memoize( () -> { @@ -228,8 +264,8 @@ public Supplier waitForStart(Duration duration) throws IOException { throw new RuntimeException(e); } finally { try { - pubsub.deleteSubscription(startSubscriptionPath); - } catch (IOException e) { + subscriptionAdmin.deleteSubscription(startSubscriptionPath.getPath()); + } catch (ApiException e) { LOG.error(String.format("Leaked PubSub subscription '%s'", startSubscriptionPath)); } } @@ -243,14 +279,17 @@ public void waitForSuccess(Duration duration) throws IOException { pipelineOptions.getProject(), "result-subscription-" + String.valueOf(ThreadLocalRandom.current().nextLong())); - pubsub.createSubscription( - resultTopicPath, resultSubscriptionPath, (int) duration.getStandardSeconds()); + subscriptionAdmin.createSubscription( + resultSubscriptionPath.getPath(), + resultTopicPath.getPath(), + PushConfig.getDefaultInstance(), + (int) duration.getStandardSeconds()); String result = pollForResultForDuration(resultSubscriptionPath, duration); try { - pubsub.deleteSubscription(resultSubscriptionPath); - } catch (IOException e) { + subscriptionAdmin.deleteSubscription(resultSubscriptionPath.getPath()); + } catch (ApiException e) { LOG.error(String.format("Leaked PubSub subscription '%s'", resultSubscriptionPath)); } @@ -260,39 +299,50 @@ public void waitForSuccess(Duration duration) throws IOException { } private String pollForResultForDuration( - SubscriptionPath signalSubscriptionPath, Duration duration) throws IOException { + SubscriptionPath signalSubscriptionPath, Duration timeoutDuration) throws IOException { - List signal = null; - DateTime endPolling = DateTime.now().plus(duration.getMillis()); + AtomicReference result = new AtomicReference<>(null); - do { + MessageReceiver receiver = + (com.google.pubsub.v1.PubsubMessage message, AckReplyConsumer replyConsumer) -> { + // Ignore empty messages + if (message.getData().isEmpty()) { + replyConsumer.ack(); + } + if (result.compareAndSet(null, message.getData().toStringUtf8())) { + replyConsumer.ack(); + } else { + replyConsumer.nack(); + } + }; + + Subscriber subscriber = + Subscriber.newBuilder(signalSubscriptionPath.getPath(), receiver) + .setCredentialsProvider(pipelineOptions::getGcpCredential) + .setEndpoint(pubsubEndpoint) + .build(); + subscriber.startAsync(); + + DateTime startTime = new DateTime(); + int timeoutSeconds = timeoutDuration.toStandardSeconds().getSeconds(); + while (result.get() == null + && Seconds.secondsBetween(startTime, new DateTime()).getSeconds() < timeoutSeconds) { try { - signal = pubsub.pull(DateTime.now().getMillis(), signalSubscriptionPath, 1, false); - if (signal.isEmpty()) { - continue; - } - pubsub.acknowledge( - signalSubscriptionPath, signal.stream().map(IncomingMessage::ackId).collect(toList())); - break; - } catch (StatusRuntimeException e) { - if (!Status.DEADLINE_EXCEEDED.equals(e.getStatus())) { - LOG.warn( - "(Will retry) Error while polling {} for signal: {}", - signalSubscriptionPath, - e.getStatus()); - } - sleep(500); + Thread.sleep(1000); + } catch (InterruptedException ignored) { } - } while (DateTime.now().isBefore(endPolling)); + } + + subscriber.stopAsync(); + subscriber.awaitTerminated(); - if (signal == null || signal.isEmpty()) { + if (result.get() == null) { throw new AssertionError( String.format( "Did not receive signal on %s in %ss", - signalSubscriptionPath, duration.getStandardSeconds())); + signalSubscriptionPath, timeoutDuration.getStandardSeconds())); } - - return signal.get(0).message().getData().toStringUtf8(); + return result.get(); } private void sleep(long t) { diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/CloudPubsubChecks.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/CloudPubsubChecks.java index 68c42ecf0b77..6dc15166666a 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/CloudPubsubChecks.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/CloudPubsubChecks.java @@ -21,11 +21,10 @@ import com.google.cloud.pubsublite.Message; import com.google.cloud.pubsublite.proto.PubSubMessage; -import io.grpc.StatusException; -import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.MapElements; import org.apache.beam.sdk.transforms.PTransform; -import org.apache.beam.sdk.transforms.ParDo; import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; /** * A class providing a conversion validity check between Cloud Pub/Sub and Pub/Sub Lite message @@ -42,15 +41,11 @@ private CloudPubsubChecks() {} */ public static PTransform, PCollection> ensureUsableAsCloudPubsub() { - return ParDo.of( - new DoFn() { - @ProcessElement - public void processElement( - @Element PubSubMessage message, OutputReceiver output) - throws StatusException { - Object unused = toCpsPublishTransformer().transform(Message.fromProto(message)); - output.output(message); - } - }); + return MapElements.into(TypeDescriptor.of(PubSubMessage.class)) + .via( + message -> { + Object unused = toCpsPublishTransformer().transform(Message.fromProto(message)); + return message; + }); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetFinalizer.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReader.java similarity index 77% rename from sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetFinalizer.java rename to sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReader.java index 730d2c5b6f65..0cbafaf369b9 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetFinalizer.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReader.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; +import com.google.api.gax.rpc.ApiException; import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import io.grpc.StatusException; -import java.util.Map; -/** An internal interface for finalizing offsets. */ -interface OffsetFinalizer { - void finalizeOffsets(Map offsets) throws StatusException; +interface InitialOffsetReader extends AutoCloseable { + Offset read() throws ApiException; + + @Override + void close(); } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReaderImpl.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReaderImpl.java new file mode 100644 index 000000000000..c97c7aa1f32d --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/InitialOffsetReaderImpl.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical; + +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.SubscriptionPath; +import com.google.cloud.pubsublite.internal.CursorClient; +import java.util.Map; + +class InitialOffsetReaderImpl implements InitialOffsetReader { + private final CursorClient client; + private final SubscriptionPath subscription; + private final Partition partition; + + InitialOffsetReaderImpl(CursorClient client, SubscriptionPath subscription, Partition partition) { + this.client = client; + this.subscription = subscription; + this.partition = partition; + } + + @Override + public Offset read() throws ApiException { + try { + Map results = client.listPartitionCursors(subscription).get(); + return results.getOrDefault(partition, Offset.of(0)); + } catch (Throwable t) { + throw toCanonical(t).underlying; + } + } + + @Override + public void close() { + client.close(); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/LimitingTopicBacklogReader.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/LimitingTopicBacklogReader.java new file mode 100644 index 000000000000..1e10496eed5b --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/LimitingTopicBacklogReader.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; +import com.google.errorprone.annotations.concurrent.GuardedBy; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Ticker; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.CacheBuilder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.CacheLoader; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.LoadingCache; + +final class LimitingTopicBacklogReader implements TopicBacklogReader { + private final TopicBacklogReader underlying; + private final LoadingCache backlogCache; + + @GuardedBy("this") + @Nullable + private Offset currentRequestOffset = null; + + @SuppressWarnings("method.invocation.invalid") + LimitingTopicBacklogReader(TopicBacklogReader underlying, Ticker ticker) { + this.underlying = underlying; + backlogCache = + CacheBuilder.newBuilder() + .ticker(ticker) + .maximumSize(1) + .expireAfterWrite(1, TimeUnit.MINUTES) + .refreshAfterWrite(10, TimeUnit.SECONDS) + .build( + new CacheLoader() { + @Override + public ComputeMessageStatsResponse load(String val) { + return loadFromUnderlying(); + } + }); + } + + @SuppressWarnings("argument.type.incompatible") + private synchronized ComputeMessageStatsResponse loadFromUnderlying() { + return underlying.computeMessageStats(checkNotNull(currentRequestOffset)); + } + + @Override + public synchronized ComputeMessageStatsResponse computeMessageStats(Offset offset) + throws ApiException { + currentRequestOffset = offset; + try { + // There is only a single entry in the cache. + return backlogCache.get("cache"); + } catch (Throwable t) { + throw toCanonical(t).underlying; + } + } + + @Override + public void close() { + underlying.close(); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteProgress.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteProgress.java new file mode 100644 index 000000000000..2572909a1e91 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteProgress.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.auto.value.AutoValue; +import com.google.cloud.pubsublite.Offset; + +/** A representation of progress through a Pub/Sub lite partition. */ +@AutoValue +abstract class OffsetByteProgress { + static OffsetByteProgress of(Offset lastOffset, long batchBytes) { + return new AutoValue_OffsetByteProgress(lastOffset, batchBytes); + } + /** The last offset of the messages received. */ + abstract Offset lastOffset(); + + abstract long batchBytes(); +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTracker.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTracker.java new file mode 100644 index 000000000000..608af8fea189 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTracker.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; + +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker.HasProgress; +import org.apache.beam.sdk.transforms.splittabledofn.SplitResult; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Stopwatch; +import org.joda.time.Duration; + +/** + * OffsetByteRangeTracker is an unbounded restriction tracker for Pub/Sub lite partitions that + * tracks offsets for checkpointing and bytes for progress. + * + *

    Any valid instance of an OffsetByteRangeTracker tracks one of exactly two types of ranges: - + * Unbounded ranges whose last offset is Long.MAX_VALUE - Completed ranges that are either empty + * (From == To) or fully claimed (lastClaimed == To - 1) + * + *

    Also prevents splitting until minTrackingTime has passed or minBytesReceived have been + * received. IMPORTANT: minTrackingTime must be strictly smaller than the SDF read timeout when it + * would return ProcessContinuation.resume(). + */ +class OffsetByteRangeTracker extends RestrictionTracker + implements HasProgress { + private final TopicBacklogReader backlogReader; + private final Duration minTrackingTime; + private final long minBytesReceived; + private final Stopwatch stopwatch; + private OffsetRange range; + private @Nullable Long lastClaimed; + private long byteCount = 0; + + public OffsetByteRangeTracker( + OffsetRange range, + TopicBacklogReader backlogReader, + Stopwatch stopwatch, + Duration minTrackingTime, + long minBytesReceived) { + checkArgument(range.getTo() == Long.MAX_VALUE); + this.backlogReader = backlogReader; + this.minTrackingTime = minTrackingTime; + this.minBytesReceived = minBytesReceived; + this.stopwatch = stopwatch.reset().start(); + this.range = range; + } + + @Override + public void finalize() { + this.backlogReader.close(); + } + + @Override + public IsBounded isBounded() { + return IsBounded.UNBOUNDED; + } + + @Override + public boolean tryClaim(OffsetByteProgress position) { + long toClaim = position.lastOffset().value(); + checkArgument( + lastClaimed == null || toClaim > lastClaimed, + "Trying to claim offset %s while last attempted was %s", + position.lastOffset().value(), + lastClaimed); + checkArgument( + toClaim >= range.getFrom(), + "Trying to claim offset %s before start of the range %s", + toClaim, + range); + // split() has already been called, truncating this range. No more offsets may be claimed. + if (range.getTo() != Long.MAX_VALUE) { + boolean isRangeEmpty = range.getTo() == range.getFrom(); + boolean isValidClosedRange = nextOffset() == range.getTo(); + checkState( + isRangeEmpty || isValidClosedRange, + "Violated class precondition: offset range improperly split. Please report a beam bug."); + return false; + } + lastClaimed = toClaim; + byteCount += position.batchBytes(); + return true; + } + + @Override + public OffsetRange currentRestriction() { + return range; + } + + private long nextOffset() { + checkState(lastClaimed == null || lastClaimed < Long.MAX_VALUE); + return lastClaimed == null ? currentRestriction().getFrom() : lastClaimed + 1; + } + + /** + * Whether the tracker has received enough data/been running for enough time that it can + * checkpoint and be confident it can get sufficient throughput. + */ + private boolean receivedEnough() { + Duration duration = Duration.millis(stopwatch.elapsed(TimeUnit.MILLISECONDS)); + if (duration.isLongerThan(minTrackingTime)) { + return true; + } + if (byteCount >= minBytesReceived) { + return true; + } + return false; + } + + @Override + public @Nullable SplitResult trySplit(double fractionOfRemainder) { + // Cannot split a bounded range. This should already be completely claimed. + if (range.getTo() != Long.MAX_VALUE) { + return null; + } + if (!receivedEnough()) { + return null; + } + range = new OffsetRange(currentRestriction().getFrom(), nextOffset()); + return SplitResult.of(this.range, new OffsetRange(nextOffset(), Long.MAX_VALUE)); + } + + @Override + @SuppressWarnings("unboxing.of.nullable") + public void checkDone() throws IllegalStateException { + if (range.getFrom() == range.getTo()) { + return; + } + checkState( + lastClaimed != null, + "Last attempted offset should not be null. No work was claimed in non-empty range %s.", + range); + long lastClaimedNotNull = checkNotNull(lastClaimed); + checkState( + lastClaimedNotNull >= range.getTo() - 1, + "Last attempted offset was %s in range %s, claiming work in [%s, %s) was not attempted", + lastClaimedNotNull, + range, + lastClaimedNotNull + 1, + range.getTo()); + } + + @Override + public Progress getProgress() { + ComputeMessageStatsResponse stats = + this.backlogReader.computeMessageStats(Offset.of(nextOffset())); + return Progress.from(byteCount, stats.getMessageBytes()); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMark.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMark.java deleted file mode 100644 index f64f55f42576..000000000000 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMark.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import io.grpc.StatusException; -import java.io.IOException; -import java.util.Map; -import java.util.Optional; -import org.apache.beam.sdk.coders.BigEndianLongCoder; -import org.apache.beam.sdk.coders.Coder; -import org.apache.beam.sdk.coders.DelegateCoder; -import org.apache.beam.sdk.coders.MapCoder; -import org.apache.beam.sdk.io.UnboundedSource.CheckpointMark; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; - -/** A CheckpointMark holding a map from partition numbers to the checkpointed offset. */ -class OffsetCheckpointMark implements CheckpointMark { - private final Optional finalizer; - final Map partitionOffsetMap; - - OffsetCheckpointMark(OffsetFinalizer finalizer, Map partitionOffsetMap) { - this.finalizer = Optional.of(finalizer); - this.partitionOffsetMap = partitionOffsetMap; - } - - private OffsetCheckpointMark(Map encodedMap) { - ImmutableMap.Builder builder = ImmutableMap.builder(); - try { - for (Map.Entry entry : encodedMap.entrySet()) { - builder.put(Partition.of(entry.getKey()), Offset.of(entry.getValue())); - } - } catch (StatusException e) { - throw e.getStatus().asRuntimeException(); - } - finalizer = Optional.empty(); - partitionOffsetMap = builder.build(); - } - - @Override - public void finalizeCheckpoint() throws IOException { - if (!finalizer.isPresent()) { - return; - } - try { - finalizer.get().finalizeOffsets(partitionOffsetMap); - } catch (StatusException e) { - throw new IOException(e); - } - } - - static Coder getCoder() { - return DelegateCoder.of( - MapCoder.of(BigEndianLongCoder.of(), BigEndianLongCoder.of()), - (OffsetCheckpointMark mark) -> { - ImmutableMap.Builder builder = ImmutableMap.builder(); - mark.partitionOffsetMap.forEach((key, value) -> builder.put(key.value(), value.value())); - return builder.build(); - }, - OffsetCheckpointMark::new); - } -} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdf.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdf.java new file mode 100644 index 000000000000..c9e1e699820a --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdf.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.internal.wire.Committer; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.DoFn; +import org.apache.beam.sdk.transforms.SerializableBiFunction; +import org.apache.beam.sdk.transforms.SerializableFunction; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.apache.beam.sdk.transforms.splittabledofn.WatermarkEstimators.MonotonicallyIncreasing; +import org.joda.time.Duration; +import org.joda.time.Instant; + +class PerSubscriptionPartitionSdf extends DoFn { + private final Duration maxSleepTime; + private final SubscriptionPartitionProcessorFactory processorFactory; + private final SerializableFunction + offsetReaderFactory; + private final SerializableBiFunction< + SubscriptionPartition, OffsetRange, RestrictionTracker> + trackerFactory; + private final SerializableFunction committerFactory; + + PerSubscriptionPartitionSdf( + Duration maxSleepTime, + SerializableFunction offsetReaderFactory, + SerializableBiFunction< + SubscriptionPartition, + OffsetRange, + RestrictionTracker> + trackerFactory, + SubscriptionPartitionProcessorFactory processorFactory, + SerializableFunction committerFactory) { + this.maxSleepTime = maxSleepTime; + this.processorFactory = processorFactory; + this.offsetReaderFactory = offsetReaderFactory; + this.trackerFactory = trackerFactory; + this.committerFactory = committerFactory; + } + + @GetInitialWatermarkEstimatorState + public Instant getInitialWatermarkState() { + return Instant.EPOCH; + } + + @NewWatermarkEstimator + public MonotonicallyIncreasing newWatermarkEstimator(@WatermarkEstimatorState Instant state) { + return new MonotonicallyIncreasing(state); + } + + @ProcessElement + public ProcessContinuation processElement( + RestrictionTracker tracker, + @Element SubscriptionPartition subscriptionPartition, + OutputReceiver receiver, + BundleFinalizer finalizer) + throws Exception { + try (SubscriptionPartitionProcessor processor = + processorFactory.newProcessor(subscriptionPartition, tracker, receiver)) { + processor.start(); + ProcessContinuation result = processor.waitForCompletion(maxSleepTime); + processor + .lastClaimed() + .ifPresent( + lastClaimedOffset -> + finalizer.afterBundleCommit( + Instant.ofEpochMilli(Long.MAX_VALUE), + () -> { + Committer committer = committerFactory.apply(subscriptionPartition); + committer.startAsync().awaitRunning(); + // Commit the next-to-deliver offset. + committer.commitOffset(Offset.of(lastClaimedOffset.value() + 1)).get(); + committer.stopAsync().awaitTerminated(); + })); + return result; + } + } + + @GetInitialRestriction + public OffsetRange getInitialRestriction(@Element SubscriptionPartition subscriptionPartition) { + try (InitialOffsetReader reader = offsetReaderFactory.apply(subscriptionPartition)) { + Offset offset = reader.read(); + return new OffsetRange(offset.value(), Long.MAX_VALUE /* open interval */); + } + } + + @NewTracker + public RestrictionTracker newTracker( + @Element SubscriptionPartition subscriptionPartition, @Restriction OffsetRange range) { + return trackerFactory.apply(subscriptionPartition, range); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherCache.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherCache.java index 703101c6e8dd..205336542742 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherCache.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherCache.java @@ -17,15 +17,15 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; -import static com.google.cloud.pubsublite.internal.Preconditions.checkArgument; +import static com.google.cloud.pubsublite.internal.UncheckedApiPreconditions.checkArgument; import com.google.api.core.ApiService.Listener; import com.google.api.core.ApiService.State; +import com.google.api.gax.rpc.ApiException; import com.google.cloud.pubsublite.PublishMetadata; import com.google.cloud.pubsublite.internal.CloseableMonitor; import com.google.cloud.pubsublite.internal.Publisher; import com.google.errorprone.annotations.concurrent.GuardedBy; -import io.grpc.StatusException; import java.util.HashMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -41,14 +41,14 @@ class PublisherCache { private final HashMap> livePublishers = new HashMap<>(); - Publisher get(PublisherOptions options) throws StatusException { + Publisher get(PublisherOptions options) throws ApiException { checkArgument(options.usesCache()); try (CloseableMonitor.Hold h = monitor.enter()) { Publisher publisher = livePublishers.get(options); if (publisher != null) { return publisher; } - publisher = options.getPublisher(); + publisher = Publishers.newPublisher(options); livePublishers.put(options, publisher); publisher.addListener( new Listener() { @@ -60,7 +60,7 @@ public void failed(State s, Throwable t) { } }, listenerExecutor); - publisher.startAsync(); + publisher.startAsync().awaitRunning(); return publisher; } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOptions.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOptions.java index 3db830c889f7..99d6d02ba29d 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOptions.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOptions.java @@ -18,35 +18,26 @@ package org.apache.beam.sdk.io.gcp.pubsublite; import com.google.auto.value.AutoValue; -import com.google.cloud.pubsublite.PublishMetadata; import com.google.cloud.pubsublite.TopicPath; -import com.google.cloud.pubsublite.internal.Publisher; -import com.google.cloud.pubsublite.internal.wire.PubsubContext; -import com.google.cloud.pubsublite.internal.wire.PubsubContext.Framework; -import com.google.cloud.pubsublite.internal.wire.RoutingPublisherBuilder; -import com.google.cloud.pubsublite.internal.wire.SinglePartitionPublisherBuilder; -import com.google.cloud.pubsublite.proto.PublisherServiceGrpc.PublisherServiceStub; -import io.grpc.StatusException; import java.io.Serializable; -import java.util.Optional; import org.checkerframework.checker.nullness.qual.Nullable; /** Options needed for a Pub/Sub Lite Publisher. */ @AutoValue -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) public abstract class PublisherOptions implements Serializable { private static final long serialVersionUID = 275311613L; - private static final Framework FRAMEWORK = Framework.of("BEAM"); - // Required parameters. public abstract TopicPath topicPath(); // Optional parameters. - /** A supplier for the stub to be used. If enabled, does not use the publisher cache. */ - public abstract @Nullable SerializableSupplier stubSupplier(); + /** + * A supplier for the publisher to be used. If enabled, does not use the publisher cache. + * + *

    The returned type must be convertible to Publisher, but Object is used to + * prevent adding an api surface dependency on guava when this is not used. + */ + public abstract @Nullable SerializableSupplier publisherSupplier(); @Override public abstract int hashCode(); @@ -56,20 +47,7 @@ public static Builder newBuilder() { } public boolean usesCache() { - return stubSupplier() == null; - } - - @SuppressWarnings("CheckReturnValue") - Publisher getPublisher() throws StatusException { - SinglePartitionPublisherBuilder.Builder singlePartitionPublisherBuilder = - SinglePartitionPublisherBuilder.newBuilder().setContext(PubsubContext.of(FRAMEWORK)); - if (stubSupplier() != null) { - singlePartitionPublisherBuilder.setStub(Optional.of(stubSupplier().get())); - } - return RoutingPublisherBuilder.newBuilder() - .setTopic(topicPath()) - .setPublisherBuilder(singlePartitionPublisherBuilder) - .build(); + return publisherSupplier() == null; } @AutoValue.Builder @@ -78,8 +56,13 @@ public abstract static class Builder { public abstract Builder setTopicPath(TopicPath path); // Optional parameters. - public abstract Builder setStubSupplier( - SerializableSupplier stubSupplier); + /** + * A supplier for the publisher to be used. If enabled, does not use the publisher cache. + * + *

    The returned type must be convertible to Publisher, but Object is used to + * prevent adding an api surface dependency on guava when this is not used. + */ + public abstract Builder setPublisherSupplier(SerializableSupplier stubSupplier); public abstract PublisherOptions build(); } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOrError.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOrError.java index c1234ea6b9be..111b84bf8e1a 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOrError.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PublisherOrError.java @@ -19,8 +19,8 @@ import com.google.auto.value.AutoOneOf; import com.google.cloud.pubsublite.PublishMetadata; +import com.google.cloud.pubsublite.internal.CheckedApiException; import com.google.cloud.pubsublite.internal.Publisher; -import io.grpc.StatusException; /** A helper representing either a Publisher or an error. */ @AutoOneOf(PublisherOrError.Kind.class) @@ -37,13 +37,13 @@ enum Kind { abstract Publisher publisher(); - abstract StatusException error(); + abstract CheckedApiException error(); static PublisherOrError ofPublisher(Publisher p) { return AutoOneOf_PublisherOrError.publisher(p); } - static PublisherOrError ofError(StatusException e) { + static PublisherOrError ofError(CheckedApiException e) { return AutoOneOf_PublisherOrError.error(e); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/Publishers.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/Publishers.java new file mode 100644 index 000000000000..c44c3df2edfb --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/Publishers.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.UncheckedApiPreconditions.checkArgument; + +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsublite.PublishMetadata; +import com.google.cloud.pubsublite.internal.Publisher; +import com.google.cloud.pubsublite.internal.wire.PubsubContext; +import com.google.cloud.pubsublite.internal.wire.PubsubContext.Framework; +import com.google.cloud.pubsublite.internal.wire.RoutingPublisherBuilder; +import com.google.cloud.pubsublite.internal.wire.SinglePartitionPublisherBuilder; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.reflect.TypeToken; + +class Publishers { + private static final Framework FRAMEWORK = Framework.of("BEAM"); + + private Publishers() {} + + @SuppressWarnings("unchecked") + static Publisher newPublisher(PublisherOptions options) throws ApiException { + SerializableSupplier supplier = options.publisherSupplier(); + if (supplier != null) { + Object supplied = supplier.get(); + TypeToken> token = new TypeToken>() {}; + checkArgument(token.isSupertypeOf(supplied.getClass())); + return (Publisher) supplied; + } + return RoutingPublisherBuilder.newBuilder() + .setTopic(options.topicPath()) + .setPublisherFactory( + partition -> + SinglePartitionPublisherBuilder.newBuilder() + .setTopic(options.topicPath()) + .setPartition(partition) + .setContext(PubsubContext.of(FRAMEWORK)) + .build()) + .build(); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteIO.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteIO.java index b52a54d5e10f..ca1f2be41699 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteIO.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteIO.java @@ -20,9 +20,9 @@ import com.google.cloud.pubsublite.proto.PubSubMessage; import com.google.cloud.pubsublite.proto.SequencedMessage; import org.apache.beam.sdk.annotations.Experimental; -import org.apache.beam.sdk.io.Read; import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.values.PBegin; import org.apache.beam.sdk.values.PCollection; import org.apache.beam.sdk.values.PDone; @@ -51,21 +51,13 @@ private PubsubLiteIO() {} * .setName(subscriptionName) * .build(); * - * FlowControlSettings flowControlSettings = - * FlowControlSettings.builder() - * // Set outstanding bytes to 10 MiB per partition. - * .setBytesOutstanding(10 * 1024 * 1024L) - * .setMessagesOutstanding(Long.MAX_VALUE) - * .build(); - * * PCollection messages = p.apply(PubsubLiteIO.read(SubscriberOptions.newBuilder() * .setSubscriptionPath(subscriptionPath) - * .setFlowControlSettings(flowControlSettings) * .build()), "read"); * } */ - public static Read.Unbounded read(SubscriberOptions options) { - return Read.from(new PubsubLiteUnboundedSource(options)); + public static PTransform> read(SubscriberOptions options) { + return new SubscribeTransform(options); } /** diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSink.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSink.java index 27ffd0343abc..1d0a6db671af 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSink.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSink.java @@ -22,14 +22,14 @@ import com.google.api.core.ApiFutures; import com.google.api.core.ApiService.Listener; import com.google.api.core.ApiService.State; +import com.google.api.gax.rpc.ApiException; import com.google.cloud.pubsublite.Message; import com.google.cloud.pubsublite.PublishMetadata; +import com.google.cloud.pubsublite.internal.CheckedApiException; import com.google.cloud.pubsublite.internal.ExtractStatus; import com.google.cloud.pubsublite.internal.Publisher; import com.google.cloud.pubsublite.proto.PubSubMessage; import com.google.errorprone.annotations.concurrent.GuardedBy; -import io.grpc.StatusException; -import java.io.IOException; import java.util.ArrayDeque; import java.util.Deque; import java.util.concurrent.Executor; @@ -54,7 +54,7 @@ class PubsubLiteSink extends DoFn { private transient int outstanding; @GuardedBy("this") - private transient Deque errorsSinceLastFinish; + private transient Deque errorsSinceLastFinish; private static final Executor executor = Executors.newCachedThreadPool(); @@ -63,12 +63,12 @@ class PubsubLiteSink extends DoFn { } @Setup - public void setup() throws StatusException { + public void setup() throws ApiException { Publisher publisher; if (options.usesCache()) { publisher = PerServerPublisherCache.PUBLISHER_CACHE.get(options); } else { - publisher = options.getPublisher(); + publisher = Publishers.newPublisher(options); } synchronized (this) { outstanding = 0; @@ -101,7 +101,8 @@ private synchronized void decrementOutstanding() { } @ProcessElement - public synchronized void processElement(@Element PubSubMessage message) throws StatusException { + public synchronized void processElement(@Element PubSubMessage message) + throws CheckedApiException { ++outstanding; if (publisherOrError.getKind() == Kind.ERROR) { throw publisherOrError.error(); @@ -134,13 +135,12 @@ public void onFailure(Throwable t) { // Intentionally don't flush on bundle finish to allow multi-sink client reuse. @FinishBundle - public synchronized void finishBundle() - throws StatusException, IOException, InterruptedException { + public synchronized void finishBundle() throws CheckedApiException, InterruptedException { while (outstanding > 0) { wait(); } if (!errorsSinceLastFinish.isEmpty()) { - StatusException canonical = errorsSinceLastFinish.pop(); + CheckedApiException canonical = errorsSinceLastFinish.pop(); while (!errorsSinceLastFinish.isEmpty()) { canonical.addSuppressed(errorsSinceLastFinish.pop()); } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReader.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReader.java deleted file mode 100644 index 62a5448b58b2..000000000000 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReader.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import com.google.api.core.ApiFuture; -import com.google.auto.value.AutoValue; -import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import com.google.cloud.pubsublite.internal.CloseableMonitor; -import com.google.cloud.pubsublite.internal.ExtractStatus; -import com.google.cloud.pubsublite.internal.ProxyService; -import com.google.cloud.pubsublite.internal.PullSubscriber; -import com.google.cloud.pubsublite.internal.wire.Committer; -import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; -import com.google.cloud.pubsublite.proto.SequencedMessage; -import com.google.errorprone.annotations.concurrent.GuardedBy; -import com.google.protobuf.Timestamp; -import com.google.protobuf.util.Timestamps; -import io.grpc.Status; -import io.grpc.StatusException; -import java.io.IOException; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.Queue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import org.apache.beam.sdk.io.UnboundedSource; -import org.apache.beam.sdk.io.UnboundedSource.CheckpointMark; -import org.apache.beam.sdk.io.UnboundedSource.UnboundedReader; -import org.apache.beam.sdk.transforms.windowing.BoundedWindow; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Ticker; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.CacheBuilder; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.CacheLoader; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.cache.LoadingCache; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; -import org.joda.time.Instant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** A reader for Pub/Sub Lite that generates a stream of SequencedMessages. */ -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) -class PubsubLiteUnboundedReader extends UnboundedReader - implements OffsetFinalizer { - private static final Logger LOG = LoggerFactory.getLogger(PubsubLiteUnboundedReader.class); - private final UnboundedSource source; - private final TopicBacklogReader backlogReader; - private final LoadingCache backlogCache; - private final CloseableMonitor monitor = new CloseableMonitor(); - - @GuardedBy("monitor.monitor") - private final ImmutableMap subscriberMap; - - private final CommitterProxy committerProxy; - - @GuardedBy("monitor.monitor") - private final Queue messages = new ArrayDeque<>(); - - @GuardedBy("monitor.monitor") - private Optional permanentError = Optional.empty(); - - private static class CommitterProxy extends ProxyService { - private final Consumer permanentErrorSetter; - - CommitterProxy( - Collection states, Consumer permanentErrorSetter) - throws StatusException { - this.permanentErrorSetter = permanentErrorSetter; - addServices(states.stream().map(state -> state.committer).collect(Collectors.toList())); - } - - @Override - protected void start() {} - - @Override - protected void stop() {} - - @Override - protected void handlePermanentError(StatusException error) { - permanentErrorSetter.accept(error); - } - } - - public PubsubLiteUnboundedReader( - UnboundedSource source, - Map subscriberMap, - TopicBacklogReader backlogReader) - throws StatusException { - this(source, subscriberMap, backlogReader, Ticker.systemTicker()); - } - - PubsubLiteUnboundedReader( - UnboundedSource source, - Map subscriberMap, - TopicBacklogReader backlogReader, - Ticker ticker) - throws StatusException { - this.source = source; - this.subscriberMap = ImmutableMap.copyOf(subscriberMap); - this.committerProxy = - new CommitterProxy( - subscriberMap.values(), - error -> { - try (CloseableMonitor.Hold h = monitor.enter()) { - permanentError = Optional.of(permanentError.orElse(error)); - } - }); - this.backlogReader = backlogReader; - this.backlogCache = - CacheBuilder.newBuilder() - .ticker(ticker) - .maximumSize(1) - .expireAfterWrite(1, TimeUnit.MINUTES) - .refreshAfterWrite(10, TimeUnit.SECONDS) - .build( - new CacheLoader() { - @Override - public Long load(Object val) throws InterruptedException, ExecutionException { - return computeSplitBacklog().get().getMessageBytes(); - } - }); - this.committerProxy.startAsync().awaitRunning(); - } - - private ApiFuture computeSplitBacklog() { - ImmutableMap.Builder builder = ImmutableMap.builder(); - try (CloseableMonitor.Hold h = monitor.enter()) { - subscriberMap.forEach( - (partition, subscriberState) -> - subscriberState.lastDelivered.ifPresent(offset -> builder.put(partition, offset))); - } - return backlogReader.computeMessageStats(builder.build()); - } - - @Override - public void finalizeOffsets(Map offsets) throws StatusException { - List> commitFutures = new ArrayList<>(); - try (CloseableMonitor.Hold h = monitor.enter()) { - for (Partition partition : offsets.keySet()) { - if (!subscriberMap.containsKey(partition)) { - throw Status.INVALID_ARGUMENT - .withDescription( - String.format( - "Asked to finalize an offset for partition %s which was not managed by this" - + " reader.", - partition)) - .asException(); - } - commitFutures.add( - subscriberMap.get(partition).committer.commitOffset(offsets.get(partition))); - } - } - // Add outside of monitor in case they are finished inline. - commitFutures.forEach( - commitFuture -> - ExtractStatus.addFailureHandler( - commitFuture, - error -> { - try (CloseableMonitor.Hold h = monitor.enter()) { - if (!permanentError.isPresent()) { - permanentError = Optional.of(error); - } - } - })); - } - - static class SubscriberState { - Instant lastDeliveredPublishTimestamp = BoundedWindow.TIMESTAMP_MIN_VALUE; - Optional lastDelivered = Optional.empty(); - PullSubscriber subscriber; - Committer committer; - } - - @AutoValue - abstract static class PartitionedSequencedMessage { - abstract Partition partition(); - - abstract SequencedMessage sequencedMessage(); - - private static PartitionedSequencedMessage of( - Partition partition, SequencedMessage sequencedMessage) { - return new AutoValue_PubsubLiteUnboundedReader_PartitionedSequencedMessage( - partition, sequencedMessage); - } - } - - @Override - public boolean start() throws IOException { - return advance(); - } - - @Override - public boolean advance() throws IOException { - try (CloseableMonitor.Hold h = monitor.enter()) { - if (permanentError.isPresent()) { - throw permanentError.get(); - } - // messages starts empty. This will not remove messages on the first iteration. - if (!messages.isEmpty()) { - PartitionedSequencedMessage unusedMessage = messages.poll(); - } - // Intentionally do this twice: We don't bound the buffer in this class, so we want to flush - // the last pull from the subscribers before pulling new messages. - if (!messages.isEmpty()) { - setLastDelivered(messages.peek()); - return true; - } - pullFromSubscribers(); - if (!messages.isEmpty()) { - setLastDelivered(messages.peek()); - return true; - } - return false; - } catch (StatusException e) { - throw new IOException(e); - } - } - - @GuardedBy("monitor.monitor") - private void setLastDelivered(PartitionedSequencedMessage message) { - SubscriberState state = subscriberMap.get(message.partition()); - state.lastDelivered = - Optional.of(Offset.of(message.sequencedMessage().getCursor().getOffset())); - Timestamp timestamp = message.sequencedMessage().getPublishTime(); - state.lastDeliveredPublishTimestamp = new Instant(Timestamps.toMillis(timestamp)); - } - - @GuardedBy("monitor.monitor") - private void pullFromSubscribers() throws StatusException { - for (Map.Entry entry : subscriberMap.entrySet()) { - for (SequencedMessage message : entry.getValue().subscriber.pull()) { - messages.add(PartitionedSequencedMessage.of(entry.getKey(), message)); - } - } - } - - @Override - public SequencedMessage getCurrent() throws NoSuchElementException { - try (CloseableMonitor.Hold h = monitor.enter()) { - if (messages.isEmpty()) { - throw new NoSuchElementException(); - } - return messages.peek().sequencedMessage(); - } - } - - @Override - public Instant getCurrentTimestamp() throws NoSuchElementException { - try (CloseableMonitor.Hold h = monitor.enter()) { - if (messages.isEmpty()) { - throw new NoSuchElementException(); - } - return new Instant(Timestamps.toMillis(messages.peek().sequencedMessage().getPublishTime())); - } - } - - @Override - public void close() { - try (CloseableMonitor.Hold h = monitor.enter()) { - for (SubscriberState state : subscriberMap.values()) { - try { - state.subscriber.close(); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - } - committerProxy.stopAsync().awaitTerminated(); - } - - @Override - public Instant getWatermark() { - try (CloseableMonitor.Hold h = monitor.enter()) { - return subscriberMap.values().stream() - .map(state -> state.lastDeliveredPublishTimestamp) - .min(Instant::compareTo) - .get(); - } - } - - @Override - public CheckpointMark getCheckpointMark() { - try (CloseableMonitor.Hold h = monitor.enter()) { - ImmutableMap.Builder builder = ImmutableMap.builder(); - subscriberMap.forEach( - (partition, subscriberState) -> - subscriberState.lastDelivered.ifPresent(offset -> builder.put(partition, offset))); - return new OffsetCheckpointMark(this, builder.build()); - } - } - - @Override - public long getSplitBacklogBytes() { - try { - // We use the cache because it allows us to coalesce request, periodically refresh the value - // and expire the value after a maximum staleness, but there is only ever one key. - return backlogCache.get("Backlog"); - } catch (ExecutionException e) { - LOG.warn( - "Failed to retrieve backlog information, reporting the backlog size as UNKNOWN: {}", - e.getCause().getMessage()); - return BACKLOG_UNKNOWN; - } - } - - @Override - public UnboundedSource getCurrentSource() { - return source; - } -} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedSource.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedSource.java deleted file mode 100644 index fd13e71305f4..000000000000 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedSource.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import static com.google.cloud.pubsublite.internal.Preconditions.checkState; -import static java.lang.Math.min; - -import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import com.google.cloud.pubsublite.internal.BufferingPullSubscriber; -import com.google.cloud.pubsublite.internal.wire.Committer; -import com.google.cloud.pubsublite.internal.wire.SubscriberFactory; -import com.google.cloud.pubsublite.proto.Cursor; -import com.google.cloud.pubsublite.proto.SeekRequest; -import com.google.cloud.pubsublite.proto.SequencedMessage; -import io.grpc.StatusException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.apache.beam.sdk.coders.Coder; -import org.apache.beam.sdk.extensions.protobuf.ProtoCoder; -import org.apache.beam.sdk.io.UnboundedSource; -import org.apache.beam.sdk.options.PipelineOptions; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; - -/** An UnboundedSource of Pub/Sub Lite SequencedMessages. */ -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) -class PubsubLiteUnboundedSource extends UnboundedSource { - private final SubscriberOptions subscriberOptions; - - PubsubLiteUnboundedSource(SubscriberOptions options) { - this.subscriberOptions = options; - } - - @Override - public List> split( - int desiredNumSplits, PipelineOptions options) { - ArrayList> partitionPartitions = - new ArrayList<>(min(desiredNumSplits, subscriberOptions.partitions().size())); - for (int i = 0; i < desiredNumSplits; i++) { - partitionPartitions.add(new ArrayList<>()); - } - int counter = 0; - for (Partition partition : subscriberOptions.partitions()) { - partitionPartitions.get(counter % desiredNumSplits).add(partition); - ++counter; - } - ImmutableList.Builder builder = ImmutableList.builder(); - for (List partitionSubset : partitionPartitions) { - if (partitionSubset.isEmpty()) { - continue; - } - try { - builder.add( - new PubsubLiteUnboundedSource( - subscriberOptions - .toBuilder() - .setPartitions(ImmutableSet.copyOf(partitionSubset)) - .build())); - } catch (StatusException e) { - throw e.getStatus().asRuntimeException(); - } - } - return builder.build(); - } - - @Override - public UnboundedReader createReader( - PipelineOptions options, @Nullable OffsetCheckpointMark checkpointMark) throws IOException { - try { - Map subscriberFactories = - subscriberOptions.getSubscriberFactories(); - Map committers = subscriberOptions.getCommitters(); - ImmutableMap.Builder statesBuilder = - ImmutableMap.builder(); - for (Partition partition : subscriberFactories.keySet()) { - checkState(committers.containsKey(partition)); - PubsubLiteUnboundedReader.SubscriberState state = - new PubsubLiteUnboundedReader.SubscriberState(); - state.committer = committers.get(partition); - if (checkpointMark != null && checkpointMark.partitionOffsetMap.containsKey(partition)) { - Offset checkpointed = checkpointMark.partitionOffsetMap.get(partition); - state.lastDelivered = Optional.of(checkpointed); - state.subscriber = - new TranslatingPullSubscriber( - new BufferingPullSubscriber( - subscriberFactories.get(partition), - subscriberOptions.flowControlSettings(), - SeekRequest.newBuilder() - .setCursor(Cursor.newBuilder().setOffset(checkpointed.value())) - .build())); - } else { - state.subscriber = - new TranslatingPullSubscriber( - new BufferingPullSubscriber( - subscriberFactories.get(partition), subscriberOptions.flowControlSettings())); - } - statesBuilder.put(partition, state); - } - return new PubsubLiteUnboundedReader( - this, - statesBuilder.build(), - TopicBacklogReader.create(subscriberOptions.topicBacklogReaderSettings())); - } catch (StatusException e) { - throw new IOException(e); - } - } - - @Override - public Coder getCheckpointMarkCoder() { - return OffsetCheckpointMark.getCoder(); - } - - @Override - public Coder getOutputCoder() { - return ProtoCoder.of(SequencedMessage.class); - } -} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSubscriberFactory.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSubscriberFactory.java new file mode 100644 index 000000000000..c65491903b69 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSubscriberFactory.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.internal.wire.Subscriber; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import java.io.Serializable; +import java.util.List; +import java.util.function.Consumer; + +interface SerializableSubscriberFactory extends Serializable { + long serialVersionUID = -6978345654136456L; + + Subscriber newSubscriber(Partition partition, Consumer> messageConsumer) + throws ApiException; +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSupplier.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSupplier.java index 2f11d385a383..48b8c4db66b0 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSupplier.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SerializableSupplier.java @@ -17,10 +17,9 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; -import io.grpc.StatusException; import java.io.Serializable; -/** A serializable Supplier that can throw a StatusException. */ +/** A serializable Supplier. */ public interface SerializableSupplier extends Serializable { - T get() throws StatusException; + T get(); } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscribeTransform.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscribeTransform.java new file mode 100644 index 000000000000..4fa9116ebc33 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscribeTransform.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical; +import static com.google.cloud.pubsublite.internal.UncheckedApiPreconditions.checkArgument; + +import com.google.api.gax.rpc.ApiException; +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.internal.wire.Committer; +import com.google.cloud.pubsublite.internal.wire.Subscriber; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.DoFn.OutputReceiver; +import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.apache.beam.sdk.values.PBegin; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Stopwatch; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.math.LongMath; +import org.joda.time.Duration; + +class SubscribeTransform extends PTransform> { + private static final Duration MAX_SLEEP_TIME = Duration.standardMinutes(1); + + private final SubscriberOptions options; + + SubscribeTransform(SubscriberOptions options) { + this.options = options; + } + + private void checkSubscription(SubscriptionPartition subscriptionPartition) throws ApiException { + checkArgument(subscriptionPartition.subscription().equals(options.subscriptionPath())); + } + + private Subscriber newSubscriber(Partition partition, Consumer> consumer) { + try { + return options + .getSubscriberFactory(partition) + .newSubscriber( + messages -> + consumer.accept( + messages.stream() + .map(message -> message.toProto()) + .collect(Collectors.toList()))); + } catch (Throwable t) { + throw toCanonical(t).underlying; + } + } + + private SubscriptionPartitionProcessor newPartitionProcessor( + SubscriptionPartition subscriptionPartition, + RestrictionTracker tracker, + OutputReceiver receiver) + throws ApiException { + checkSubscription(subscriptionPartition); + return new SubscriptionPartitionProcessorImpl( + tracker, + receiver, + consumer -> newSubscriber(subscriptionPartition.partition(), consumer), + options.flowControlSettings()); + } + + private RestrictionTracker newRestrictionTracker( + SubscriptionPartition subscriptionPartition, OffsetRange initial) { + checkSubscription(subscriptionPartition); + return new OffsetByteRangeTracker( + initial, + options.getBacklogReader(subscriptionPartition.partition()), + Stopwatch.createUnstarted(), + MAX_SLEEP_TIME.multipliedBy(3).dividedBy(4), + LongMath.saturatedMultiply(options.flowControlSettings().bytesOutstanding(), 10)); + } + + private InitialOffsetReader newInitialOffsetReader(SubscriptionPartition subscriptionPartition) { + checkSubscription(subscriptionPartition); + return options.getInitialOffsetReader(subscriptionPartition.partition()); + } + + private Committer newCommitter(SubscriptionPartition subscriptionPartition) { + checkSubscription(subscriptionPartition); + return options.getCommitter(subscriptionPartition.partition()); + } + + @Override + public PCollection expand(PBegin input) { + PCollection partitions = + Create.of( + options.partitions().stream() + .map( + partition -> + SubscriptionPartition.of(options.subscriptionPath(), partition)) + .collect(Collectors.toList())) + .expand(input); + return partitions.apply( + ParDo.of( + new PerSubscriptionPartitionSdf( + MAX_SLEEP_TIME, + this::newInitialOffsetReader, + this::newRestrictionTracker, + this::newPartitionProcessor, + this::newCommitter))); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriberOptions.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriberOptions.java index 74d103655f36..0f8d44deb685 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriberOptions.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriberOptions.java @@ -17,55 +17,49 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; +import com.google.api.gax.rpc.ApiException; import com.google.auto.value.AutoValue; import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.PartitionLookupUtils; import com.google.cloud.pubsublite.SubscriptionPath; import com.google.cloud.pubsublite.cloudpubsub.FlowControlSettings; +import com.google.cloud.pubsublite.internal.CursorClient; +import com.google.cloud.pubsublite.internal.CursorClientSettings; import com.google.cloud.pubsublite.internal.wire.Committer; import com.google.cloud.pubsublite.internal.wire.CommitterBuilder; import com.google.cloud.pubsublite.internal.wire.PubsubContext; import com.google.cloud.pubsublite.internal.wire.PubsubContext.Framework; import com.google.cloud.pubsublite.internal.wire.SubscriberBuilder; import com.google.cloud.pubsublite.internal.wire.SubscriberFactory; -import com.google.cloud.pubsublite.proto.CursorServiceGrpc.CursorServiceStub; -import com.google.cloud.pubsublite.proto.SubscriberServiceGrpc.SubscriberServiceStub; -import io.grpc.StatusException; import java.io.Serializable; -import java.util.Map; -import java.util.Optional; import java.util.Set; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; import org.checkerframework.checker.nullness.qual.Nullable; @AutoValue -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) public abstract class SubscriberOptions implements Serializable { private static final long serialVersionUID = 269598118L; private static final Framework FRAMEWORK = Framework.of("BEAM"); + private static final long MEBIBYTE = 1L << 20; + + public static final FlowControlSettings DEFAULT_FLOW_CONTROL = + FlowControlSettings.builder() + .setMessagesOutstanding(Long.MAX_VALUE) + .setBytesOutstanding(100 * MEBIBYTE) + .build(); + // Required parameters. public abstract SubscriptionPath subscriptionPath(); + // Optional parameters. + /** Per-partition flow control parameters for this subscription. */ public abstract FlowControlSettings flowControlSettings(); - // Optional parameters. /** A set of partitions. If empty, retrieve the set of partitions using an admin client. */ public abstract Set partitions(); - /** The class used to read backlog for the subscription described by subscriptionPath(). */ - public abstract TopicBacklogReaderSettings topicBacklogReaderSettings(); - - /** A supplier for the subscriber stub to be used. */ - public abstract @Nullable SerializableSupplier subscriberStubSupplier(); - - /** A supplier for the cursor service stub to be used. */ - public abstract @Nullable SerializableSupplier committerStubSupplier(); - /** * A factory to override subscriber creation entirely and delegate to another method. Primarily * useful for testing. @@ -78,54 +72,74 @@ public abstract class SubscriberOptions implements Serializable { */ abstract @Nullable SerializableSupplier committerSupplier(); + /** + * A supplier to override topic backlog reader creation entirely and delegate to another method. + * Primarily useful for testing. + */ + abstract @Nullable SerializableSupplier backlogReaderSupplier(); + + /** + * A supplier to override offset reader creation entirely and delegate to another method. + * Primarily useful for testing. + */ + abstract @Nullable SerializableSupplier offsetReaderSupplier(); + public static Builder newBuilder() { Builder builder = new AutoValue_SubscriberOptions.Builder(); - return builder.setPartitions(ImmutableSet.of()); + return builder.setPartitions(ImmutableSet.of()).setFlowControlSettings(DEFAULT_FLOW_CONTROL); } public abstract Builder toBuilder(); - @SuppressWarnings("CheckReturnValue") - Map getSubscriberFactories() { - ImmutableMap.Builder factories = ImmutableMap.builder(); - for (Partition partition : partitions()) { - SubscriberFactory factory = subscriberFactory(); - if (factory == null) { - factory = - consumer -> { - SubscriberBuilder.Builder builder = SubscriberBuilder.newBuilder(); - builder.setMessageConsumer(consumer); - builder.setSubscriptionPath(subscriptionPath()); - builder.setPartition(partition); - builder.setContext(PubsubContext.of(FRAMEWORK)); - if (subscriberStubSupplier() != null) { - builder.setSubscriberServiceStub(subscriberStubSupplier().get()); - } - return builder.build(); - }; - } - factories.put(partition, factory); + SubscriberFactory getSubscriberFactory(Partition partition) { + SubscriberFactory factory = subscriberFactory(); + if (factory != null) { + return factory; } - return factories.build(); + return consumer -> + SubscriberBuilder.newBuilder() + .setMessageConsumer(consumer) + .setSubscriptionPath(subscriptionPath()) + .setPartition(partition) + .setContext(PubsubContext.of(FRAMEWORK)) + .build(); } - @SuppressWarnings("CheckReturnValue") - Map getCommitters() throws StatusException { - ImmutableMap.Builder committers = ImmutableMap.builder(); - for (Partition partition : partitions()) { - if (committerSupplier() != null) { - committers.put(partition, committerSupplier().get()); - } else { - CommitterBuilder.Builder builder = CommitterBuilder.newBuilder(); - builder.setSubscriptionPath(subscriptionPath()); - builder.setPartition(partition); - if (committerStubSupplier() != null) { - builder.setCursorStub(committerStubSupplier().get()); - } - committers.put(partition, builder.build()); - } + Committer getCommitter(Partition partition) { + SerializableSupplier supplier = committerSupplier(); + if (supplier != null) { + return supplier.get(); + } + return CommitterBuilder.newBuilder() + .setSubscriptionPath(subscriptionPath()) + .setPartition(partition) + .build(); + } + + TopicBacklogReader getBacklogReader(Partition partition) { + SerializableSupplier supplier = backlogReaderSupplier(); + if (supplier != null) { + return supplier.get(); + } + return TopicBacklogReaderSettings.newBuilder() + .setTopicPathFromSubscriptionPath(subscriptionPath()) + .setPartition(partition) + .build() + .instantiate(); + } + + InitialOffsetReader getInitialOffsetReader(Partition partition) { + SerializableSupplier supplier = offsetReaderSupplier(); + if (supplier != null) { + return supplier.get(); } - return committers.build(); + return new InitialOffsetReaderImpl( + CursorClient.create( + CursorClientSettings.newBuilder() + .setRegion(subscriptionPath().location().region()) + .build()), + subscriptionPath(), + partition); } @AutoValue.Builder @@ -133,37 +147,32 @@ public abstract static class Builder { // Required parameters. public abstract Builder setSubscriptionPath(SubscriptionPath path); + // Optional parameters public abstract Builder setPartitions(Set partitions); public abstract Builder setFlowControlSettings(FlowControlSettings flowControlSettings); - // Optional parameters. - public abstract Builder setSubscriberStubSupplier( - SerializableSupplier stubSupplier); - - public abstract Builder setCommitterStubSupplier( - SerializableSupplier stubSupplier); - - public abstract Builder setTopicBacklogReaderSettings( - TopicBacklogReaderSettings topicBacklogReaderSettings); - // Used in unit tests abstract Builder setSubscriberFactory(SubscriberFactory subscriberFactory); abstract Builder setCommitterSupplier(SerializableSupplier committerSupplier); + abstract Builder setBacklogReaderSupplier( + SerializableSupplier backlogReaderSupplier); + + abstract Builder setOffsetReaderSupplier( + SerializableSupplier offsetReaderSupplier); + // Used for implementing build(); abstract SubscriptionPath subscriptionPath(); abstract Set partitions(); - abstract Optional topicBacklogReaderSettings(); - abstract SubscriberOptions autoBuild(); @SuppressWarnings("CheckReturnValue") - public SubscriberOptions build() throws StatusException { - if (!partitions().isEmpty() && topicBacklogReaderSettings().isPresent()) { + public SubscriberOptions build() throws ApiException { + if (!partitions().isEmpty()) { return autoBuild(); } @@ -175,12 +184,6 @@ public SubscriberOptions build() throws StatusException { } setPartitions(partitions.build()); } - if (!topicBacklogReaderSettings().isPresent()) { - setTopicBacklogReaderSettings( - TopicBacklogReaderSettings.newBuilder() - .setTopicPathFromSubscriptionPath(subscriptionPath()) - .build()); - } return autoBuild(); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartition.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartition.java new file mode 100644 index 000000000000..753ad2a921e2 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartition.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.auto.value.AutoValue; +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.SubscriptionPath; +import org.apache.beam.sdk.coders.DefaultCoder; + +@AutoValue +@DefaultCoder(SubscriptionPartitionCoder.class) +public abstract class SubscriptionPartition { + static SubscriptionPartition of(SubscriptionPath subscription, Partition partition) { + return new AutoValue_SubscriptionPartition(subscription, partition); + } + + abstract SubscriptionPath subscription(); + + abstract Partition partition(); +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionCoder.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionCoder.java new file mode 100644 index 000000000000..77380b474dee --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionCoder.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.SubscriptionPath; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.apache.beam.sdk.coders.AtomicCoder; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.coders.CoderProvider; +import org.apache.beam.sdk.coders.CoderProviders; +import org.apache.beam.sdk.coders.DelegateCoder; +import org.apache.beam.sdk.coders.KvCoder; +import org.apache.beam.sdk.coders.StringUtf8Coder; +import org.apache.beam.sdk.coders.VarLongCoder; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.TypeDescriptor; + +public class SubscriptionPartitionCoder extends AtomicCoder { + private static final Coder CODER = + DelegateCoder.of( + KvCoder.of(StringUtf8Coder.of(), VarLongCoder.of()), + SubscriptionPartitionCoder::toKv, + SubscriptionPartitionCoder::fromKv); + + private static KV toKv(SubscriptionPartition value) { + return KV.of(value.subscription().toString(), value.partition().value()); + } + + private static SubscriptionPartition fromKv(KV kv) { + return SubscriptionPartition.of( + SubscriptionPath.parse(kv.getKey()), Partition.of(kv.getValue())); + } + + @Override + public void encode(SubscriptionPartition value, OutputStream outStream) throws IOException { + CODER.encode(value, outStream); + } + + @Override + public SubscriptionPartition decode(InputStream inStream) throws IOException { + return CODER.decode(inStream); + } + + public static CoderProvider getCoderProvider() { + return CoderProviders.forCoder( + TypeDescriptor.of(SubscriptionPartition.class), new SubscriptionPartitionCoder()); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessor.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessor.java new file mode 100644 index 000000000000..471e651508f1 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessor.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.internal.CheckedApiException; +import java.util.Optional; +import org.apache.beam.sdk.transforms.DoFn.ProcessContinuation; +import org.joda.time.Duration; + +interface SubscriptionPartitionProcessor extends AutoCloseable { + void start() throws CheckedApiException; + + ProcessContinuation waitForCompletion(Duration duration); + + Optional lastClaimed(); +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorFactory.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorFactory.java new file mode 100644 index 000000000000..6bf362380ffe --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorFactory.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.cloud.pubsublite.proto.SequencedMessage; +import java.io.Serializable; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.DoFn.OutputReceiver; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; + +interface SubscriptionPartitionProcessorFactory extends Serializable { + long serialVersionUID = 765145146544654L; + + SubscriptionPartitionProcessor newProcessor( + SubscriptionPartition subscriptionPartition, + RestrictionTracker tracker, + OutputReceiver receiver); +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImpl.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImpl.java new file mode 100644 index 000000000000..8d2a137a27dc --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImpl.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import com.google.api.core.ApiService.Listener; +import com.google.api.core.ApiService.State; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.cloudpubsub.FlowControlSettings; +import com.google.cloud.pubsublite.internal.CheckedApiException; +import com.google.cloud.pubsublite.internal.ExtractStatus; +import com.google.cloud.pubsublite.internal.wire.Subscriber; +import com.google.cloud.pubsublite.proto.Cursor; +import com.google.cloud.pubsublite.proto.FlowControlRequest; +import com.google.cloud.pubsublite.proto.SeekRequest; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import com.google.protobuf.util.Timestamps; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; +import java.util.function.Function; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.DoFn.OutputReceiver; +import org.apache.beam.sdk.transforms.DoFn.ProcessContinuation; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.util.concurrent.MoreExecutors; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.util.concurrent.SettableFuture; +import org.joda.time.Duration; +import org.joda.time.Instant; + +class SubscriptionPartitionProcessorImpl extends Listener + implements SubscriptionPartitionProcessor { + private final RestrictionTracker tracker; + private final OutputReceiver receiver; + private final Subscriber subscriber; + private final SettableFuture completionFuture = SettableFuture.create(); + private final FlowControlSettings flowControlSettings; + private Optional lastClaimedOffset = Optional.empty(); + + @SuppressWarnings("methodref.receiver.bound.invalid") + SubscriptionPartitionProcessorImpl( + RestrictionTracker tracker, + OutputReceiver receiver, + Function>, Subscriber> subscriberFactory, + FlowControlSettings flowControlSettings) { + this.tracker = tracker; + this.receiver = receiver; + this.subscriber = subscriberFactory.apply(this::onMessages); + this.flowControlSettings = flowControlSettings; + } + + @Override + @SuppressWarnings("argument.type.incompatible") + public void start() throws CheckedApiException { + this.subscriber.addListener(this, MoreExecutors.directExecutor()); + this.subscriber.startAsync(); + this.subscriber.awaitRunning(); + try { + this.subscriber + .seek( + SeekRequest.newBuilder() + .setCursor(Cursor.newBuilder().setOffset(tracker.currentRestriction().getFrom())) + .build()) + .get(); + this.subscriber.allowFlow( + FlowControlRequest.newBuilder() + .setAllowedBytes(flowControlSettings.bytesOutstanding()) + .setAllowedMessages(flowControlSettings.messagesOutstanding()) + .build()); + } catch (ExecutionException e) { + throw ExtractStatus.toCanonical(e.getCause()); + } catch (Throwable t) { + throw ExtractStatus.toCanonical(t); + } + } + + private void onMessages(List messages) { + if (completionFuture.isDone()) { + return; + } + Offset lastOffset = Offset.of(Iterables.getLast(messages).getCursor().getOffset()); + long byteSize = messages.stream().mapToLong(SequencedMessage::getSizeBytes).sum(); + if (tracker.tryClaim(OffsetByteProgress.of(lastOffset, byteSize))) { + lastClaimedOffset = Optional.of(lastOffset); + messages.forEach( + message -> + receiver.outputWithTimestamp( + message, new Instant(Timestamps.toMillis(message.getPublishTime())))); + try { + subscriber.allowFlow( + FlowControlRequest.newBuilder() + .setAllowedBytes(byteSize) + .setAllowedMessages(messages.size()) + .build()); + } catch (CheckedApiException e) { + completionFuture.setException(e); + } + } else { + completionFuture.set(null); + } + } + + @Override + public void failed(State from, Throwable failure) { + completionFuture.setException(ExtractStatus.toCanonical(failure)); + } + + @Override + public void close() { + subscriber.stopAsync().awaitTerminated(); + } + + @Override + @SuppressWarnings("argument.type.incompatible") + public ProcessContinuation waitForCompletion(Duration duration) { + try { + completionFuture.get(duration.getMillis(), TimeUnit.MILLISECONDS); + // CompletionFuture set with null when tryClaim returned false. + return ProcessContinuation.stop(); + } catch (TimeoutException ignored) { + // Timed out waiting, yield to the runtime. + return ProcessContinuation.resume(); + } catch (ExecutionException e) { + throw ExtractStatus.toCanonical(e.getCause()).underlying; + } catch (Throwable t) { + throw ExtractStatus.toCanonical(t).underlying; + } + } + + @Override + public Optional lastClaimed() { + return lastClaimedOffset; + } +} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReader.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReader.java index 37dd288e5a19..1cf27cc49012 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReader.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReader.java @@ -17,33 +17,25 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; -import com.google.api.core.ApiFuture; +import com.google.api.gax.rpc.ApiException; import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; -import io.grpc.StatusException; -import java.util.Map; /** - * The TopicBacklogReader is intended for clients who would like to use the TopicStats API to - * aggregate the backlog, or the distance between the current cursor and HEAD across multiple - * partitions within a subscription. + * The TopicBacklogReader uses the TopicStats API to aggregate the backlog, or the distance between + * the current cursor and HEAD for a single {subscription, partition} pair. */ -public interface TopicBacklogReader { - - /** Create a TopicBacklogReader from settings. */ - static TopicBacklogReader create(TopicBacklogReaderSettings settings) throws StatusException { - return settings.instantiate(); - } +interface TopicBacklogReader extends AutoCloseable { /** - * Compute and aggregate message statistics for message between the provided start offset and HEAD - * for each partition. + * Compute and aggregate message statistics for message between the provided start offset and + * HEAD. This method is blocking. * - * @param subscriptionState A map from partition to the current offset of the subscriber in a - * given partition. - * @return a future with either an error or a ComputeMessageStatsResponse with the aggregated - * statistics for messages in the backlog on success. + * @param offset The current offset of the subscriber. + * @return A ComputeMessageStatsResponse with the aggregated statistics for messages in the + * backlog. */ - ApiFuture computeMessageStats( - Map subscriptionState); + ComputeMessageStatsResponse computeMessageStats(Offset offset) throws ApiException; + + @Override + void close(); } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImpl.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImpl.java index 58e8f74bd1af..94b66da27c43 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImpl.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImpl.java @@ -17,73 +17,53 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; -import com.google.api.core.ApiFuture; -import com.google.api.core.ApiFutures; +import static com.google.cloud.pubsublite.internal.ExtractStatus.toCanonical; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.gax.rpc.ApiException; import com.google.cloud.pubsublite.Offset; import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.TopicPath; import com.google.cloud.pubsublite.internal.TopicStatsClient; import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; -import com.google.protobuf.Timestamp; -import com.google.protobuf.util.Timestamps; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.util.concurrent.MoreExecutors; +import java.util.concurrent.ExecutionException; +import javax.annotation.Nonnull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class TopicBacklogReaderImpl implements TopicBacklogReader { + private static final Logger LOG = LoggerFactory.getLogger(TopicBacklogReaderImpl.class); private final TopicStatsClient client; private final TopicPath topicPath; + private final Partition partition; - public TopicBacklogReaderImpl(TopicStatsClient client, TopicPath topicPath) { + public TopicBacklogReaderImpl(TopicStatsClient client, TopicPath topicPath, Partition partition) { this.client = client; this.topicPath = topicPath; + this.partition = partition; } - private static Optional minTimestamp(Optional t1, Timestamp t2) { - if (!t1.isPresent() || Timestamps.compare(t1.get(), t2) > 0) { - return Optional.of(t2); + @Override + @SuppressWarnings("assignment.type.incompatible") + public ComputeMessageStatsResponse computeMessageStats(Offset offset) throws ApiException { + try { + return client + .computeMessageStats(topicPath, partition, offset, Offset.of(Integer.MAX_VALUE)) + .get(); + } catch (ExecutionException e) { + @Nonnull Throwable cause = checkNotNull(e.getCause()); + throw toCanonical(cause).underlying; + } catch (InterruptedException e) { + throw toCanonical(e).underlying; } - return t1; } @Override - @SuppressWarnings("dereference.of.nullable") - public ApiFuture computeMessageStats( - Map subscriptionState) { - List> perPartitionFutures = - subscriptionState.entrySet().stream() - .map( - e -> - client.computeMessageStats( - topicPath, e.getKey(), e.getValue(), Offset.of(Integer.MAX_VALUE))) - .collect(Collectors.toList()); - return ApiFutures.transform( - ApiFutures.allAsList(perPartitionFutures), - responses -> { - Optional minPublishTime = Optional.empty(); - Optional minEventTime = Optional.empty(); - long messageBytes = 0; - long messageCount = 0; - for (ComputeMessageStatsResponse response : responses) { - messageBytes += response.getMessageBytes(); - messageCount += response.getMessageCount(); - if (response.hasMinimumPublishTime()) { - minPublishTime = minTimestamp(minPublishTime, response.getMinimumPublishTime()); - } - if (response.hasMinimumEventTime()) { - minEventTime = minTimestamp(minPublishTime, response.getMinimumEventTime()); - } - } - ComputeMessageStatsResponse.Builder builder = - ComputeMessageStatsResponse.newBuilder() - .setMessageBytes(messageBytes) - .setMessageCount(messageCount); - minPublishTime.ifPresent(builder::setMinimumPublishTime); - minEventTime.ifPresent(builder::setMinimumEventTime); - return builder.build(); - }, - MoreExecutors.directExecutor()); + public void close() { + try { + client.close(); + } catch (Exception e) { + LOG.warn("Failed to close topic stats client.", e); + } } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderSettings.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderSettings.java index 07120fec2bfc..8c1dd9439e51 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderSettings.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderSettings.java @@ -17,22 +17,25 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; +import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.gax.rpc.ApiException; import com.google.auto.value.AutoValue; import com.google.cloud.pubsublite.AdminClient; import com.google.cloud.pubsublite.AdminClientSettings; +import com.google.cloud.pubsublite.Partition; import com.google.cloud.pubsublite.SubscriptionPath; import com.google.cloud.pubsublite.TopicPath; import com.google.cloud.pubsublite.internal.ExtractStatus; import com.google.cloud.pubsublite.internal.TopicStatsClient; import com.google.cloud.pubsublite.internal.TopicStatsClientSettings; -import com.google.cloud.pubsublite.proto.TopicStatsServiceGrpc.TopicStatsServiceBlockingStub; -import io.grpc.StatusException; import java.io.Serializable; import java.util.concurrent.ExecutionException; -import org.checkerframework.checker.nullness.qual.Nullable; +import javax.annotation.Nonnull; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Ticker; @AutoValue -public abstract class TopicBacklogReaderSettings implements Serializable { +abstract class TopicBacklogReaderSettings implements Serializable { private static final long serialVersionUID = -4001752066450248673L; /** @@ -41,22 +44,21 @@ public abstract class TopicBacklogReaderSettings implements Serializable { */ abstract TopicPath topicPath(); - // Optional parameters - abstract @Nullable SerializableSupplier stub(); + abstract Partition partition(); - public static Builder newBuilder() { + static Builder newBuilder() { return new AutoValue_TopicBacklogReaderSettings.Builder(); } @AutoValue.Builder - public abstract static class Builder { + abstract static class Builder { // Required parameters. - public abstract Builder setTopicPath(TopicPath topicPath); + abstract Builder setTopicPath(TopicPath topicPath); - @SuppressWarnings("argument.type.incompatible") - public Builder setTopicPathFromSubscriptionPath(SubscriptionPath subscriptionPath) - throws StatusException { + @SuppressWarnings("assignment.type.incompatible") + Builder setTopicPathFromSubscriptionPath(SubscriptionPath subscriptionPath) + throws ApiException { try (AdminClient adminClient = AdminClient.create( AdminClientSettings.newBuilder() @@ -65,25 +67,23 @@ public Builder setTopicPathFromSubscriptionPath(SubscriptionPath subscriptionPat return setTopicPath( TopicPath.parse(adminClient.getSubscription(subscriptionPath).get().getTopic())); } catch (ExecutionException e) { - throw ExtractStatus.toCanonical(e.getCause()); + @Nonnull Throwable cause = checkNotNull(e.getCause()); + throw ExtractStatus.toCanonical(cause).underlying; } catch (Throwable t) { - throw ExtractStatus.toCanonical(t); + throw ExtractStatus.toCanonical(t).underlying; } } - public abstract Builder setStub(SerializableSupplier stub); + abstract Builder setPartition(Partition partition); - public abstract TopicBacklogReaderSettings build(); + abstract TopicBacklogReaderSettings build(); } - @SuppressWarnings("CheckReturnValue") - TopicBacklogReader instantiate() throws StatusException { - TopicStatsClientSettings.Builder builder = TopicStatsClientSettings.newBuilder(); - SerializableSupplier stub = stub(); - if (stub != null) { - builder.setStub(stub.get()); - } - builder.setRegion(topicPath().location().region()); - return new TopicBacklogReaderImpl(TopicStatsClient.create(builder.build()), topicPath()); + TopicBacklogReader instantiate() throws ApiException { + TopicStatsClientSettings settings = + TopicStatsClientSettings.newBuilder().setRegion(topicPath().location().region()).build(); + TopicBacklogReader impl = + new TopicBacklogReaderImpl(TopicStatsClient.create(settings), topicPath(), partition()); + return new LimitingTopicBacklogReader(impl, Ticker.systemTicker()); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TranslatingPullSubscriber.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TranslatingPullSubscriber.java deleted file mode 100644 index 6bf070245183..000000000000 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/TranslatingPullSubscriber.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import com.google.cloud.pubsublite.internal.PullSubscriber; -import com.google.cloud.pubsublite.proto.SequencedMessage; -import io.grpc.StatusException; -import java.util.List; -import java.util.stream.Collectors; - -/** - * A PullSubscriber translating from {@link com.google.cloud.pubsublite.SequencedMessage}to {@link - * com.google.cloud.pubsublite.proto.SequencedMessage}. - */ -class TranslatingPullSubscriber implements PullSubscriber { - private final PullSubscriber underlying; - - TranslatingPullSubscriber( - PullSubscriber underlying) { - this.underlying = underlying; - } - - @Override - public List pull() throws StatusException { - List messages = underlying.pull(); - return messages.stream().map(m -> m.toProto()).collect(Collectors.toList()); - } - - @Override - public void close() throws Exception { - underlying.close(); - } -} diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidCoder.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidCoder.java index b71226d7b74d..d23fb3080c2c 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidCoder.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidCoder.java @@ -30,16 +30,17 @@ /** A coder for a Uuid. */ public class UuidCoder extends AtomicCoder { - private static Coder coder = DelegateCoder.of(ByteStringCoder.of(), Uuid::value, Uuid::of); + private static final Coder CODER = + DelegateCoder.of(ByteStringCoder.of(), Uuid::value, Uuid::of); @Override public void encode(Uuid value, OutputStream outStream) throws IOException { - coder.encode(value, outStream); + CODER.encode(value, outStream); } @Override public Uuid decode(InputStream inStream) throws IOException { - return coder.decode(inStream); + return CODER.decode(inStream); } public static CoderProvider getCoderProvider() { diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationOptions.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationOptions.java index 0cb2b2a8590a..20e7c1fe4a64 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationOptions.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationOptions.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; -import static com.google.cloud.pubsublite.internal.Preconditions.checkArgument; +import static com.google.cloud.pubsublite.internal.UncheckedApiPreconditions.checkArgument; import com.google.auto.value.AutoValue; import com.google.cloud.pubsublite.proto.SequencedMessage; @@ -26,6 +26,7 @@ import java.util.List; import org.apache.beam.sdk.state.TimeDomain; import org.apache.beam.sdk.transforms.Deduplicate; +import org.apache.beam.sdk.transforms.SerializableFunction; import org.joda.time.Duration; /** Options for deduplicating Pub/Sub Lite messages based on the UUID they were published with. */ @@ -36,7 +37,7 @@ public abstract class UuidDeduplicationOptions implements Serializable { private static final long serialVersionUID = 9837489720893L; - public static final SerializableStatusFunction DEFAULT_UUID_EXTRACTOR = + public static final SerializableFunction DEFAULT_UUID_EXTRACTOR = message -> { checkArgument( message.getMessage().getAttributesMap().containsKey(Uuid.DEFAULT_ATTRIBUTE), @@ -53,13 +54,10 @@ public abstract class UuidDeduplicationOptions implements Serializable { public static final Duration DEFAULT_DEDUPLICATE_DURATION = Duration.standardDays(1); // All parameters are optional. - public abstract SerializableStatusFunction uuidExtractor(); + public abstract SerializableFunction uuidExtractor(); public abstract Deduplicate.KeyedValues deduplicate(); - // The number of partitions to hash values into. - public abstract int hashPartitions(); - @SuppressWarnings("CheckReturnValue") public static Builder newBuilder() { Builder builder = new AutoValue_UuidDeduplicationOptions.Builder(); @@ -68,14 +66,13 @@ public static Builder newBuilder() { Deduplicate.keyedValues() .withTimeDomain(DEFAULT_TIME_DOMAIN) .withDuration(DEFAULT_DEDUPLICATE_DURATION)); - builder.setHashPartitions(DEFAULT_HASH_PARTITIONS); return builder; } @AutoValue.Builder public abstract static class Builder { public abstract Builder setUuidExtractor( - SerializableStatusFunction uuidExtractor); + SerializableFunction uuidExtractor); /** * Set the deduplication transform. @@ -89,8 +86,6 @@ public abstract Builder setUuidExtractor( public abstract Builder setDeduplicate( Deduplicate.KeyedValues deduplicate); - public abstract Builder setHashPartitions(int partitions); - public abstract UuidDeduplicationOptions build(); } } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerAccessor.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerAccessor.java index a22b5b9ae6c2..0a7f3ab07bba 100644 --- a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerAccessor.java +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerAccessor.java @@ -19,6 +19,7 @@ import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.rpc.FixedHeaderProvider; +import com.google.api.gax.rpc.ServerStreamingCallSettings; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.cloud.NoCredentials; import com.google.cloud.ServiceFactory; @@ -30,6 +31,8 @@ import com.google.cloud.spanner.SpannerOptions; import com.google.spanner.v1.CommitRequest; import com.google.spanner.v1.CommitResponse; +import com.google.spanner.v1.ExecuteSqlRequest; +import com.google.spanner.v1.PartialResultSet; import io.grpc.CallOptions; import io.grpc.Channel; import io.grpc.ClientCall; @@ -122,6 +125,19 @@ private static SpannerAccessor createAndConnect(SpannerConfig spannerConfig) { org.threeten.bp.Duration.ofMillis(commitDeadline.get().getMillis())) .build()); } + // Setting the timeout for streaming read to 2 hours. This is 1 hour by default + // after BEAM 2.20. + ServerStreamingCallSettings.Builder + executeStreamingSqlSettings = + builder.getSpannerStubSettingsBuilder().executeStreamingSqlSettings(); + RetrySettings.Builder executeSqlStreamingRetrySettings = + executeStreamingSqlSettings.getRetrySettings().toBuilder(); + executeStreamingSqlSettings.setRetrySettings( + executeSqlStreamingRetrySettings + .setInitialRpcTimeout(org.threeten.bp.Duration.ofMinutes(120)) + .setMaxRpcTimeout(org.threeten.bp.Duration.ofMinutes(120)) + .setTotalTimeout(org.threeten.bp.Duration.ofMinutes(120)) + .build()); ValueProvider projectId = spannerConfig.getProjectId(); if (projectId != null) { @@ -157,15 +173,15 @@ private static SpannerAccessor createAndConnect(SpannerConfig spannerConfig) { spanner, databaseClient, databaseAdminClient, batchClient, spannerConfig); } - DatabaseClient getDatabaseClient() { + public DatabaseClient getDatabaseClient() { return databaseClient; } - BatchClient getBatchClient() { + public BatchClient getBatchClient() { return batchClient; } - DatabaseAdminClient getDatabaseAdminClient() { + public DatabaseAdminClient getDatabaseAdminClient() { return databaseAdminClient; } diff --git a/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/testing/BigtableUtils.java b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/testing/BigtableUtils.java new file mode 100644 index 000000000000..67ed384e007f --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/testing/BigtableUtils.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.testing; + +import com.google.protobuf.ByteString; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Ints; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Longs; + +public class BigtableUtils { + + public static ByteString byteString(byte[] bytes) { + return ByteString.copyFrom(bytes); + } + + public static ByteString byteStringUtf8(String s) { + return ByteString.copyFromUtf8(s); + } + + public static byte[] floatToByteArray(float number) { + return Ints.toByteArray(Float.floatToIntBits(number)); + } + + public static byte[] longToByteArray(long number) { + return Longs.toByteArray(number); + } + + public static byte[] doubleToByteArray(double number) { + return Longs.toByteArray(Double.doubleToLongBits(number)); + } + + public static byte[] booleanToByteArray(boolean condition) { + return condition ? new byte[] {1} : new byte[] {0}; + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/com/google/cloud/spanner/FakeBatchTransactionId.java b/sdks/java/io/google-cloud-platform/src/test/java/com/google/cloud/spanner/FakeBatchTransactionId.java index 9d72de1f3a58..759946b7b827 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/com/google/cloud/spanner/FakeBatchTransactionId.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/com/google/cloud/spanner/FakeBatchTransactionId.java @@ -37,6 +37,7 @@ public FakeBatchTransactionId(String id) { } @Override + @SuppressWarnings("dereference.of.nullable") public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/GcpApiSurfaceTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/GcpApiSurfaceTest.java index 825542a87ad7..d894ebfde1dc 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/GcpApiSurfaceTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/GcpApiSurfaceTest.java @@ -103,7 +103,8 @@ public void testGcpApiSurface() throws Exception { classesInPackage("org.apache.beam"), classesInPackage("org.apache.commons.logging"), classesInPackage("org.codehaus.jackson"), - classesInPackage("org.joda.time")); + classesInPackage("org.joda.time"), + classesInPackage("com.google.gson")); assertThat(apiSurface, containsOnlyClassesMatching(allowedClasses)); } diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOReadTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOReadTest.java index 69439bb32011..57b325b50601 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOReadTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOReadTest.java @@ -19,10 +19,10 @@ import static org.apache.beam.sdk.io.gcp.bigquery.BigQueryResourceNaming.createTempTableReference; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import com.google.api.services.bigquery.model.JobStatistics; import com.google.api.services.bigquery.model.JobStatistics2; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOStorageReadTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOStorageReadTest.java index 8bcd106bf215..2b919c3a718b 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOStorageReadTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOStorageReadTest.java @@ -26,6 +26,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; @@ -98,6 +100,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.junit.runners.model.Statement; +import org.mockito.ArgumentMatchers; /** Tests for {@link BigQueryIO#readTableRows() using {@link Method#DIRECT_READ}}. */ @RunWith(JUnit4.class) @@ -107,7 +110,7 @@ public class BigQueryIOStorageReadTest { private transient PipelineOptions options; - private transient TemporaryFolder testFolder = new TemporaryFolder(); + private final transient TemporaryFolder testFolder = new TemporaryFolder(); private transient TestPipeline p; @Rule @@ -138,7 +141,7 @@ public void evaluate() throws Throwable { @Rule public transient ExpectedException thrown = ExpectedException.none(); - private FakeDatasetService fakeDatasetService = new FakeDatasetService(); + private final FakeDatasetService fakeDatasetService = new FakeDatasetService(); @Before public void setUp() throws Exception { @@ -1112,6 +1115,12 @@ public void testStreamSourceSplitAtFractionFailsWhenSplitIsNotPossible() throws assertEquals("B", parent.getCurrent().get("name")); assertNull(parent.splitAtFraction(0.5)); + verify(fakeStorageClient, times(1)).splitReadStream(ArgumentMatchers.any()); + + // Verify that subsequent splitAtFraction() calls after a failed splitAtFraction() attempt + // do NOT invoke SplitReadStream. + assertNull(parent.splitAtFraction(0.5)); + verify(fakeStorageClient, times(1)).splitReadStream(ArgumentMatchers.any()); // Verify that the parent source still works okay even after an unsuccessful split attempt. assertTrue(parent.advance()); diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOWriteTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOWriteTest.java index d6df54bd3a1a..47947870377b 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOWriteTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIOWriteTest.java @@ -22,6 +22,7 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkState; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; @@ -30,7 +31,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -2031,4 +2031,13 @@ public void testWriteFileSchemaUpdateOptionAll() throws Exception { Set options = EnumSet.allOf(SchemaUpdateOption.class); schemaUpdateOptionsTest(BigQueryIO.Write.Method.FILE_LOADS, options); } + + @Test + public void testSchemaUpdateOptionsFailsStreamingInserts() throws Exception { + Set options = EnumSet.of(SchemaUpdateOption.ALLOW_FIELD_ADDITION); + p.enableAbandonedNodeEnforcement(false); + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("SchemaUpdateOptions are not supported when method == STREAMING_INSERTS"); + schemaUpdateOptionsTest(BigQueryIO.Write.Method.STREAMING_INSERTS, options); + } } diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImplTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImplTest.java index e809d26a56ad..0ffe9ad74191 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImplTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImplTest.java @@ -18,13 +18,13 @@ package org.apache.beam.sdk.io.gcp.bigquery; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Verify.verifyNotNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtilsTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtilsTest.java index 871f4d04c274..324d5d17bc4c 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtilsTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtilsTest.java @@ -19,13 +19,13 @@ import static org.apache.beam.sdk.io.gcp.bigquery.BigQueryUtils.toTableRow; import static org.apache.beam.sdk.io.gcp.bigquery.BigQueryUtils.toTableSchema; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.collection.IsMapContaining.hasEntry; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import com.google.api.services.bigquery.model.TableFieldSchema; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowJsonCoderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowJsonCoderTest.java index 15e50f593290..b09832085a7d 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowJsonCoderTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowJsonCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.bigquery; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import com.google.api.services.bigquery.model.TableRow; import java.util.Arrays; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutationTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutationTest.java new file mode 100644 index 000000000000..5fa16dbffafa --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BeamRowToBigtableMutationTest.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.BOOL_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.DOUBLE_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.FAMILY_TEST; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.LONG_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.STRING_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.TEST_FLAT_SCHEMA; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.rowMutation; + +import com.google.bigtable.v2.Mutation; +import com.google.protobuf.ByteString; +import java.util.Map; +import java.util.Set; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.junit.Rule; +import org.junit.Test; + +public class BeamRowToBigtableMutationTest { + @Rule public final TestPipeline pipeline = TestPipeline.create(); + + @Test + @SuppressWarnings("unchecked") + public void testBeamRowToBigtableMutation() { + Map> columnsMapping = + ImmutableMap.of( + FAMILY_TEST, ImmutableSet.of(BOOL_COLUMN, LONG_COLUMN, STRING_COLUMN, DOUBLE_COLUMN)); + + PCollection>> rows = + pipeline + .apply(Create.of(row(1), row(2))) + .setRowSchema(TEST_FLAT_SCHEMA) + .apply(new BeamRowToBigtableMutation(columnsMapping)) + .apply(MapElements.via(new SortMutationsByColumns())); + + PAssert.that(rows).containsInAnyOrder(rowMutation(1), rowMutation(2)); + pipeline.run().waitUntilFinish(); + } + + private Row row(long i) { + return Row.withSchema(TEST_FLAT_SCHEMA).attachValues("key" + i, false, 2L, "value1", 5.5); + } + + private static class SortMutationsByColumns + extends SimpleFunction< + KV>, KV>> { + @Override + public KV> apply(KV> input) { + return KV.of( + input.getKey(), + ImmutableList.copyOf(input.getValue()).stream() + .sorted( + (mutation1, mutation2) -> { + String qualifier = mutation1.getSetCell().getColumnQualifier().toStringUtf8(); + String other = mutation2.getSetCell().getColumnQualifier().toStringUtf8(); + return qualifier.compareTo(other); + }) + .collect(toList())); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfigTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfigTest.java index 20e564b4c582..e2c6862eb23d 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfigTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableConfigTest.java @@ -21,10 +21,10 @@ import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasKey; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasLabel; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.cloud.bigtable.config.BigtableOptions; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIOTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIOTest.java index 10310a744a47..e983692ec622 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIOTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableIOTest.java @@ -29,6 +29,7 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Verify.verifyNotNull; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.greaterThan; @@ -37,7 +38,6 @@ import static org.hamcrest.Matchers.lessThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.bigtable.v2.Cell; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlatTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlatTest.java new file mode 100644 index 000000000000..ef59c6ab7466 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowFlatTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.BOOL_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.DOUBLE_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.FAMILY_TEST; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.LONG_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.STRING_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.TEST_FLAT_SCHEMA; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.bigtableRow; + +import java.util.Map; +import java.util.Set; +import org.apache.beam.sdk.extensions.protobuf.ProtoCoder; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; +import org.junit.Rule; +import org.junit.Test; + +public class BigtableRowToBeamRowFlatTest { + @Rule public final TestPipeline pipeline = TestPipeline.create(); + + @Test + public void testBigtableRowToBeamRowFlat() { + Map> columnsMapping = + ImmutableMap.of( + FAMILY_TEST, ImmutableSet.of(BOOL_COLUMN, LONG_COLUMN, STRING_COLUMN, DOUBLE_COLUMN)); + + PCollection rows = + pipeline + .apply(Create.of(bigtableRow(1), bigtableRow(2))) + .setCoder(ProtoCoder.of(TypeDescriptor.of(com.google.bigtable.v2.Row.class))) + .apply(new BigtableRowToBeamRowFlat(TEST_FLAT_SCHEMA, columnsMapping)) + .setRowSchema(TEST_FLAT_SCHEMA); + + PAssert.that(rows).containsInAnyOrder(row(1), row(2)); + pipeline.run().waitUntilFinish(); + } + + private Row row(long i) { + return Row.withSchema(TEST_FLAT_SCHEMA).attachValues("key" + i, false, 2L, "value1", 5.5); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowTest.java new file mode 100644 index 000000000000..a7b9f6f9c990 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableRowToBeamRowTest.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.util.stream.Collectors.toList; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.FAMILY_TEST; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.LATER; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.LONG_COLUMN_SCHEMA; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.STRING_COLUMN; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.TEST_FAMILY_SCHEMA; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.TEST_SCHEMA; +import static org.apache.beam.sdk.io.gcp.bigtable.BigtableTestUtils.bigtableRow; + +import org.apache.beam.sdk.extensions.protobuf.ProtoCoder; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.SimpleFunction; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class BigtableRowToBeamRowTest { + + @Rule public final TestPipeline pipeline = TestPipeline.create(); + + @Test + public void testBigtableRowToBeamRow() { + PCollection rows = + pipeline + .apply(Create.of(bigtableRow(1), bigtableRow(2))) + .setCoder(ProtoCoder.of(TypeDescriptor.of(com.google.bigtable.v2.Row.class))) + .apply(new BigtableRowToBeamRow(TEST_SCHEMA)) + .setRowSchema(TEST_SCHEMA) + .apply(MapElements.via(new SortStringColumn())) + .setRowSchema(TEST_SCHEMA); + + PAssert.that(rows).containsInAnyOrder(row(1), row(2)); + pipeline.run().waitUntilFinish(); + } + + private Row row(long i) { + return Row.withSchema(TEST_SCHEMA).attachValues("key" + i, familyRow()); + } + + private Row familyRow() { + return Row.withSchema(TEST_FAMILY_SCHEMA) + .attachValues( + false, + Row.withSchema(LONG_COLUMN_SCHEMA).attachValues(2L, LATER, ImmutableList.of("label1")), + ImmutableList.of("value1", "value2"), + 5.5); + } + + private static class SortStringColumn extends SimpleFunction { + @Override + public Row apply(Row row) { + Row familyRow = row.getRow(FAMILY_TEST); + return Row.fromRow(row) + .withFieldValue( + FAMILY_TEST, + Row.fromRow(familyRow) + .withFieldValue( + STRING_COLUMN, + familyRow.getArray(STRING_COLUMN).stream().sorted().collect(toList())) + .build()) + .build(); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableTestUtils.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableTestUtils.java new file mode 100644 index 000000000000..5c5af10b37b7 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableTestUtils.java @@ -0,0 +1,147 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.KEY; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.LABELS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.TIMESTAMP_MICROS; +import static org.apache.beam.sdk.io.gcp.bigtable.RowUtils.VALUE; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.booleanToByteArray; +import static org.apache.beam.sdk.io.gcp.testing.BigtableUtils.doubleToByteArray; + +import com.google.bigtable.v2.Cell; +import com.google.bigtable.v2.Column; +import com.google.bigtable.v2.Family; +import com.google.bigtable.v2.Mutation; +import com.google.protobuf.ByteString; +import java.util.List; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.primitives.Longs; + +class BigtableTestUtils { + + static final String BOOL_COLUMN = "boolColumn"; + static final String LONG_COLUMN = "longColumn"; + static final String STRING_COLUMN = "stringColumn"; + static final String DOUBLE_COLUMN = "doubleColumn"; + static final String FAMILY_TEST = "familyTest"; + + static final Schema LONG_COLUMN_SCHEMA = + Schema.builder() + .addInt64Field(VALUE) + .addInt64Field(TIMESTAMP_MICROS) + .addArrayField(LABELS, Schema.FieldType.STRING) + .build(); + + static final Schema TEST_FAMILY_SCHEMA = + Schema.builder() + .addBooleanField(BOOL_COLUMN) + .addRowField(LONG_COLUMN, LONG_COLUMN_SCHEMA) + .addArrayField(STRING_COLUMN, Schema.FieldType.STRING) + .addDoubleField(DOUBLE_COLUMN) + .build(); + + static final Schema TEST_SCHEMA = + Schema.builder().addStringField(KEY).addRowField(FAMILY_TEST, TEST_FAMILY_SCHEMA).build(); + + static final Schema TEST_FLAT_SCHEMA = + Schema.builder() + .addStringField(KEY) + .addBooleanField(BOOL_COLUMN) + .addInt64Field(LONG_COLUMN) + .addStringField(STRING_COLUMN) + .addDoubleField(DOUBLE_COLUMN) + .build(); + + static final long NOW = 5_000_000_000L; + static final long LATER = NOW + 1_000L; + + static com.google.bigtable.v2.Row bigtableRow(long i) { + return com.google.bigtable.v2.Row.newBuilder() + .setKey(ByteString.copyFromUtf8("key" + i)) + .addFamilies(bigtableFamily()) + .build(); + } + + static KV> rowMutation(long i) { + List mutations = + ImmutableList.of( + mutation("boolColumn", ByteString.copyFrom(booleanToByteArray(false))), + mutation("doubleColumn", ByteString.copyFrom(doubleToByteArray(5.5))), + mutation("longColumn", ByteString.copyFrom(Longs.toByteArray(2L))), + mutation("stringColumn", ByteString.copyFromUtf8("value1"))); + return KV.of(ByteString.copyFrom(("key" + i).getBytes(UTF_8)), mutations); + } + + private static Mutation mutation(String column, ByteString value) { + return Mutation.newBuilder() + .setSetCell( + Mutation.SetCell.newBuilder() + .setFamilyName(FAMILY_TEST) + .setColumnQualifier(ByteString.copyFromUtf8(column)) + .setValue(value) + .build()) + .build(); + } + + private static Family bigtableFamily() { + return Family.newBuilder() + .setName("familyTest") + .addColumns( + Column.newBuilder() + .setQualifier(ByteString.copyFromUtf8("boolColumn")) + .addCells(createCell(ByteString.copyFrom(booleanToByteArray(true)), NOW)) + .addCells(createCell(ByteString.copyFrom(booleanToByteArray(false)), LATER))) + .addColumns( + Column.newBuilder() + .setQualifier(ByteString.copyFromUtf8("longColumn")) + .addCells(createCell(ByteString.copyFrom(Longs.toByteArray(5L)), NOW, "label1")) + .addCells(createCell(ByteString.copyFrom(Longs.toByteArray(2L)), LATER, "label1")) + .build()) + .addColumns( + Column.newBuilder() + .setQualifier(ByteString.copyFromUtf8("stringColumn")) + .addCells(createCell(ByteString.copyFromUtf8("value2"), NOW, "label1")) + .addCells(createCell(ByteString.copyFromUtf8("value1"), LATER, "label1")) + .build()) + .addColumns( + Column.newBuilder() + .setQualifier(ByteString.copyFromUtf8("doubleColumn")) + .addCells(createCell(ByteString.copyFrom(doubleToByteArray(0.66)), NOW, "label1")) + .addCells(createCell(ByteString.copyFrom(doubleToByteArray(5.5)), LATER, "label1")) + .build()) + .addColumns( + Column.newBuilder() + .setQualifier(ByteString.copyFromUtf8("binaryColumn")) + .addCells(createCell(ByteString.copyFrom(new byte[] {0, 1, 2}), NOW, "label1")) + .addCells(createCell(ByteString.copyFrom(new byte[] {2, 1, 0}), LATER, "label2")) + .build()) + .build(); + } + + private static Cell createCell(ByteString value, long timestamp, String... labels) { + Cell.Builder builder = Cell.newBuilder().setValue(value).setTimestampMicros(timestamp); + if (labels.length > 0) { + builder.addAllLabels(ImmutableList.copyOf(labels)); + } + return builder.build(); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteIT.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteIT.java index 25579a8245fd..607c5f0aadf8 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteIT.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/BigtableWriteIT.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.io.gcp.bigtable; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.google.bigtable.admin.v2.ColumnFamily; import com.google.bigtable.admin.v2.CreateTableRequest; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParserTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParserTest.java new file mode 100644 index 000000000000..4bf776b36217 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/bigtable/CellValueParserTest.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.bigtable; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.beam.sdk.schemas.Schema.TypeName.BOOLEAN; +import static org.apache.beam.sdk.schemas.Schema.TypeName.BYTE; +import static org.apache.beam.sdk.schemas.Schema.TypeName.BYTES; +import static org.apache.beam.sdk.schemas.Schema.TypeName.DATETIME; +import static org.apache.beam.sdk.schemas.Schema.TypeName.DOUBLE; +import static org.apache.beam.sdk.schemas.Schema.TypeName.FLOAT; +import static org.apache.beam.sdk.schemas.Schema.TypeName.INT16; +import static org.apache.beam.sdk.schemas.Schema.TypeName.INT32; +import static org.apache.beam.sdk.schemas.Schema.TypeName.INT64; +import static org.apache.beam.sdk.schemas.Schema.TypeName.MAP; +import static org.apache.beam.sdk.schemas.Schema.TypeName.STRING; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.fail; + +import com.google.bigtable.v2.Cell; +import com.google.protobuf.ByteString; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.Test; + +public class CellValueParserTest { + + private static final CellValueParser PARSER = new CellValueParser(); + + @Test + public void shouldParseBooleanTypeFalse() { + byte[] value = new byte[] {0}; + assertEquals(false, PARSER.getCellValue(cell(value), BOOLEAN)); + } + + @Test + public void shouldParseBooleanTypeTrueNotOne() { + byte[] value = new byte[] {1}; + assertEquals(true, PARSER.getCellValue(cell(value), BOOLEAN)); + } + + @Test + public void shouldParseBooleanTypeTrueOne() { + byte[] value = new byte[] {4}; + assertEquals(true, PARSER.getCellValue(cell(value), BOOLEAN)); + } + + @Test + public void shouldFailParseBooleanTypeTooLong() { + byte[] value = new byte[10]; + IllegalArgumentException exception = + assertThrows( + IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), BOOLEAN)); + checkMessage(exception.getMessage(), "Boolean has to be 1-byte long bytearray"); + } + + @Test + public void shouldParseByteType() { + byte[] value = new byte[] {2}; + assertEquals((byte) 2, PARSER.getCellValue(cell(value), BYTE)); + } + + @Test + public void shouldFailTooLongByteValue() { + byte[] value = new byte[3]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), BYTE)); + checkMessage(exception.getMessage(), "Byte has to be 1-byte long bytearray"); + } + + @Test + public void shouldParseInt16Type() { + byte[] value = new byte[] {2, 0}; + assertEquals((short) 512, PARSER.getCellValue(cell(value), INT16)); + } + + @Test + public void shouldFailParseInt16TypeTooLong() { + byte[] value = new byte[6]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), INT16)); + checkMessage(exception.getMessage(), "Int16 has to be 2-bytes long bytearray"); + } + + @Test + public void shouldParseInt32Type() { + byte[] value = new byte[] {0, 2, 0, 0}; + assertEquals(131072, PARSER.getCellValue(cell(value), INT32)); + } + + @Test + public void shouldFailParseInt32TypeTooLong() { + byte[] value = new byte[6]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), INT32)); + checkMessage(exception.getMessage(), "Int32 has to be 4-bytes long bytearray"); + } + + @Test + public void shouldParseInt64Type() { + byte[] value = new byte[] {0, 0, 0, 0, 0, 2, 0, 0}; + assertEquals(131072L, PARSER.getCellValue(cell(value), INT64)); + } + + @Test + public void shouldFailParseInt64TypeTooLong() { + byte[] value = new byte[10]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), INT64)); + checkMessage(exception.getMessage(), "Int64 has to be 8-bytes long bytearray"); + } + + @Test + public void shouldParseFloatType() { + byte[] value = new byte[] {64, 0, 0, 0}; + assertEquals(2.0f, (Float) PARSER.getCellValue(cell(value), FLOAT), 0.001); + } + + @Test + public void shouldFailParseFloatTypeTooLong() { + byte[] value = new byte[10]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), FLOAT)); + checkMessage(exception.getMessage(), "Float has to be 4-bytes long bytearray"); + } + + @Test + public void shouldParseDoubleType() { + byte[] value = new byte[] {64, 21, 51, 51, 51, 51, 51, 51}; + assertEquals(5.3, (Double) PARSER.getCellValue(cell(value), DOUBLE), 0.001); + } + + @Test + public void shouldFailParseDoubleTypeTooLong() { + byte[] value = new byte[10]; + IllegalArgumentException exception = + assertThrows( + IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), DOUBLE)); + checkMessage(exception.getMessage(), "Double has to be 8-bytes long bytearray"); + } + + @Test + public void shouldParseStringType() { + byte[] value = "stringValue".getBytes(UTF_8); + assertEquals("stringValue", PARSER.getCellValue(cell(value), STRING)); + } + + @Test + public void shouldParseDateType() { + byte[] value = "2019-04-06".getBytes(UTF_8); + assertEquals(DateTime.parse("2019-04-06"), PARSER.getCellValue(cell(value), DATETIME)); + } + + @Test + public void shouldParseDatetimeType() { + byte[] value = "2010-06-30T01:20".getBytes(UTF_8); + assertEquals(new DateTime(2010, 6, 30, 1, 20), PARSER.getCellValue(cell(value), DATETIME)); + } + + @Test + public void shouldParseBytesType() { + byte[] value = new byte[] {1, 2, 3, 4, 5}; + assertEquals( + ByteString.copyFrom(value), + ByteString.copyFrom((byte[]) PARSER.getCellValue(cell(value), BYTES))); + } + + @Test + public void shouldFailOnUnsupportedType() { + byte[] value = new byte[0]; + IllegalArgumentException exception = + assertThrows(IllegalArgumentException.class, () -> PARSER.getCellValue(cell(value), MAP)); + checkMessage(exception.getMessage(), "Unsupported cell value type 'MAP'."); + } + + @Test + public void shouldEncodeBooleanTrue() { + ByteString expected = byteString(new byte[] {1}); + ByteString actual = PARSER.valueToByteString(true, BOOLEAN); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeBooleanFalse() { + ByteString expected = byteString(new byte[] {0}); + ByteString actual = PARSER.valueToByteString(false, BOOLEAN); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeLong() { + ByteString expected = byteString(new byte[] {0, 0, 0, 0, 0, 0, 0, 22}); + ByteString actual = PARSER.valueToByteString(22L, INT64); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeInt() { + ByteString expected = byteString(new byte[] {0, 0, 0, 15}); + ByteString actual = PARSER.valueToByteString(15, INT32); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeShort() { + ByteString expected = byteString(new byte[] {0, 5}); + ByteString actual = PARSER.valueToByteString((short) 5, INT16); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeByte() { + ByteString expected = byteString(new byte[] {5}); + ByteString actual = PARSER.valueToByteString((byte) 5, BYTE); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeDouble() { + ByteString expected = byteString(new byte[] {64, 21, 51, 51, 51, 51, 51, 51}); + ByteString actual = PARSER.valueToByteString(5.3d, DOUBLE); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeFloat() { + ByteString expected = byteString(new byte[] {64, 0, 0, 0}); + ByteString actual = PARSER.valueToByteString(2.0f, FLOAT); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeUtf8String() { + ByteString expected = byteString(new byte[] {'b', 'e', 'a', 'm'}); + ByteString actual = PARSER.valueToByteString("beam", STRING); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeByteArray() { + ByteString expected = byteString(new byte[] {0, 2, 1}); + ByteString actual = PARSER.valueToByteString(new byte[] {0, 2, 1}, BYTES); + assertEquals(expected, actual); + } + + @Test + public void shouldEncodeDateTime() { + ByteString expected = byteString("2020-12-06T00:00:00.000Z".getBytes(UTF_8)); + ByteString actual = + PARSER.valueToByteString(new DateTime(2020, 12, 6, 0, 0, 0, DateTimeZone.UTC), DATETIME); + assertEquals(expected, actual); + } + + private ByteString byteString(byte[] bytes) { + return ByteString.copyFrom(bytes); + } + + private Cell cell(byte[] value) { + return Cell.newBuilder().setValue(ByteString.copyFrom(value)).build(); + } + + private void checkMessage(@Nullable String message, String substring) { + if (message != null) { + assertThat(message, containsString(substring)); + } else { + fail(); + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/AdaptiveThrottlerTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/AdaptiveThrottlerTest.java index 4be4b5057880..6db8af3906c3 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/AdaptiveThrottlerTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/AdaptiveThrottlerTest.java @@ -17,11 +17,11 @@ */ package org.apache.beam.sdk.io.gcp.datastore; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import java.util.Random; import org.junit.Test; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/DatastoreV1Test.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/DatastoreV1Test.java index 4d752847c19a..c7fa7ed44775 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/DatastoreV1Test.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/DatastoreV1Test.java @@ -34,13 +34,13 @@ import static org.apache.beam.sdk.io.gcp.datastore.DatastoreV1.Read.translateGqlQueryWithLimitCheck; import static org.apache.beam.sdk.io.gcp.datastore.DatastoreV1.isValidKey; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/EntityToRowRowToEntityTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/EntityToRowRowToEntityTest.java index 159a13164977..66c22619fc15 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/EntityToRowRowToEntityTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/EntityToRowRowToEntityTest.java @@ -31,7 +31,7 @@ import com.google.datastore.v1.Key; import com.google.datastore.v1.Value; import com.google.protobuf.ByteString; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.UUID; @@ -91,7 +91,7 @@ public class EntityToRowRowToEntityTest { makeValue(Collections.singletonList(makeValue(NESTED_ENTITY).build())).build()) .putProperties("double", makeValue(Double.MAX_VALUE).build()) .putProperties( - "bytes", makeValue(ByteString.copyFrom("hello", Charset.defaultCharset())).build()) + "bytes", makeValue(ByteString.copyFrom("hello", StandardCharsets.UTF_8)).build()) .putProperties("string", makeValue("string").build()) .putProperties("nullable", Value.newBuilder().build()) .build(); @@ -105,7 +105,7 @@ public class EntityToRowRowToEntityTest { Arrays.asList("string1", "string2"), Collections.singletonList(row(NESTED_ROW_SCHEMA, Long.MIN_VALUE)), Double.MAX_VALUE, - "hello".getBytes(Charset.defaultCharset()), + "hello".getBytes(StandardCharsets.UTF_8), "string", null); diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOReadIT.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOReadIT.java new file mode 100644 index 000000000000..4986f094e53b --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOReadIT.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import static org.apache.beam.sdk.io.gcp.healthcare.HL7v2IOTestUtil.HEALTHCARE_DATASET_TEMPLATE; + +import java.io.IOException; +import java.net.URISyntaxException; +import org.apache.beam.sdk.PipelineResult; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings({"nullness", "rawtypes", "uninitialized"}) +public class DicomIOReadIT { + private static final String TEST_FILE_PATH = "src/test/resources/DICOM/testDicomFile.dcm"; + private static final String TEST_FILE_STUDY_ID = "study_000000000"; + @Rule public transient TestPipeline pipeline = TestPipeline.create(); + + private String healthcareDataset; + private String project; + private HealthcareApiClient client; + private String storeName = "foo"; + + @Before + public void setup() throws IOException, URISyntaxException { + project = + TestPipeline.testingPipelineOptions() + .as(HealthcareStoreTestPipelineOptions.class) + .getStoreProjectId(); + healthcareDataset = String.format(HEALTHCARE_DATASET_TEMPLATE, project); + client = new HttpHealthcareApiClient(); + + client.createDicomStore(healthcareDataset, storeName); + client.uploadToDicomStore(healthcareDataset + "/dicomStores/" + storeName, TEST_FILE_PATH); + } + + @After + public void deleteDicomStore() throws IOException { + client.deleteDicomStore(healthcareDataset + "/dicomStores/" + storeName); + } + + @Ignore("https://jira.apache.org/jira/browse/BEAM-11376") + @Test + public void testDicomMetadataRead() throws IOException { + String webPath = + String.format( + "%s/dicomStores/%s/dicomWeb/studies/%s", + healthcareDataset, storeName, TEST_FILE_STUDY_ID); + + DicomIO.ReadStudyMetadata.Result result = + pipeline.apply(Create.of(webPath)).apply(DicomIO.readStudyMetadata()); + + PAssert.that(result.getFailedReads()).empty(); + PAssert.that(result.getReadResponse()) + .satisfies( + input -> { + for (String resp : input) { + Assert.assertTrue(resp.contains(TEST_FILE_STUDY_ID)); + } + return null; + }); + + PipelineResult job = pipeline.run(); + + try { + job.cancel(); + } catch (UnsupportedOperationException exc) { + // noop - if runner does not support job.cancel() + } + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOTest.java new file mode 100644 index 000000000000..7e565d1bac1b --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/DicomIOTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import org.apache.beam.sdk.io.gcp.pubsub.PubsubMessage; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class DicomIOTest { + @Rule public final transient TestPipeline pipeline = TestPipeline.create(); + + @Test + public void test_Dicom_failedMetadataRead() { + String badWebPath = "foo"; + + DicomIO.ReadStudyMetadata.Result retrievedData; + retrievedData = pipeline.apply(Create.of(badWebPath)).apply(DicomIO.readStudyMetadata()); + + PAssert.that(retrievedData.getReadResponse()).empty(); + + PAssert.that(retrievedData.getFailedReads()) + .satisfies( + (errors) -> { + Assert.assertTrue(errors.iterator().hasNext()); + return null; + }); + + pipeline.run(); + } + + private PubsubMessage createPubSubMessage(String webpath) { + byte[] badMessageBody; + badMessageBody = webpath.getBytes(UTF_8); + return new PubsubMessage(badMessageBody, null); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOSearchIT.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOSearchIT.java new file mode 100644 index 000000000000..953177dd9da8 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOSearchIT.java @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import static org.apache.beam.sdk.io.gcp.healthcare.HL7v2IOTestUtil.HEALTHCARE_DATASET_TEMPLATE; +import static org.junit.Assert.assertNotEquals; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import java.io.IOException; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.beam.runners.direct.DirectOptions; +import org.apache.beam.sdk.coders.KvCoder; +import org.apache.beam.sdk.coders.MapCoder; +import org.apache.beam.sdk.coders.StringUtf8Coder; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.values.KV; +import org.apache.beam.sdk.values.PCollection; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) +}) +public class FhirIOSearchIT { + + @Parameters(name = "{0}") + public static Collection versions() { + return Arrays.asList("R4"); + } + + @Rule public transient TestPipeline pipeline = TestPipeline.create(); + + private final String project; + private transient HealthcareApiClient client; + private static String healthcareDataset; + private static final String BASE_STORE_ID = + "FHIR_store_search_it_" + System.currentTimeMillis() + "_" + (new SecureRandom().nextInt(32)); + private String fhirStoreId; + private static final int MAX_NUM_OF_SEARCHES = 100; + private List>> input = new ArrayList<>(); + + public String version; + + public FhirIOSearchIT(String version) { + this.version = version; + this.fhirStoreId = BASE_STORE_ID + version; + this.project = + TestPipeline.testingPipelineOptions() + .as(HealthcareStoreTestPipelineOptions.class) + .getStoreProjectId(); + } + + @Before + public void setup() throws Exception { + healthcareDataset = String.format(HEALTHCARE_DATASET_TEMPLATE, project); + if (client == null) { + this.client = new HttpHealthcareApiClient(); + } + client.createFhirStore(healthcareDataset, fhirStoreId, version, ""); + + List bundles = FhirIOTestUtil.BUNDLES.get(version); + FhirIOTestUtil.executeFhirBundles( + client, healthcareDataset + "/fhirStores/" + fhirStoreId, bundles); + + JsonArray fhirResources = + JsonParser.parseString(bundles.get(0)).getAsJsonObject().getAsJsonArray("entry"); + HashMap searchParameters = new HashMap<>(); + searchParameters.put("_count", Integer.toString(100)); + int searches = 0; + for (JsonElement resource : fhirResources) { + input.add( + KV.of( + resource + .getAsJsonObject() + .getAsJsonObject("resource") + .get("resourceType") + .getAsString(), + searchParameters)); + searches++; + if (searches > MAX_NUM_OF_SEARCHES) { + break; + } + } + } + + @AfterClass + public static void teardown() throws IOException { + HealthcareApiClient client = new HttpHealthcareApiClient(); + for (String version : versions()) { + client.deleteFhirStore(healthcareDataset + "/fhirStores/" + BASE_STORE_ID + version); + } + } + + @Test + public void testFhirIOSearch() { + pipeline.getOptions().as(DirectOptions.class).setBlockOnRun(false); + + // Search using the resource type of each written resource and empty search parameters. + PCollection>> searchConfigs = + pipeline.apply( + Create.of(input) + .withCoder( + KvCoder.of( + StringUtf8Coder.of(), + MapCoder.of(StringUtf8Coder.of(), StringUtf8Coder.of())))); + FhirIO.Search.Result result = + searchConfigs.apply( + FhirIO.searchResources(healthcareDataset + "/fhirStores/" + fhirStoreId)); + + // Verify that there are no failures. + PAssert.that(result.getFailedSearches()).empty(); + // Verify that none of the result resource sets are empty sets. + PCollection resources = result.getResources(); + PAssert.that(resources) + .satisfies( + input -> { + for (JsonArray resource : input) { + assertNotEquals(resource.size(), 0); + } + return null; + }); + + pipeline.run().waitUntilFinish(); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOTest.java index 7d79f44a1e8c..14df1221941c 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/FhirIOTest.java @@ -17,10 +17,12 @@ */ package org.apache.beam.sdk.io.gcp.healthcare; +import com.google.gson.JsonArray; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.testing.TestPipeline; import org.apache.beam.sdk.transforms.Count; @@ -58,6 +60,25 @@ public void test_FhirIO_failedReads() { pipeline.run(); } + @Test + public void test_FhirIO_failedSearches() { + List>> input = Arrays.asList(KV.of("resource-type-1", null)); + FhirIO.Search.Result searchResult = + pipeline.apply(Create.of(input)).apply(FhirIO.searchResources("bad-store")); + + PCollection> failed = searchResult.getFailedSearches(); + + PCollection resources = searchResult.getResources(); + + PCollection failedMsgIds = + failed.apply( + MapElements.into(TypeDescriptors.strings()).via(HealthcareIOError::getDataResource)); + + PAssert.that(failedMsgIds).containsInAnyOrder(Arrays.asList("bad-store")); + PAssert.that(resources).empty(); + pipeline.run(); + } + @Test public void test_FhirIO_failedWrites() { String badBundle = "bad"; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParserTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParserTest.java new file mode 100644 index 000000000000..40e40f008e08 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/healthcare/WebPathParserTest.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.healthcare; + +import java.io.IOException; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class WebPathParserTest { + + @Test + public void test_parsedAllElements() throws IOException { + String webpathStr = + "projects/foo/location/earth/datasets/bar/dicomStores/fee/dicomWeb/studies/abc/series/xyz/instances/123"; + + WebPathParser parser = new WebPathParser(); + WebPathParser.DicomWebPath dicomWebPath = parser.parseDicomWebpath(webpathStr); + + Assert.assertNotNull(dicomWebPath); + Assert.assertEquals("foo", dicomWebPath.project); + Assert.assertEquals("earth", dicomWebPath.location); + Assert.assertEquals("bar", dicomWebPath.dataset); + Assert.assertEquals("fee", dicomWebPath.storeId); + Assert.assertEquals("abc", dicomWebPath.studyId); + Assert.assertEquals("xyz", dicomWebPath.seriesId); + Assert.assertEquals("123", dicomWebPath.instanceId); + Assert.assertEquals( + "projects/foo/location/earth/datasets/bar/dicomStores/fee", dicomWebPath.dicomStorePath); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubIOTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubIOTest.java index d8569c9555ed..d231e315481e 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubIOTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubIOTest.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.io.gcp.pubsub; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; @@ -26,7 +27,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import com.google.api.client.util.Clock; import com.google.protobuf.ByteString; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessagePayloadOnlyCoderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessagePayloadOnlyCoderTest.java index b132814921de..cbdf08515b95 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessagePayloadOnlyCoderTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessagePayloadOnlyCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.pubsub; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.nio.charset.StandardCharsets; import org.apache.beam.sdk.coders.Coder; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesAndMessageIdCoderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesAndMessageIdCoderTest.java index 5a061ad2cd56..1967bb1e4c15 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesAndMessageIdCoderTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesAndMessageIdCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.pubsub; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.nio.charset.StandardCharsets; import java.util.Map; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesCoderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesCoderTest.java index eb33fd3895a4..67267a9e2685 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesCoderTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithAttributesCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.pubsub; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.nio.charset.StandardCharsets; import java.util.Map; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithMessageIdCoderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithMessageIdCoderTest.java index 586b53687f39..79c719a8f766 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithMessageIdCoderTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubMessageWithMessageIdCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.pubsub; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.nio.charset.StandardCharsets; import org.apache.beam.sdk.coders.Coder; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubUnboundedSourceTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubUnboundedSourceTest.java index 6025449b49bc..418ed4ff51c1 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubUnboundedSourceTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsub/PubsubUnboundedSourceTest.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.io.gcp.pubsub; import static junit.framework.TestCase.assertFalse; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; @@ -27,7 +28,6 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.api.client.util.Clock; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTrackerTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTrackerTest.java new file mode 100644 index 000000000000..f34ebb6a745e --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetByteRangeTrackerTest.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.StatusCode.Code; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.internal.CheckedApiException; +import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker.Progress; +import org.apache.beam.sdk.transforms.splittabledofn.SplitResult; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Stopwatch; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Ticker; +import org.joda.time.Duration; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Spy; + +@RunWith(JUnit4.class) +@SuppressWarnings("initialization.fields.uninitialized") +public class OffsetByteRangeTrackerTest { + private static final double IGNORED_FRACTION = -10000000.0; + private static final long MIN_BYTES = 1000; + private static final OffsetRange RANGE = new OffsetRange(123L, Long.MAX_VALUE); + private final TopicBacklogReader reader = mock(TopicBacklogReader.class); + + @Spy Ticker ticker; + private OffsetByteRangeTracker tracker; + + @Before + public void setUp() { + initMocks(this); + when(ticker.read()).thenReturn(0L); + tracker = + new OffsetByteRangeTracker( + RANGE, reader, Stopwatch.createUnstarted(ticker), Duration.millis(500), MIN_BYTES); + } + + @Test + public void progressTracked() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(123), 10))); + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(124), 11))); + when(reader.computeMessageStats(Offset.of(125))) + .thenReturn(ComputeMessageStatsResponse.newBuilder().setMessageBytes(1000).build()); + Progress progress = tracker.getProgress(); + assertEquals(21, progress.getWorkCompleted(), .0001); + assertEquals(1000, progress.getWorkRemaining(), .0001); + } + + @Test + public void getProgressStatsFailure() { + when(reader.computeMessageStats(Offset.of(123))) + .thenThrow(new CheckedApiException(Code.INTERNAL).underlying); + assertThrows(ApiException.class, tracker::getProgress); + } + + @Test + @SuppressWarnings({"dereference.of.nullable", "argument.type.incompatible"}) + public void claimSplitSuccess() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES))); + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(10_000), MIN_BYTES))); + SplitResult splits = tracker.trySplit(IGNORED_FRACTION); + assertEquals(RANGE.getFrom(), splits.getPrimary().getFrom()); + assertEquals(10_001, splits.getPrimary().getTo()); + assertEquals(10_001, splits.getResidual().getFrom()); + assertEquals(Long.MAX_VALUE, splits.getResidual().getTo()); + assertEquals(splits.getPrimary(), tracker.currentRestriction()); + tracker.checkDone(); + assertNull(tracker.trySplit(IGNORED_FRACTION)); + } + + @Test + @SuppressWarnings({"dereference.of.nullable", "argument.type.incompatible"}) + public void splitWithoutClaimEmpty() { + when(ticker.read()).thenReturn(100000000000000L); + SplitResult splits = tracker.trySplit(IGNORED_FRACTION); + assertEquals(RANGE.getFrom(), splits.getPrimary().getFrom()); + assertEquals(RANGE.getFrom(), splits.getPrimary().getTo()); + assertEquals(RANGE, splits.getResidual()); + assertEquals(splits.getPrimary(), tracker.currentRestriction()); + tracker.checkDone(); + assertNull(tracker.trySplit(IGNORED_FRACTION)); + } + + @Test + public void unboundedNotDone() { + assertThrows(IllegalStateException.class, tracker::checkDone); + } + + @Test + public void cannotClaimBackwards() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES))); + assertThrows( + IllegalArgumentException.class, + () -> tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES))); + assertThrows( + IllegalArgumentException.class, + () -> tracker.tryClaim(OffsetByteProgress.of(Offset.of(999), MIN_BYTES))); + } + + @Test + public void cannotClaimSplitRange() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES))); + assertTrue(tracker.trySplit(IGNORED_FRACTION) != null); + assertFalse(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_001), MIN_BYTES))); + } + + @Test + public void cannotSplitNotEnoughBytesOrTime() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES - 2))); + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_001), 1))); + when(ticker.read()).thenReturn(100_000_000L); + assertTrue(tracker.trySplit(IGNORED_FRACTION) == null); + } + + @Test + public void canSplitTimeOnly() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES - 2))); + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_001), 1))); + when(ticker.read()).thenReturn(1_000_000_000L); + assertTrue(tracker.trySplit(IGNORED_FRACTION) != null); + } + + @Test + public void canSplitBytesOnly() { + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_000), MIN_BYTES - 2))); + assertTrue(tracker.tryClaim(OffsetByteProgress.of(Offset.of(1_001), 2))); + when(ticker.read()).thenReturn(100_000_000L); + assertTrue(tracker.trySplit(IGNORED_FRACTION) != null); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMarkTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMarkTest.java deleted file mode 100644 index 4c55d8baedcc..000000000000 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/OffsetCheckpointMarkTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; - -import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.util.Map; -import org.apache.beam.sdk.coders.Coder; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.MockitoAnnotations; - -@RunWith(JUnit4.class) -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) -public class OffsetCheckpointMarkTest { - @Captor private ArgumentCaptor> mapCaptor; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } - - @Test - public void finalizeFinalizesWithOffsets() throws Exception { - Map map = - ImmutableMap.of(Partition.of(10), Offset.of(15), Partition.of(85), Offset.of(0)); - OffsetFinalizer finalizer = mock(OffsetFinalizer.class); - OffsetCheckpointMark mark = new OffsetCheckpointMark(finalizer, map); - mark.finalizeCheckpoint(); - verify(finalizer).finalizeOffsets(mapCaptor.capture()); - assertThat(mapCaptor.getValue(), equalTo(map)); - } - - @Test - public void coderDropsFinalizerKeepsOffsets() throws Exception { - Coder coder = OffsetCheckpointMark.getCoder(); - OffsetFinalizer finalizer = mock(OffsetFinalizer.class); - OffsetCheckpointMark mark = - new OffsetCheckpointMark( - finalizer, - ImmutableMap.of(Partition.of(10), Offset.of(15), Partition.of(85), Offset.of(0))); - - ByteArrayOutputStream output = new ByteArrayOutputStream(); - coder.encode(mark, output); - ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); - OffsetCheckpointMark decoded = coder.decode(input); - assertThat(mark.partitionOffsetMap, equalTo(decoded.partitionOffsetMap)); - decoded.finalizeCheckpoint(); - verifyZeroInteractions(finalizer); - } -} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdfTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdfTest.java new file mode 100644 index 000000000000..b9bd860c2a83 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PerSubscriptionPartitionSdfTest.java @@ -0,0 +1,189 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.testing.UnitTestExamples.example; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import com.google.api.core.ApiFutures; +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.StatusCode.Code; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.Partition; +import com.google.cloud.pubsublite.SubscriptionPath; +import com.google.cloud.pubsublite.internal.CheckedApiException; +import com.google.cloud.pubsublite.internal.testing.FakeApiService; +import com.google.cloud.pubsublite.internal.wire.Committer; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.Nonnull; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.DoFn.BundleFinalizer; +import org.apache.beam.sdk.transforms.DoFn.OutputReceiver; +import org.apache.beam.sdk.transforms.DoFn.ProcessContinuation; +import org.apache.beam.sdk.transforms.SerializableBiFunction; +import org.apache.beam.sdk.transforms.SerializableFunction; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.joda.time.Duration; +import org.joda.time.Instant; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.stubbing.Answer; + +@RunWith(JUnit4.class) +@SuppressWarnings("initialization.fields.uninitialized") +public class PerSubscriptionPartitionSdfTest { + private static final Duration MAX_SLEEP_TIME = + Duration.standardMinutes(10).plus(Duration.millis(10)); + private static final OffsetRange RESTRICTION = new OffsetRange(1, Long.MAX_VALUE); + private static final SubscriptionPartition PARTITION = + SubscriptionPartition.of(example(SubscriptionPath.class), example(Partition.class)); + + @Mock SerializableFunction offsetReaderFactory; + + @Mock + SerializableBiFunction< + SubscriptionPartition, OffsetRange, RestrictionTracker> + trackerFactory; + + @Mock SubscriptionPartitionProcessorFactory processorFactory; + @Mock SerializableFunction committerFactory; + + @Mock InitialOffsetReader initialOffsetReader; + @Spy RestrictionTracker tracker; + @Mock OutputReceiver output; + @Mock BundleFinalizer finalizer; + @Mock SubscriptionPartitionProcessor processor; + + abstract static class FakeCommitter extends FakeApiService implements Committer {} + + @Spy FakeCommitter committer; + + PerSubscriptionPartitionSdf sdf; + + @Before + public void setUp() { + initMocks(this); + when(offsetReaderFactory.apply(any())).thenReturn(initialOffsetReader); + when(processorFactory.newProcessor(any(), any(), any())).thenReturn(processor); + when(trackerFactory.apply(any(), any())).thenReturn(tracker); + when(committerFactory.apply(any())).thenReturn(committer); + when(tracker.currentRestriction()).thenReturn(RESTRICTION); + sdf = + new PerSubscriptionPartitionSdf( + MAX_SLEEP_TIME, + offsetReaderFactory, + trackerFactory, + processorFactory, + committerFactory); + } + + @Test + public void getInitialRestrictionReadSuccess() { + when(initialOffsetReader.read()).thenReturn(example(Offset.class)); + OffsetRange range = sdf.getInitialRestriction(PARTITION); + assertEquals(example(Offset.class).value(), range.getFrom()); + assertEquals(Long.MAX_VALUE, range.getTo()); + verify(offsetReaderFactory).apply(PARTITION); + } + + @Test + public void getInitialRestrictionReadFailure() { + when(initialOffsetReader.read()).thenThrow(new CheckedApiException(Code.INTERNAL).underlying); + assertThrows(ApiException.class, () -> sdf.getInitialRestriction(PARTITION)); + } + + @Test + public void newTrackerCallsFactory() { + assertSame(tracker, sdf.newTracker(PARTITION, RESTRICTION)); + verify(trackerFactory).apply(PARTITION, RESTRICTION); + } + + @Test + @SuppressWarnings("argument.type.incompatible") + public void process() throws Exception { + when(processor.waitForCompletion(MAX_SLEEP_TIME)).thenReturn(ProcessContinuation.resume()); + when(processorFactory.newProcessor(any(), any(), any())) + .thenAnswer( + args -> { + @Nonnull + RestrictionTracker wrapped = args.getArgument(1); + when(tracker.tryClaim(any())).thenReturn(true).thenReturn(false); + assertTrue(wrapped.tryClaim(OffsetByteProgress.of(example(Offset.class), 123))); + assertFalse(wrapped.tryClaim(OffsetByteProgress.of(Offset.of(333333), 123))); + return processor; + }); + AtomicReference callbackRef = new AtomicReference<>(null); + doAnswer( + (Answer) + args -> { + callbackRef.set(args.getArgument(1)); + return null; + }) + .when(finalizer) + .afterBundleCommit(any(), any()); + doReturn(Optional.of(example(Offset.class))).when(processor).lastClaimed(); + assertEquals( + ProcessContinuation.resume(), sdf.processElement(tracker, PARTITION, output, finalizer)); + verify(processorFactory).newProcessor(eq(PARTITION), any(), eq(output)); + InOrder order = inOrder(processor); + order.verify(processor).start(); + order.verify(processor).waitForCompletion(MAX_SLEEP_TIME); + order.verify(processor).lastClaimed(); + order.verify(processor).close(); + verify(finalizer).afterBundleCommit(eq(Instant.ofEpochMilli(Long.MAX_VALUE)), any()); + assertTrue(callbackRef.get() != null); + when(committer.commitOffset(any())).thenReturn(ApiFutures.immediateFuture(null)); + callbackRef.get().onBundleSuccess(); + InOrder order2 = inOrder(committerFactory, committer); + order2.verify(committer).startAsync(); + order2.verify(committer).awaitRunning(); + order2.verify(committer).commitOffset(Offset.of(example(Offset.class).value() + 1)); + order2.verify(committer).stopAsync(); + order2.verify(committer).awaitTerminated(); + } + + @Test + @SuppressWarnings("return.type.incompatible") + public void dofnIsSerializable() throws Exception { + ObjectOutputStream output = new ObjectOutputStream(new ByteArrayOutputStream()); + output.writeObject( + new PerSubscriptionPartitionSdf( + MAX_SLEEP_TIME, x -> null, (x, y) -> null, (x, y, z) -> null, (x) -> null)); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSinkTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSinkTest.java index 01a61b846d19..dd28deb3554e 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSinkTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteSinkTest.java @@ -32,6 +32,7 @@ import com.google.api.core.ApiFutures; import com.google.api.core.ApiService; import com.google.api.core.SettableApiFuture; +import com.google.api.gax.rpc.StatusCode.Code; import com.google.cloud.pubsublite.CloudRegion; import com.google.cloud.pubsublite.CloudZone; import com.google.cloud.pubsublite.Message; @@ -41,12 +42,11 @@ import com.google.cloud.pubsublite.PublishMetadata; import com.google.cloud.pubsublite.TopicName; import com.google.cloud.pubsublite.TopicPath; +import com.google.cloud.pubsublite.internal.CheckedApiException; import com.google.cloud.pubsublite.internal.ExtractStatus; -import com.google.cloud.pubsublite.internal.FakeApiService; import com.google.cloud.pubsublite.internal.Publisher; +import com.google.cloud.pubsublite.internal.testing.FakeApiService; import com.google.protobuf.ByteString; -import io.grpc.Status; -import io.grpc.StatusException; import java.util.Arrays; import java.util.Optional; import java.util.concurrent.CountDownLatch; @@ -82,18 +82,14 @@ abstract static class PublisherFakeService extends FakeApiService @Spy private PublisherFakeService publisher; private PublisherOptions defaultOptions() { - try { - return PublisherOptions.newBuilder() - .setTopicPath( - TopicPath.newBuilder() - .setProject(ProjectNumber.of(9)) - .setName(TopicName.of("abc")) - .setLocation(CloudZone.of(CloudRegion.of("us-east1"), 'a')) - .build()) - .build(); - } catch (StatusException e) { - throw e.getStatus().asRuntimeException(); - } + return PublisherOptions.newBuilder() + .setTopicPath( + TopicPath.newBuilder() + .setProject(ProjectNumber.of(9)) + .setName(TopicName.of("abc")) + .setLocation(CloudZone.of(CloudRegion.of("us-east1"), 'a')) + .build()) + .build(); } private final PubsubLiteSink sink = new PubsubLiteSink(defaultOptions()); @@ -153,13 +149,14 @@ public void manyMessagePublishes() throws Exception { public void singleExceptionWhenProcessing() { Message message1 = Message.builder().build(); when(publisher.publish(message1)) - .thenReturn(ApiFutures.immediateFailedFuture(Status.INTERNAL.asException())); + .thenReturn( + ApiFutures.immediateFailedFuture(new CheckedApiException(Code.INTERNAL).underlying)); PipelineExecutionException e = assertThrows(PipelineExecutionException.class, () -> runWith(message1)); verify(publisher).publish(message1); - Optional statusOr = ExtractStatus.extract(e.getCause()); + Optional statusOr = ExtractStatus.extract(e.getCause()); assertTrue(statusOr.isPresent()); - assertThat(statusOr.get().getCode(), equalTo(Status.Code.INTERNAL)); + assertThat(statusOr.get().code(), equalTo(Code.INTERNAL)); } @Test @@ -195,9 +192,9 @@ public void exceptionMixedWithOK() throws Exception { try { startedLatch.await(); future1.set(PublishMetadata.of(Partition.of(1), Offset.of(2))); - future2.setException(Status.INTERNAL.asException()); + future2.setException(new CheckedApiException(Code.INTERNAL).underlying); future3.set(PublishMetadata.of(Partition.of(1), Offset.of(3))); - } catch (StatusException | InterruptedException e) { + } catch (InterruptedException e) { fail(); throw new RuntimeException(e); } @@ -207,9 +204,9 @@ public void exceptionMixedWithOK() throws Exception { verify(publisher, times(3)).publish(publishedMessageCaptor.capture()); assertThat( publishedMessageCaptor.getAllValues(), containsInAnyOrder(message1, message2, message3)); - Optional statusOr = ExtractStatus.extract(e.getCause()); + Optional statusOr = ExtractStatus.extract(e.getCause()); assertTrue(statusOr.isPresent()); - assertThat(statusOr.get().getCode(), equalTo(Status.Code.INTERNAL)); + assertThat(statusOr.get().code(), equalTo(Code.INTERNAL)); exec.shutdownNow(); } @@ -231,12 +228,12 @@ public void listenerExceptionOnBundleFinish() throws Exception { () -> { PipelineExecutionException e = assertThrows(PipelineExecutionException.class, () -> runWith(message1)); - Optional statusOr = ExtractStatus.extract(e.getCause()); + Optional statusOr = ExtractStatus.extract(e.getCause()); assertTrue(statusOr.isPresent()); - assertThat(statusOr.get().getCode(), equalTo(Status.Code.INTERNAL)); + assertThat(statusOr.get().code(), equalTo(Code.INTERNAL)); }); publishFuture.get(); - listener.failed(null, Status.INTERNAL.asException()); + listener.failed(null, new CheckedApiException(Code.INTERNAL).underlying); future.set(PublishMetadata.of(Partition.of(1), Offset.of(2))); executorFuture.get(); } diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReaderTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReaderTest.java deleted file mode 100644 index 6c652c4bd554..000000000000 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/PubsubLiteUnboundedReaderTest.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.gcp.pubsublite; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.sameInstance; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import com.google.api.core.ApiFutures; -import com.google.cloud.pubsublite.Offset; -import com.google.cloud.pubsublite.Partition; -import com.google.cloud.pubsublite.internal.FakeApiService; -import com.google.cloud.pubsublite.internal.PullSubscriber; -import com.google.cloud.pubsublite.internal.wire.Committer; -import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; -import com.google.cloud.pubsublite.proto.Cursor; -import com.google.cloud.pubsublite.proto.SequencedMessage; -import com.google.protobuf.Duration; -import com.google.protobuf.Timestamp; -import com.google.protobuf.util.Durations; -import com.google.protobuf.util.Timestamps; -import io.grpc.Status; -import io.grpc.StatusException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import org.apache.beam.sdk.io.UnboundedSource; -import org.apache.beam.sdk.io.UnboundedSource.CheckpointMark; -import org.apache.beam.sdk.io.gcp.pubsublite.PubsubLiteUnboundedReader.SubscriberState; -import org.apache.beam.sdk.transforms.windowing.BoundedWindow; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Ticker; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; -import org.joda.time.Instant; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; - -@RunWith(JUnit4.class) -@SuppressWarnings({ - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) -public class PubsubLiteUnboundedReaderTest { - @Mock private PullSubscriber subscriber5; - - @Mock private PullSubscriber subscriber8; - - abstract static class CommitterFakeService extends FakeApiService implements Committer {} - - private static class FakeTicker extends Ticker { - private Timestamp time; - - FakeTicker(Timestamp start) { - time = start; - } - - @Override - public long read() { - return Timestamps.toNanos(time); - } - - public void advance(Duration duration) { - time = Timestamps.add(time, duration); - } - } - - @Spy private CommitterFakeService committer5; - @Spy private CommitterFakeService committer8; - - @SuppressWarnings("unchecked") - private final UnboundedSource source = mock(UnboundedSource.class); - - @Mock private TopicBacklogReader backlogReader; - - private final FakeTicker ticker = new FakeTicker(Timestamps.fromSeconds(450)); - - private final PubsubLiteUnboundedReader reader; - - private static SequencedMessage exampleMessage(Offset offset, Timestamp publishTime) { - return SequencedMessage.newBuilder() - .setPublishTime(publishTime) - .setCursor(Cursor.newBuilder().setOffset(offset.value())) - .setSizeBytes(100) - .build(); - } - - private static Timestamp randomMilliAllignedTimestamp() { - return Timestamps.fromMillis(new Random().nextInt(Integer.MAX_VALUE)); - } - - private static Instant toInstant(Timestamp timestamp) { - return new Instant(Timestamps.toMillis(timestamp)); - } - - public PubsubLiteUnboundedReaderTest() throws StatusException { - MockitoAnnotations.initMocks(this); - SubscriberState state5 = new SubscriberState(); - state5.subscriber = subscriber5; - state5.committer = committer5; - SubscriberState state8 = new SubscriberState(); - state8.subscriber = subscriber8; - state8.committer = committer8; - reader = - new PubsubLiteUnboundedReader( - source, - ImmutableMap.of(Partition.of(5), state5, Partition.of(8), state8), - backlogReader, - ticker); - } - - @Test - public void sourceReturnsSource() { - assertThat(reader.getCurrentSource(), sameInstance(source)); - } - - @Test - public void startPullsFromAllSubscribers() throws Exception { - when(subscriber5.pull()).thenReturn(ImmutableList.of()); - when(subscriber8.pull()).thenReturn(ImmutableList.of()); - assertFalse(reader.start()); - verify(subscriber5).pull(); - verify(subscriber8).pull(); - assertThat(reader.getWatermark(), equalTo(BoundedWindow.TIMESTAMP_MIN_VALUE)); - verifyNoMoreInteractions(subscriber5, subscriber8); - } - - @Test - public void startReturnsTrueIfMessagesExist() throws Exception { - Timestamp ts = randomMilliAllignedTimestamp(); - SequencedMessage message = exampleMessage(Offset.of(10), ts); - when(subscriber5.pull()).thenReturn(ImmutableList.of(message)); - when(subscriber8.pull()).thenReturn(ImmutableList.of()); - assertTrue(reader.start()); - verify(subscriber5).pull(); - verify(subscriber8).pull(); - assertThat(reader.getCurrent(), equalTo(message)); - assertThat(reader.getWatermark(), equalTo(BoundedWindow.TIMESTAMP_MIN_VALUE)); - assertThat(reader.getCurrentTimestamp(), equalTo(toInstant(ts))); - verifyNoMoreInteractions(subscriber5, subscriber8); - } - - @Test - public void advanceSetsWatermarkAfterAllSubscribersPopulated() throws Exception { - Timestamp ts1 = randomMilliAllignedTimestamp(); - Timestamp ts2 = randomMilliAllignedTimestamp(); - SequencedMessage message1 = exampleMessage(Offset.of(10), ts1); - SequencedMessage message2 = exampleMessage(Offset.of(888), ts2); - when(subscriber5.pull()).thenReturn(ImmutableList.of(message1)); - when(subscriber8.pull()).thenReturn(ImmutableList.of(message2)); - assertTrue(reader.start()); - verify(subscriber5).pull(); - verify(subscriber8).pull(); - verifyNoMoreInteractions(subscriber5, subscriber8); - reset(subscriber5, subscriber8); - List messages = new ArrayList<>(); - messages.add(reader.getCurrent()); - assertThat(reader.getWatermark(), equalTo(BoundedWindow.TIMESTAMP_MIN_VALUE)); - // This could be either original message, but is the current message from the reader. - assertThat(reader.getCurrentTimestamp(), equalTo(toInstant(messages.get(0).getPublishTime()))); - assertTrue(reader.advance()); - messages.add(reader.getCurrent()); - assertThat( - reader.getWatermark(), - equalTo(Collections.min(Arrays.asList(toInstant(ts1), toInstant(ts2))))); - assertThat(reader.getCurrentTimestamp(), equalTo(toInstant(messages.get(1).getPublishTime()))); - // Second pull yields no more messages. - when(subscriber5.pull()).thenReturn(ImmutableList.of()); - when(subscriber8.pull()).thenReturn(ImmutableList.of()); - assertFalse(reader.advance()); - verify(subscriber5).pull(); - verify(subscriber8).pull(); - verifyNoMoreInteractions(subscriber5, subscriber8); - } - - @Test - public void multipleMessagesInPullReadsAllBeforeNextPull() throws Exception { - SequencedMessage message1 = exampleMessage(Offset.of(10), randomMilliAllignedTimestamp()); - SequencedMessage message2 = exampleMessage(Offset.of(888), randomMilliAllignedTimestamp()); - SequencedMessage message3 = exampleMessage(Offset.of(999), randomMilliAllignedTimestamp()); - when(subscriber5.pull()) - .thenReturn(ImmutableList.of(message1, message2, message3)) - .thenReturn(ImmutableList.of()); - when(subscriber8.pull()).thenReturn(ImmutableList.of()).thenReturn(ImmutableList.of()); - assertTrue(reader.start()); - assertTrue(reader.advance()); - assertTrue(reader.advance()); - assertFalse(reader.advance()); - verify(subscriber5, times(2)).pull(); - verify(subscriber8, times(2)).pull(); - verifyNoMoreInteractions(subscriber5, subscriber8); - } - - @Test - public void messagesOnSubsequentPullsProcessed() throws Exception { - SequencedMessage message1 = exampleMessage(Offset.of(10), randomMilliAllignedTimestamp()); - SequencedMessage message2 = exampleMessage(Offset.of(888), randomMilliAllignedTimestamp()); - SequencedMessage message3 = exampleMessage(Offset.of(999), randomMilliAllignedTimestamp()); - when(subscriber5.pull()) - .thenReturn(ImmutableList.of(message1)) - .thenReturn(ImmutableList.of(message2)) - .thenReturn(ImmutableList.of()); - when(subscriber8.pull()) - .thenReturn(ImmutableList.of()) - .thenReturn(ImmutableList.of(message3)) - .thenReturn(ImmutableList.of()); - assertTrue(reader.start()); - assertTrue(reader.advance()); - assertTrue(reader.advance()); - assertFalse(reader.advance()); - verify(subscriber5, times(3)).pull(); - verify(subscriber8, times(3)).pull(); - verifyNoMoreInteractions(subscriber5, subscriber8); - } - - @Test - public void checkpointMarkFinalizeCommits() throws Exception { - Timestamp ts = randomMilliAllignedTimestamp(); - SequencedMessage message = exampleMessage(Offset.of(10), ts); - when(subscriber5.pull()).thenReturn(ImmutableList.of(message)); - when(subscriber8.pull()).thenReturn(ImmutableList.of()); - assertTrue(reader.start()); - verify(subscriber5).pull(); - verify(subscriber8).pull(); - verifyNoMoreInteractions(subscriber5, subscriber8); - - CheckpointMark mark = reader.getCheckpointMark(); - - when(committer5.commitOffset(Offset.of(10))).thenReturn(ApiFutures.immediateFuture(null)); - mark.finalizeCheckpoint(); - verify(committer5).commitOffset(Offset.of(10)); - } - - @Test - public void splitBacklogBytes_returnsUnknownBacklogOnError() throws Exception { - when(backlogReader.computeMessageStats(ImmutableMap.of())) - .thenReturn(ApiFutures.immediateFailedFuture(new StatusException(Status.UNAVAILABLE))); - assertThat(PubsubLiteUnboundedReader.BACKLOG_UNKNOWN, equalTo(reader.getSplitBacklogBytes())); - } - - @Test - public void splitBacklogBytes_computesBacklog() throws Exception { - ComputeMessageStatsResponse response = - ComputeMessageStatsResponse.newBuilder().setMessageBytes(40).build(); - when(backlogReader.computeMessageStats(ImmutableMap.of())) - .thenReturn(ApiFutures.immediateFuture(response)); - assertThat(response.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - } - - @SuppressWarnings("unchecked") - @Test - public void splitBacklogBytes_computesBacklogOncePerTenSeconds() throws Exception { - ComputeMessageStatsResponse response1 = - ComputeMessageStatsResponse.newBuilder().setMessageBytes(40).build(); - ComputeMessageStatsResponse response2 = - ComputeMessageStatsResponse.newBuilder().setMessageBytes(50).build(); - - when(backlogReader.computeMessageStats(ImmutableMap.of())) - .thenReturn(ApiFutures.immediateFuture(response1), ApiFutures.immediateFuture(response2)); - - assertThat(response1.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - ticker.advance(Durations.fromSeconds(10)); - assertThat(response1.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - ticker.advance(Durations.fromSeconds(1)); - assertThat(response2.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - } - - @SuppressWarnings("unchecked") - @Test - public void splitBacklogBytes_oldValueExpiresAfterOneMinute() throws Exception { - ComputeMessageStatsResponse response = - ComputeMessageStatsResponse.newBuilder().setMessageBytes(40).build(); - - when(backlogReader.computeMessageStats(ImmutableMap.of())) - .thenReturn( - ApiFutures.immediateFuture(response), - ApiFutures.immediateFailedFuture(new StatusException(Status.UNAVAILABLE))); - - assertThat(response.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - ticker.advance(Durations.fromSeconds(30)); - assertThat(response.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - ticker.advance(Durations.fromSeconds(31)); - assertThat(PubsubLiteUnboundedReader.BACKLOG_UNKNOWN, equalTo(reader.getSplitBacklogBytes())); - } - - @Test - public void splitBacklogBytes_usesCorrectCursorValues() throws Exception { - SequencedMessage message1 = exampleMessage(Offset.of(10), randomMilliAllignedTimestamp()); - SequencedMessage message2 = exampleMessage(Offset.of(888), randomMilliAllignedTimestamp()); - ComputeMessageStatsResponse response = - ComputeMessageStatsResponse.newBuilder().setMessageBytes(40).build(); - - when(subscriber5.pull()).thenReturn(ImmutableList.of(message1)); - when(subscriber8.pull()).thenReturn(ImmutableList.of(message2)); - when(backlogReader.computeMessageStats( - ImmutableMap.of(Partition.of(5), Offset.of(10), Partition.of(8), Offset.of(888)))) - .thenReturn(ApiFutures.immediateFuture(response)); - - assertTrue(reader.start()); - assertTrue(reader.advance()); - assertThat(response.getMessageBytes(), equalTo(reader.getSplitBacklogBytes())); - } -} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImplTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImplTest.java new file mode 100644 index 000000000000..dbf3b939d083 --- /dev/null +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/SubscriptionPartitionProcessorImplTest.java @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.gcp.pubsublite; + +import static com.google.cloud.pubsublite.internal.testing.UnitTestExamples.example; +import static org.apache.beam.sdk.io.gcp.pubsublite.SubscriberOptions.DEFAULT_FLOW_CONTROL; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import com.google.api.core.ApiFutures; +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.StatusCode.Code; +import com.google.cloud.pubsublite.Offset; +import com.google.cloud.pubsublite.internal.CheckedApiException; +import com.google.cloud.pubsublite.internal.testing.FakeApiService; +import com.google.cloud.pubsublite.internal.wire.Subscriber; +import com.google.cloud.pubsublite.proto.Cursor; +import com.google.cloud.pubsublite.proto.FlowControlRequest; +import com.google.cloud.pubsublite.proto.SeekRequest; +import com.google.cloud.pubsublite.proto.SequencedMessage; +import com.google.protobuf.util.Timestamps; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import org.apache.beam.sdk.io.range.OffsetRange; +import org.apache.beam.sdk.transforms.DoFn.OutputReceiver; +import org.apache.beam.sdk.transforms.DoFn.ProcessContinuation; +import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableList; +import org.joda.time.Duration; +import org.joda.time.Instant; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Spy; + +@RunWith(JUnit4.class) +@SuppressWarnings("initialization.fields.uninitialized") +public class SubscriptionPartitionProcessorImplTest { + @Spy RestrictionTracker tracker; + @Mock OutputReceiver receiver; + @Mock Function>, Subscriber> subscriberFactory; + + abstract static class FakeSubscriber extends FakeApiService implements Subscriber {} + + @Spy FakeSubscriber subscriber; + + Consumer> leakedConsumer; + SubscriptionPartitionProcessor processor; + + private static SequencedMessage messageWithOffset(long offset) { + return SequencedMessage.newBuilder() + .setCursor(Cursor.newBuilder().setOffset(offset)) + .setPublishTime(Timestamps.fromMillis(10000 + offset)) + .setSizeBytes(1024) + .build(); + } + + @Before + public void setUp() { + initMocks(this); + when(subscriberFactory.apply(any())) + .then( + args -> { + leakedConsumer = args.getArgument(0); + return subscriber; + }); + processor = + new SubscriptionPartitionProcessorImpl( + tracker, receiver, subscriberFactory, DEFAULT_FLOW_CONTROL); + assertNotNull(leakedConsumer); + } + + @Test + public void lifecycle() throws Exception { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())).thenReturn(ApiFutures.immediateFuture(example(Offset.class))); + processor.start(); + verify(subscriber).startAsync(); + verify(subscriber).awaitRunning(); + verify(subscriber) + .seek( + SeekRequest.newBuilder() + .setCursor(Cursor.newBuilder().setOffset(example(Offset.class).value())) + .build()); + verify(subscriber) + .allowFlow( + FlowControlRequest.newBuilder() + .setAllowedBytes(DEFAULT_FLOW_CONTROL.bytesOutstanding()) + .setAllowedMessages(DEFAULT_FLOW_CONTROL.messagesOutstanding()) + .build()); + processor.close(); + verify(subscriber).stopAsync(); + verify(subscriber).awaitTerminated(); + } + + @Test + public void lifecycleSeekThrows() throws Exception { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())) + .thenReturn(ApiFutures.immediateFailedFuture(new CheckedApiException(Code.OUT_OF_RANGE))); + doThrow(new CheckedApiException(Code.OUT_OF_RANGE)).when(subscriber).allowFlow(any()); + assertThrows(CheckedApiException.class, () -> processor.start()); + } + + @Test + public void lifecycleFlowControlThrows() { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())) + .thenReturn(ApiFutures.immediateFailedFuture(new CheckedApiException(Code.OUT_OF_RANGE))); + assertThrows(CheckedApiException.class, () -> processor.start()); + } + + @Test + public void lifecycleSubscriberAwaitThrows() throws Exception { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())).thenReturn(ApiFutures.immediateFuture(example(Offset.class))); + processor.start(); + doThrow(new CheckedApiException(Code.INTERNAL).underlying).when(subscriber).awaitTerminated(); + assertThrows(ApiException.class, () -> processor.close()); + verify(subscriber).stopAsync(); + verify(subscriber).awaitTerminated(); + } + + @Test + public void subscriberFailureFails() throws Exception { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())).thenReturn(ApiFutures.immediateFuture(example(Offset.class))); + processor.start(); + subscriber.fail(new CheckedApiException(Code.OUT_OF_RANGE)); + ApiException e = + assertThrows(ApiException.class, () -> processor.waitForCompletion(Duration.ZERO)); + assertEquals(Code.OUT_OF_RANGE, e.getStatusCode().getCode()); + } + + @Test + public void allowFlowFailureFails() throws Exception { + when(tracker.currentRestriction()) + .thenReturn(new OffsetRange(example(Offset.class).value(), Long.MAX_VALUE)); + when(subscriber.seek(any())).thenReturn(ApiFutures.immediateFuture(example(Offset.class))); + processor.start(); + when(tracker.tryClaim(any())).thenReturn(true); + doThrow(new CheckedApiException(Code.OUT_OF_RANGE)).when(subscriber).allowFlow(any()); + leakedConsumer.accept(ImmutableList.of(messageWithOffset(1))); + ApiException e = + assertThrows(ApiException.class, () -> processor.waitForCompletion(Duration.ZERO)); + assertEquals(Code.OUT_OF_RANGE, e.getStatusCode().getCode()); + } + + @Test + public void timeoutReturnsResume() { + assertEquals(ProcessContinuation.resume(), processor.waitForCompletion(Duration.millis(10))); + assertFalse(processor.lastClaimed().isPresent()); + } + + @Test + public void failedClaimCausesStop() { + when(tracker.tryClaim(any())).thenReturn(false); + leakedConsumer.accept(ImmutableList.of(messageWithOffset(1))); + verify(tracker, times(1)).tryClaim(any()); + assertEquals(ProcessContinuation.stop(), processor.waitForCompletion(Duration.millis(10))); + assertFalse(processor.lastClaimed().isPresent()); + // Future calls to process don't try to claim. + leakedConsumer.accept(ImmutableList.of(messageWithOffset(2))); + verify(tracker, times(1)).tryClaim(any()); + } + + @Test + public void successfulClaimThenTimeout() throws Exception { + when(tracker.tryClaim(any())).thenReturn(true); + SequencedMessage message1 = messageWithOffset(1); + SequencedMessage message3 = messageWithOffset(3); + leakedConsumer.accept(ImmutableList.of(message1, message3)); + InOrder order = inOrder(tracker, receiver, subscriber); + order + .verify(tracker) + .tryClaim( + OffsetByteProgress.of(Offset.of(3), message1.getSizeBytes() + message3.getSizeBytes())); + order + .verify(receiver) + .outputWithTimestamp(message1, new Instant(Timestamps.toMillis(message1.getPublishTime()))); + order + .verify(receiver) + .outputWithTimestamp(message3, new Instant(Timestamps.toMillis(message3.getPublishTime()))); + order + .verify(subscriber) + .allowFlow( + FlowControlRequest.newBuilder() + .setAllowedMessages(2) + .setAllowedBytes(message1.getSizeBytes() + message3.getSizeBytes()) + .build()); + assertEquals(ProcessContinuation.resume(), processor.waitForCompletion(Duration.millis(10))); + assertEquals(processor.lastClaimed().get(), Offset.of(3)); + } +} diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImplTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImplTest.java index 090f72301a36..65b54fc353c0 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImplTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/TopicBacklogReaderImplTest.java @@ -17,27 +17,22 @@ */ package org.apache.beam.sdk.io.gcp.pubsublite; +import static com.google.cloud.pubsublite.internal.testing.UnitTestExamples.example; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; -import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; -import com.google.cloud.pubsublite.CloudZone; +import com.google.api.gax.rpc.ApiException; +import com.google.api.gax.rpc.StatusCode.Code; import com.google.cloud.pubsublite.Offset; import com.google.cloud.pubsublite.Partition; -import com.google.cloud.pubsublite.ProjectNumber; -import com.google.cloud.pubsublite.TopicName; import com.google.cloud.pubsublite.TopicPath; -import com.google.cloud.pubsublite.internal.ExtractStatus; +import com.google.cloud.pubsublite.internal.CheckedApiException; import com.google.cloud.pubsublite.internal.TopicStatsClient; import com.google.cloud.pubsublite.proto.ComputeMessageStatsResponse; import com.google.protobuf.Timestamp; -import io.grpc.Status; -import io.grpc.Status.Code; -import io.grpc.StatusException; -import java.util.concurrent.ExecutionException; -import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -55,129 +50,50 @@ public final class TopicBacklogReaderImplTest { @Mock TopicStatsClient mockClient; - private TopicPath topicPath; private TopicBacklogReader reader; @Before - public void setUp() throws Exception { - this.topicPath = - TopicPath.newBuilder() - .setProject(ProjectNumber.of(4)) - .setName(TopicName.of("test")) - .setLocation(CloudZone.parse("us-central1-b")) - .build(); - this.reader = new TopicBacklogReaderImpl(mockClient, topicPath); + public void setUp() { + initMocks(this); + this.reader = + new TopicBacklogReaderImpl(mockClient, example(TopicPath.class), example(Partition.class)); } @SuppressWarnings("incompatible") @Test - public void computeMessageStats_partialFailure() throws Exception { - ComputeMessageStatsResponse partition1 = ComputeMessageStatsResponse.getDefaultInstance(); - - when(mockClient.computeMessageStats( - topicPath, Partition.of(1), Offset.of(10), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition1)); + public void computeMessageStats_failure() { when(mockClient.computeMessageStats( - topicPath, Partition.of(2), Offset.of(20), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFailedFuture(new StatusException(Status.UNAVAILABLE))); - - ImmutableMap.Builder builder = ImmutableMap.builder(); - ApiFuture future = - reader.computeMessageStats( - ImmutableMap.of(Partition.of(1), Offset.of(10), Partition.of(2), Offset.of(20))); - - ExecutionException ex = assertThrows(ExecutionException.class, future::get); - assertEquals(Code.UNAVAILABLE, ExtractStatus.extract(ex.getCause()).get().getCode()); + example(TopicPath.class), + example(Partition.class), + example(Offset.class), + Offset.of(Integer.MAX_VALUE))) + .thenReturn( + ApiFutures.immediateFailedFuture(new CheckedApiException(Code.UNAVAILABLE).underlying)); + + ApiException e = + assertThrows(ApiException.class, () -> reader.computeMessageStats(example(Offset.class))); + assertEquals(Code.UNAVAILABLE, e.getStatusCode().getCode()); } @Test - public void computeMessageStats_aggregatesEmptyMessages() throws Exception { - ComputeMessageStatsResponse partition1 = ComputeMessageStatsResponse.getDefaultInstance(); - ComputeMessageStatsResponse partition2 = ComputeMessageStatsResponse.getDefaultInstance(); - ComputeMessageStatsResponse aggregate = ComputeMessageStatsResponse.getDefaultInstance(); - - when(mockClient.computeMessageStats( - topicPath, Partition.of(1), Offset.of(10), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition1)); - when(mockClient.computeMessageStats( - topicPath, Partition.of(2), Offset.of(20), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition2)); - - ImmutableMap.Builder builder = ImmutableMap.builder(); - ApiFuture future = - reader.computeMessageStats( - ImmutableMap.of(Partition.of(1), Offset.of(10), Partition.of(2), Offset.of(20))); - - assertEquals(future.get(), aggregate); - } - - @Test - public void computeMessageStats_timestampsAggregatedWhenPresent() throws Exception { + public void computeMessageStats_validResponseCached() { Timestamp minEventTime = Timestamp.newBuilder().setSeconds(1000).setNanos(10).build(); Timestamp minPublishTime = Timestamp.newBuilder().setSeconds(1001).setNanos(11).build(); - ComputeMessageStatsResponse partition1 = - ComputeMessageStatsResponse.newBuilder().setMinimumPublishTime(minPublishTime).build(); - ComputeMessageStatsResponse partition2 = - ComputeMessageStatsResponse.newBuilder().setMinimumEventTime(minEventTime).build(); - ComputeMessageStatsResponse aggregate = - ComputeMessageStatsResponse.newBuilder() - .setMinimumEventTime(minEventTime) - .setMinimumPublishTime(minPublishTime) - .build(); - - when(mockClient.computeMessageStats( - topicPath, Partition.of(1), Offset.of(10), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition1)); - when(mockClient.computeMessageStats( - topicPath, Partition.of(2), Offset.of(20), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition2)); - - ImmutableMap.Builder builder = ImmutableMap.builder(); - ApiFuture future = - reader.computeMessageStats( - ImmutableMap.of(Partition.of(1), Offset.of(10), Partition.of(2), Offset.of(20))); - - assertEquals(future.get(), aggregate); - } - - @Test - public void computeMessageStats_resultsAggregated() throws Exception { - Timestamp minEventTime = Timestamp.newBuilder().setSeconds(1000).setNanos(10).build(); - Timestamp minPublishTime = Timestamp.newBuilder().setSeconds(1001).setNanos(11).build(); - ComputeMessageStatsResponse partition1 = + ComputeMessageStatsResponse response = ComputeMessageStatsResponse.newBuilder() .setMessageCount(10) .setMessageBytes(100) .setMinimumEventTime(minEventTime.toBuilder().setSeconds(1002).build()) .setMinimumPublishTime(minPublishTime) .build(); - ComputeMessageStatsResponse partition2 = - ComputeMessageStatsResponse.newBuilder() - .setMessageCount(20) - .setMessageBytes(200) - .setMinimumEventTime(minEventTime) - .setMinimumPublishTime(minPublishTime.toBuilder().setNanos(12).build()) - .build(); - ComputeMessageStatsResponse aggregate = - ComputeMessageStatsResponse.newBuilder() - .setMessageCount(30) - .setMessageBytes(300) - .setMinimumEventTime(minEventTime) - .setMinimumPublishTime(minPublishTime) - .build(); when(mockClient.computeMessageStats( - topicPath, Partition.of(1), Offset.of(10), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition1)); - when(mockClient.computeMessageStats( - topicPath, Partition.of(2), Offset.of(20), Offset.of(Integer.MAX_VALUE))) - .thenReturn(ApiFutures.immediateFuture(partition2)); - - ImmutableMap.Builder builder = ImmutableMap.builder(); - ApiFuture future = - reader.computeMessageStats( - ImmutableMap.of(Partition.of(1), Offset.of(10), Partition.of(2), Offset.of(20))); + example(TopicPath.class), + example(Partition.class), + example(Offset.class), + Offset.of(Integer.MAX_VALUE))) + .thenReturn(ApiFutures.immediateFuture(response)); - assertEquals(future.get(), aggregate); + assertEquals(reader.computeMessageStats(example(Offset.class)), response); } } diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationTransformTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationTransformTest.java index 978c0f8ffc58..e5882ff6f86a 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationTransformTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/pubsublite/UuidDeduplicationTransformTest.java @@ -72,9 +72,7 @@ public void unrelatedUuidsProxied() { PCollection results = pipeline .apply(messageStream) - .apply( - new UuidDeduplicationTransform( - UuidDeduplicationOptions.newBuilder().setHashPartitions(1).build())); + .apply(new UuidDeduplicationTransform(UuidDeduplicationOptions.newBuilder().build())); PAssert.that(results).containsInAnyOrder(message1, message2); pipeline.run(); } @@ -92,9 +90,7 @@ public void sameUuidsWithinWindowOnlyOne() { PCollection results = pipeline .apply(messageStream) - .apply( - new UuidDeduplicationTransform( - UuidDeduplicationOptions.newBuilder().setHashPartitions(1).build())); + .apply(new UuidDeduplicationTransform(UuidDeduplicationOptions.newBuilder().build())); PAssert.that(results).containsInAnyOrder(message); pipeline.run(); } @@ -115,9 +111,7 @@ public void sameUuidsAfterGcOutsideWindowHasBoth() { PCollection results = pipeline .apply(messageStream) - .apply( - new UuidDeduplicationTransform( - UuidDeduplicationOptions.newBuilder().setHashPartitions(1).build())); + .apply(new UuidDeduplicationTransform(UuidDeduplicationOptions.newBuilder().build())); PAssert.that(results).containsInAnyOrder(message1, message1); pipeline.run(); } @@ -141,7 +135,6 @@ public void dedupesBasedOnReturnedUuid() { .apply( new UuidDeduplicationTransform( UuidDeduplicationOptions.newBuilder() - .setHashPartitions(1) .setUuidExtractor(message -> Uuid.of(ByteString.copyFrom(bytes))) .build())); PAssert.that(results) diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/MutationSizeEstimatorTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/MutationSizeEstimatorTest.java index 8e16f736eabb..9bcf69cb0d60 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/MutationSizeEstimatorTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/MutationSizeEstimatorTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.gcp.spanner; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; import com.google.cloud.ByteArray; import com.google.cloud.Date; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/ReadSpannerSchemaTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/ReadSpannerSchemaTest.java index 94a5cbcd7ed8..3f5510e1f574 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/ReadSpannerSchemaTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/ReadSpannerSchemaTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.gcp.spanner; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIOWriteTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIOWriteTest.java index 798642493884..c9603a526960 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIOWriteTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIOWriteTest.java @@ -18,11 +18,11 @@ package org.apache.beam.sdk.io.gcp.spanner; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerWriteIT.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerWriteIT.java index 1d6d86292817..494966db30fa 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerWriteIT.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/SpannerWriteIT.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.gcp.spanner; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.spanner.Database; diff --git a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/StructUtilsTest.java b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/StructUtilsTest.java index 6b4a465b3634..577a470cdcdf 100644 --- a/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/StructUtilsTest.java +++ b/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/spanner/StructUtilsTest.java @@ -19,9 +19,9 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.beam.sdk.io.gcp.spanner.StructUtils.beamTypeToSpannerType; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; diff --git a/sdks/java/io/google-cloud-platform/src/test/resources/DICOM/testDicomFile.dcm b/sdks/java/io/google-cloud-platform/src/test/resources/DICOM/testDicomFile.dcm new file mode 100644 index 0000000000000000000000000000000000000000..9c4a1520d948eb68ede2a6cd1f81e8208070ad56 GIT binary patch literal 10366 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 literal 0 HcmV?d00001 diff --git a/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java b/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java index 7650df2625cf..d222c08f3339 100644 --- a/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java +++ b/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java @@ -86,6 +86,17 @@ public static Job newJob(@Nullable SerializableConfiguration conf) throws IOExce } } + /** Returns a new configuration instance using provided flags. */ + public static SerializableConfiguration fromMap(Map entries) { + Configuration hadoopConfiguration = new Configuration(); + + for (Map.Entry entry : entries.entrySet()) { + hadoopConfiguration.set(entry.getKey(), entry.getValue()); + } + + return new SerializableConfiguration(hadoopConfiguration); + } + /** Returns new populated {@link Configuration} object. */ public static Configuration newConfiguration(@Nullable SerializableConfiguration conf) { if (conf == null) { diff --git a/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/SerializableConfigurationTest.java b/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/SerializableConfigurationTest.java index b694b46483ba..f0721d0c1dd6 100644 --- a/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/SerializableConfigurationTest.java +++ b/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/SerializableConfigurationTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull; import org.apache.beam.repackaged.core.org.apache.commons.lang3.SerializationUtils; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.Job; import org.junit.Rule; @@ -73,4 +74,12 @@ public void testCreateNewJob() throws Exception { Job job = SerializableConfiguration.newJob(DEFAULT_SERIALIZABLE_CONF); assertNotNull(job); } + + @Test + public void testFromMap() { + SerializableConfiguration testConf = + SerializableConfiguration.fromMap(ImmutableMap.of("hadoop.silly.test", "test-value")); + + assertEquals("test-value", testConf.get().get("hadoop.silly.test", "default-value")); + } } diff --git a/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/WritableCoderTest.java b/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/WritableCoderTest.java index 5b21553addee..738337e076ec 100644 --- a/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/WritableCoderTest.java +++ b/sdks/java/io/hadoop-common/src/test/java/org/apache/beam/sdk/io/hadoop/WritableCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.hadoop; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.coders.CoderRegistry; import org.apache.beam.sdk.testing.CoderProperties; diff --git a/sdks/java/io/hadoop-file-system/src/main/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptions.java b/sdks/java/io/hadoop-file-system/src/main/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptions.java index 43a6e7e7d2ba..d9acf0b417b9 100644 --- a/sdks/java/io/hadoop-file-system/src/main/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptions.java +++ b/sdks/java/io/hadoop-file-system/src/main/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptions.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.io.hdfs; import java.io.File; +import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.Set; @@ -112,9 +113,13 @@ private List readConfigurationFromHadoopYarnConfigDirs() { } } - // Load the configuration from paths found (if exists) + // Set used to dedup same config paths + Set confPaths = Sets.newHashSet(); + // Load the configuration from paths found (if exists and not loaded yet) for (String confDir : explodedConfDirs) { - if (new File(confDir).exists()) { + java.nio.file.Path path = Paths.get(confDir).normalize(); + if (new File(confDir).exists() && !confPaths.contains(path)) { + confPaths.add(path); Configuration conf = new Configuration(false); boolean confLoaded = false; for (String confName : Lists.newArrayList("core-site.xml", "hdfs-site.xml")) { diff --git a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemModuleTest.java b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemModuleTest.java index d1fc7c4c26d4..2f09e987fc32 100644 --- a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemModuleTest.java +++ b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemModuleTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.hdfs; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; -import static org.junit.Assert.assertThat; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsRegistrarTest.java b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsRegistrarTest.java index 844a58a91b03..ecfc037bb14d 100644 --- a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsRegistrarTest.java +++ b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsRegistrarTest.java @@ -17,7 +17,7 @@ */ package org.apache.beam.sdk.io.hdfs; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.fail; import java.util.ServiceLoader; diff --git a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsTest.java b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsTest.java index f2f289fa452e..5e75b0293ebb 100644 --- a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsTest.java +++ b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemOptionsTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.hdfs; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -182,6 +182,26 @@ public void testDefaultSetYarnConfDirAndHadoopConfDirAndSameConfiguration() thro assertThat(configurationList.get(0).get("propertyB"), Matchers.equalTo("B")); } + @Test + public void testDefaultSetYarnConfDirAndHadoopConfDirAndSameDir() throws IOException { + Files.write( + createPropertyData("A"), tmpFolder.newFile("core-site.xml"), StandardCharsets.UTF_8); + Files.write( + createPropertyData("B"), tmpFolder.newFile("hdfs-site.xml"), StandardCharsets.UTF_8); + HadoopFileSystemOptions.ConfigurationLocator configurationLocator = + spy(new HadoopFileSystemOptions.ConfigurationLocator()); + Map environment = Maps.newHashMap(); + environment.put("HADOOP_CONF_DIR", tmpFolder.getRoot().getAbsolutePath()); + environment.put("YARN_CONF_DIR", tmpFolder.getRoot().getAbsolutePath() + "/"); + when(configurationLocator.getEnvironment()).thenReturn(environment); + + List configurationList = + configurationLocator.create(PipelineOptionsFactory.create()); + assertEquals(1, configurationList.size()); + assertThat(configurationList.get(0).get("propertyA"), Matchers.equalTo("A")); + assertThat(configurationList.get(0).get("propertyB"), Matchers.equalTo("B")); + } + @Test public void testDefaultSetYarnConfDirAndHadoopConfDirMultiPathAndSameConfiguration() throws IOException { diff --git a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemTest.java b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemTest.java index a9cdc7fcc25e..34d707e63331 100644 --- a/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemTest.java +++ b/sdks/java/io/hadoop-file-system/src/test/java/org/apache/beam/sdk/io/hdfs/HadoopFileSystemTest.java @@ -17,13 +17,13 @@ */ package org.apache.beam.sdk.io.hdfs; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.FileNotFoundException; import java.io.InputStream; diff --git a/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java b/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java index 215674fc9d75..ad8aeb83a2c5 100644 --- a/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java +++ b/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java @@ -199,6 +199,21 @@ * .withValueTranslation(myOutputValueType); * } * + *

    Hadoop formats typically work with Writable data structures which are mutable and instances + * are reused by the input format reader. Therefore, to not to have elements which can change value + * after they are emitted from read, this IO will clone each key value read from underlying hadoop + * input format (unless they are in the list of well known immutable types). However, in cases where + * used input format does not reuse instances for key/value or translation functions are used which + * already output immutable types, such clone of values can be needless penalty. In these cases IO + * can be instructed to skip key/value cloning. + * + *

    {@code
    + * HadoopFormatIO.Read read = ...
    + * p.apply("read", read
    + *     .withSkipKeyClone(true)
    + *     .withSkipValueClone(true));
    + * }
    + * *

    IMPORTANT! In case of using {@code DBInputFormat} to read data from RDBMS, Beam parallelizes * the process by using LIMIT and OFFSET clauses of SQL query to fetch different ranges of records * (as a split) by different workers. To guarantee the same order and proper split of results you @@ -331,7 +346,10 @@ public class HadoopFormatIO { * HadoopFormatIO.Read#withKeyTranslation}/ {@link HadoopFormatIO.Read#withValueTranslation}. */ public static Read read() { - return new AutoValue_HadoopFormatIO_Read.Builder().build(); + return new AutoValue_HadoopFormatIO_Read.Builder() + .setSkipKeyClone(false) + .setSkipValueClone(false) + .build(); } /** @@ -374,6 +392,10 @@ public abstract static class Read extends PTransform getValueCoder(); + public abstract @Nullable Boolean getSkipKeyClone(); + + public abstract @Nullable Boolean getSkipValueClone(); + public abstract @Nullable TypeDescriptor getinputFormatClass(); public abstract @Nullable TypeDescriptor getinputFormatKeyClass(); @@ -398,6 +420,10 @@ abstract static class Builder { abstract Builder setValueCoder(Coder valueCoder); + abstract Builder setSkipKeyClone(Boolean value); + + abstract Builder setSkipValueClone(Boolean value); + abstract Builder setInputFormatClass(TypeDescriptor inputFormatClass); abstract Builder setInputFormatKeyClass(TypeDescriptor inputFormatKeyClass); @@ -475,6 +501,16 @@ public Read withValueTranslation(SimpleFunction function, Coder c return withValueTranslation(function).toBuilder().setValueCoder(coder).build(); } + /** Determines if key clone should be skipped or not (default is 'false'). */ + public Read withSkipKeyClone(boolean value) { + return toBuilder().setSkipKeyClone(value).build(); + } + + /** Determines if value clone should be skipped or not (default is 'false'). */ + public Read withSkipValueClone(boolean value) { + return toBuilder().setSkipValueClone(value).build(); + } + @Override public PCollection> expand(PBegin input) { validateTransform(); @@ -488,13 +524,16 @@ public PCollection> expand(PBegin input) { if (valueCoder == null) { valueCoder = getDefaultCoder(getValueTypeDescriptor(), coderRegistry); } + HadoopInputFormatBoundedSource source = new HadoopInputFormatBoundedSource<>( getConfiguration(), keyCoder, valueCoder, getKeyTranslationFunction(), - getValueTranslationFunction()); + getValueTranslationFunction(), + getSkipKeyClone(), + getSkipValueClone()); return input.getPipeline().apply(org.apache.beam.sdk.io.Read.from(source)); } @@ -582,6 +621,8 @@ public static class HadoopInputFormatBoundedSource extends BoundedSource keyTranslationFunction; private final @Nullable SimpleFunction valueTranslationFunction; private final SerializableSplit inputSplit; + private final boolean skipKeyClone; + private final boolean skipValueClone; private transient List inputSplits; private long boundedSourceEstimatedSize = 0; private transient InputFormat inputFormatObj; @@ -605,8 +646,18 @@ public static class HadoopInputFormatBoundedSource extends BoundedSource keyCoder, Coder valueCoder, @Nullable SimpleFunction keyTranslationFunction, - @Nullable SimpleFunction valueTranslationFunction) { - this(conf, keyCoder, valueCoder, keyTranslationFunction, valueTranslationFunction, null); + @Nullable SimpleFunction valueTranslationFunction, + boolean skipKeyClone, + boolean skipValueClone) { + this( + conf, + keyCoder, + valueCoder, + keyTranslationFunction, + valueTranslationFunction, + null, + skipKeyClone, + skipValueClone); } @SuppressWarnings("WeakerAccess") @@ -616,13 +667,17 @@ protected HadoopInputFormatBoundedSource( Coder valueCoder, @Nullable SimpleFunction keyTranslationFunction, @Nullable SimpleFunction valueTranslationFunction, - SerializableSplit inputSplit) { + SerializableSplit inputSplit, + boolean skipKeyClone, + boolean skipValueClone) { this.conf = conf; this.inputSplit = inputSplit; this.keyCoder = keyCoder; this.valueCoder = valueCoder; this.keyTranslationFunction = keyTranslationFunction; this.valueTranslationFunction = valueTranslationFunction; + this.skipKeyClone = skipKeyClone; + this.skipValueClone = skipValueClone; } @SuppressWarnings("WeakerAccess") @@ -678,7 +733,9 @@ public List>> split(long desiredBundleSizeBytes, Pipeline valueCoder, keyTranslationFunction, valueTranslationFunction, - serializableInputSplit)) + serializableInputSplit, + skipKeyClone, + skipValueClone)) .collect(Collectors.toList()); } @@ -881,11 +938,16 @@ public KV getCurrent() { V value; try { // Transform key if translation function is provided. - key = transformKeyOrValue(recordReader.getCurrentKey(), keyTranslationFunction, keyCoder); + key = + transformKeyOrValue( + recordReader.getCurrentKey(), keyTranslationFunction, keyCoder, skipKeyClone); // Transform value if translation function is provided. value = transformKeyOrValue( - recordReader.getCurrentValue(), valueTranslationFunction, valueCoder); + recordReader.getCurrentValue(), + valueTranslationFunction, + valueCoder, + skipValueClone); } catch (IOException | InterruptedException e) { LOG.error("Unable to read data: ", e); throw new IllegalStateException("Unable to read data: " + "{}", e); @@ -896,7 +958,10 @@ public KV getCurrent() { /** Returns the serialized output of transformed key or value object. */ @SuppressWarnings("unchecked") private T3 transformKeyOrValue( - T input, @Nullable SimpleFunction simpleFunction, Coder coder) + T input, + @Nullable SimpleFunction simpleFunction, + Coder coder, + boolean skipClone) throws CoderException, ClassCastException { T3 output; if (null != simpleFunction) { @@ -904,7 +969,7 @@ private T3 transformKeyOrValue( } else { output = (T3) input; } - return cloneIfPossiblyMutable(output, coder); + return skipClone ? output : cloneIfPossiblyMutable(output, coder); } /** diff --git a/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOCassandraTest.java b/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOCassandraTest.java index 3bbc81c2d3e2..f37d4d2f9d6a 100644 --- a/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOCassandraTest.java +++ b/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOCassandraTest.java @@ -26,7 +26,7 @@ import java.io.File; import java.io.Serializable; import java.net.URI; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import org.apache.beam.sdk.io.common.HashingFn; @@ -209,10 +209,10 @@ public static void beforeClass() throws Exception { private static void replacePortsInConfFile() throws Exception { URI uri = HadoopFormatIOCassandraTest.class.getResource("/cassandra.yaml").toURI(); Path cassandraYamlPath = new File(uri).toPath(); - String content = new String(Files.readAllBytes(cassandraYamlPath), Charset.defaultCharset()); + String content = new String(Files.readAllBytes(cassandraYamlPath), StandardCharsets.UTF_8); content = content.replaceAll("9042", String.valueOf(cassandraNativePort)); content = content.replaceAll("9061", String.valueOf(cassandraPort)); - Files.write(cassandraYamlPath, content.getBytes(Charset.defaultCharset())); + Files.write(cassandraYamlPath, content.getBytes(StandardCharsets.UTF_8)); } @AfterClass diff --git a/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOReadTest.java b/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOReadTest.java index 8a0965a8735d..a0f659bef05a 100644 --- a/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOReadTest.java +++ b/sdks/java/io/hadoop-format/src/test/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIOReadTest.java @@ -22,10 +22,10 @@ import static org.apache.beam.sdk.io.hadoop.format.HadoopFormatIO.HadoopInputFormatBoundedSource; import static org.apache.beam.sdk.io.hadoop.format.HadoopFormatIO.SerializableSplit; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -60,6 +60,7 @@ import org.apache.hadoop.mapreduce.JobContext; import org.apache.hadoop.mapreduce.TaskAttemptContext; import org.apache.hadoop.mapreduce.lib.db.DBInputFormat; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -376,6 +377,16 @@ public void testReadValidationFailsMissingConfiguration() { read.validateTransform(); } + @Test + public void testReadObjectCreationWithSkipKeyValueClone() { + HadoopFormatIO.Read read = HadoopFormatIO.read(); + assertEquals(false, read.getSkipKeyClone()); + assertEquals(false, read.getSkipValueClone()); + + assertEquals(true, read.withSkipKeyClone(true).getSkipKeyClone()); + assertEquals(true, read.withSkipValueClone(true).getSkipValueClone()); + } + /** * This test validates functionality of {@link * HadoopFormatIO.Read#withConfiguration(Configuration) withConfiguration(Configuration)} function @@ -519,7 +530,9 @@ public void testReadDisplayData() { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit()); + new SerializableSplit(), + false, + false); DisplayData displayData = DisplayData.from(boundedSource); assertThat( displayData, @@ -550,7 +563,9 @@ public void testReadIfCreateRecordReaderFails() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit()); + new SerializableSplit(), + false, + false); boundedSource.setInputFormatObj(mockInputFormat); SourceTestUtils.readFromSource(boundedSource, p.getOptions()); } @@ -577,7 +592,9 @@ public void testReadWithNullCreateRecordReader() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit()); + new SerializableSplit(), + false, + false); boundedSource.setInputFormatObj(mockInputFormat); SourceTestUtils.readFromSource(boundedSource, p.getOptions()); } @@ -604,7 +621,9 @@ public void testReadersStartWhenZeroRecords() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit(mockInputSplit)); + new SerializableSplit(mockInputSplit), + false, + false); boundedSource.setInputFormatObj(mockInputFormat); BoundedReader> reader = boundedSource.createReader(p.getOptions()); assertFalse(reader.start()); @@ -625,7 +644,8 @@ public void testReadersGetFractionConsumed() throws Exception { Text.class, Employee.class, WritableCoder.of(Text.class), - AvroCoder.of(Employee.class)); + AvroCoder.of(Employee.class), + false); long estimatedSize = hifSource.getEstimatedSizeBytes(p.getOptions()); // Validate if estimated size is equal to the size of records. assertEquals(referenceRecords.size(), estimatedSize); @@ -687,7 +707,9 @@ public void testGetFractionConsumedForBadProgressValue() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit(mockInputSplit)); + new SerializableSplit(mockInputSplit), + false, + false); boundedSource.setInputFormatObj(mockInputFormat); BoundedReader> reader = boundedSource.createReader(p.getOptions()); assertEquals(Double.valueOf(0), reader.getFractionConsumed()); @@ -718,7 +740,9 @@ public void testReaderAndParentSourceReadsSameData() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit(mockInputSplit)); + new SerializableSplit(mockInputSplit), + false, + false); BoundedReader> reader = boundedSource.createReader(p.getOptions()); SourceTestUtils.assertUnstartedReaderReadsSameAsItsSource(reader, p.getOptions()); } @@ -738,7 +762,9 @@ public void testGetCurrentSourceFunction() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - split); + split, + false, + false); BoundedReader> hifReader = source.createReader(p.getOptions()); BoundedSource> hifSource = hifReader.getCurrentSource(); assertEquals(hifSource, source); @@ -757,7 +783,8 @@ public void testCreateReaderIfSplitNotCalled() throws Exception { Text.class, Employee.class, WritableCoder.of(Text.class), - AvroCoder.of(Employee.class)); + AvroCoder.of(Employee.class), + false); thrown.expect(IOException.class); thrown.expectMessage("Cannot create reader as source is not split yet."); hifSource.createReader(p.getOptions()); @@ -781,7 +808,9 @@ public void testComputeSplitsIfGetSplitsReturnsEmptyList() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - mockInputSplit); + mockInputSplit, + false, + false); thrown.expect(IOException.class); thrown.expectMessage("Error in computing splits, getSplits() returns a empty list"); hifSource.setInputFormatObj(mockInputFormat); @@ -806,7 +835,9 @@ public void testComputeSplitsIfGetSplitsReturnsNullValue() throws Exception { AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - mockInputSplit); + mockInputSplit, + false, + false); thrown.expect(IOException.class); thrown.expectMessage("Error in computing splits, getSplits() returns null."); hifSource.setInputFormatObj(mockInputFormat); @@ -837,7 +868,9 @@ public void testComputeSplitsIfGetSplitsReturnsListHavingNullValues() throws Exc AvroCoder.of(Employee.class), null, // No key translation required. null, // No value translation required. - new SerializableSplit()); + new SerializableSplit(), + false, + false); thrown.expect(IOException.class); thrown.expectMessage( "Error in computing splits, split is null in InputSplits list populated " @@ -858,7 +891,8 @@ public void testImmutablityOfOutputOfReadIfRecordReaderObjectsAreMutable() throw Text.class, Employee.class, WritableCoder.of(Text.class), - AvroCoder.of(Employee.class)); + AvroCoder.of(Employee.class), + false); List> bundleRecords = new ArrayList<>(); for (BoundedSource> source : boundedSourceList) { List> elems = SourceTestUtils.readFromSource(source, p.getOptions()); @@ -880,7 +914,8 @@ public void testReadingWithConfigurableInputFormat() throws Exception { Text.class, Employee.class, WritableCoder.of(Text.class), - AvroCoder.of(Employee.class)); + AvroCoder.of(Employee.class), + false); for (BoundedSource> source : boundedSourceList) { // Cast to HadoopInputFormatBoundedSource to access getInputFormat(). HadoopInputFormatBoundedSource hifSource = @@ -905,7 +940,8 @@ public void testImmutablityOfOutputOfReadIfRecordReaderObjectsAreImmutable() thr Text.class, Employee.class, WritableCoder.of(Text.class), - AvroCoder.of(Employee.class)); + AvroCoder.of(Employee.class), + false); List> bundleRecords = new ArrayList<>(); for (BoundedSource> source : boundedSourceList) { List> elems = SourceTestUtils.readFromSource(source, p.getOptions()); @@ -915,6 +951,63 @@ public void testImmutablityOfOutputOfReadIfRecordReaderObjectsAreImmutable() thr assertThat(bundleRecords, containsInAnyOrder(referenceRecords.toArray())); } + /** + * This test validates that in case reader is instructed to not to clone key value records, then + * key value records are exactly the same as output from the source no mater if they are mutable + * or immutable. This override setting is useful to turn on when using key-value translation + * functions and avoid possibly unnecessary copy. + */ + @Test + public void testSkipKeyValueClone() throws Exception { + + SerializableConfiguration serConf = + loadTestConfiguration(EmployeeInputFormat.class, Text.class, Employee.class); + + // with skip clone 'true' it should produce different instances of key/value + List>> sources = + new HadoopInputFormatBoundedSource<>( + serConf, + WritableCoder.of(Text.class), + AvroCoder.of(Employee.class), + new SingletonTextFn(), + new SingletonEmployeeFn(), + true, + true) + .split(0, p.getOptions()); + + for (BoundedSource> source : sources) { + List> elems = SourceTestUtils.readFromSource(source, p.getOptions()); + for (KV elem : elems) { + Assert.assertSame(SingletonTextFn.TEXT, elem.getKey()); + Assert.assertEquals(SingletonTextFn.TEXT, elem.getKey()); + Assert.assertSame(SingletonEmployeeFn.EMPLOYEE, elem.getValue()); + Assert.assertEquals(SingletonEmployeeFn.EMPLOYEE, elem.getValue()); + } + } + + // with skip clone 'false' it should produce different instances of value + sources = + new HadoopInputFormatBoundedSource<>( + serConf, + WritableCoder.of(Text.class), + AvroCoder.of(Employee.class), + new SingletonTextFn(), + new SingletonEmployeeFn(), + false, + false) + .split(0, p.getOptions()); + + for (BoundedSource> source : sources) { + List> elems = SourceTestUtils.readFromSource(source, p.getOptions()); + for (KV elem : elems) { + Assert.assertNotSame(SingletonTextFn.TEXT, elem.getKey()); + Assert.assertEquals(SingletonTextFn.TEXT, elem.getKey()); + Assert.assertNotSame(SingletonEmployeeFn.EMPLOYEE, elem.getValue()); + Assert.assertEquals(SingletonEmployeeFn.EMPLOYEE, elem.getValue()); + } + } + } + @Test public void testValidateConfigurationWithDBInputFormat() { Configuration conf = new Configuration(); @@ -943,7 +1036,8 @@ private HadoopInputFormatBoundedSource getTestHIFSource( Class inputFormatKeyClass, Class inputFormatValueClass, Coder keyCoder, - Coder valueCoder) { + Coder valueCoder, + boolean skipKeyValueClone) { SerializableConfiguration serConf = loadTestConfiguration(inputFormatClass, inputFormatKeyClass, inputFormatValueClass); return new HadoopInputFormatBoundedSource<>( @@ -951,7 +1045,9 @@ private HadoopInputFormatBoundedSource getTestHIFSource( keyCoder, valueCoder, null, // No key translation required. - null); // No value translation required. + null, // No value translation required. + skipKeyValueClone, + skipKeyValueClone); } private List>> getBoundedSourceList( @@ -959,11 +1055,37 @@ private List>> getBoundedSourceList( Class inputFormatKeyClass, Class inputFormatValueClass, Coder keyCoder, - Coder valueCoder) + Coder valueCoder, + boolean skipKeyValueClone) throws Exception { HadoopInputFormatBoundedSource boundedSource = getTestHIFSource( - inputFormatClass, inputFormatKeyClass, inputFormatValueClass, keyCoder, valueCoder); + inputFormatClass, + inputFormatKeyClass, + inputFormatValueClass, + keyCoder, + valueCoder, + skipKeyValueClone); return boundedSource.split(0, p.getOptions()); } + + private static class SingletonEmployeeFn extends SimpleFunction { + + static final Employee EMPLOYEE = new Employee("Name", "Address"); + + @Override + public Employee apply(Employee input) { + return EMPLOYEE; + } + } + + private static class SingletonTextFn extends SimpleFunction { + + static final Text TEXT = new Text("content"); + + @Override + public Text apply(Text input) { + return TEXT; + } + } } diff --git a/sdks/java/io/hbase/src/main/java/org/apache/beam/sdk/io/hbase/HBaseIO.java b/sdks/java/io/hbase/src/main/java/org/apache/beam/sdk/io/hbase/HBaseIO.java index 8cb509e79fd2..7d4edf8dd775 100644 --- a/sdks/java/io/hbase/src/main/java/org/apache/beam/sdk/io/hbase/HBaseIO.java +++ b/sdks/java/io/hbase/src/main/java/org/apache/beam/sdk/io/hbase/HBaseIO.java @@ -347,7 +347,6 @@ Object readResolve() { * A {@link PTransform} that works like {@link #read}, but executes read operations coming from a * {@link PCollection} of {@link Read}. */ - @Experimental(Kind.SPLITTABLE_DO_FN) public static ReadAll readAll() { return new ReadAll(); } diff --git a/sdks/java/io/hbase/src/test/java/org/apache/beam/sdk/io/hbase/HBaseIOTest.java b/sdks/java/io/hbase/src/test/java/org/apache/beam/sdk/io/hbase/HBaseIOTest.java index 4b4acdcac76f..f3ddaa7ba8fe 100644 --- a/sdks/java/io/hbase/src/test/java/org/apache/beam/sdk/io/hbase/HBaseIOTest.java +++ b/sdks/java/io/hbase/src/test/java/org/apache/beam/sdk/io/hbase/HBaseIOTest.java @@ -22,10 +22,10 @@ import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionFails; import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionSucceedsAndConsistent; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import java.nio.charset.StandardCharsets; import java.util.ArrayList; diff --git a/sdks/java/io/hcatalog/src/test/java/org/apache/beam/sdk/io/hcatalog/HCatalogIOTest.java b/sdks/java/io/hcatalog/src/test/java/org/apache/beam/sdk/io/hcatalog/HCatalogIOTest.java index 0554561225bd..febf400c513f 100644 --- a/sdks/java/io/hcatalog/src/test/java/org/apache/beam/sdk/io/hcatalog/HCatalogIOTest.java +++ b/sdks/java/io/hcatalog/src/test/java/org/apache/beam/sdk/io/hcatalog/HCatalogIOTest.java @@ -26,11 +26,11 @@ import static org.apache.beam.sdk.io.hcatalog.test.HCatalogIOTestUtils.getExpectedRecords; import static org.apache.beam.sdk.io.hcatalog.test.HCatalogIOTestUtils.getReaderContext; import static org.apache.beam.sdk.io.hcatalog.test.HCatalogIOTestUtils.insertTestData; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.isA; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; diff --git a/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java b/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java index d714d94c9023..956ecafd3737 100644 --- a/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java +++ b/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java @@ -17,12 +17,12 @@ */ package org.apache.beam.sdk.io.jdbc; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; diff --git a/sdks/java/io/jms/src/test/java/org/apache/beam/sdk/io/jms/JmsIOTest.java b/sdks/java/io/jms/src/test/java/org/apache/beam/sdk/io/jms/JmsIOTest.java index 8b13f0966291..c564a95356ca 100644 --- a/sdks/java/io/jms/src/test/java/org/apache/beam/sdk/io/jms/JmsIOTest.java +++ b/sdks/java/io/jms/src/test/java/org/apache/beam/sdk/io/jms/JmsIOTest.java @@ -17,10 +17,10 @@ */ package org.apache.beam.sdk.io.jms; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/sdks/java/io/kafka/build.gradle b/sdks/java/io/kafka/build.gradle index 78569557ec35..a500ddd49fb5 100644 --- a/sdks/java/io/kafka/build.gradle +++ b/sdks/java/io/kafka/build.gradle @@ -16,6 +16,8 @@ * limitations under the License. */ +import java.util.stream.Collectors + plugins { id 'org.apache.beam.module' } applyJavaNature( automaticModuleName: 'org.apache.beam.sdk.io.kafka', @@ -29,10 +31,19 @@ enableJavaPerformanceTesting() description = "Apache Beam :: SDKs :: Java :: IO :: Kafka" ext.summary = "Library to read Kafka topics." -// Testing Kafka clients API 2.1.0 onwards (deserialization with Headers suppport) -configurations { - kafkaVersion210 -} +def kafkaVersions = [ + '01103': "0.11.0.3", + '100': "1.0.0", + '111': "1.1.1", + '201': "2.0.1", + '211': "2.1.1", + '222': "2.2.2", + '231': "2.3.1", + '241': "2.4.1", + '251': "2.5.1", +] + +kafkaVersions.each{k,v -> configurations.create("kafkaVersion$k")} dependencies { compile library.java.vendored_guava_26_0_jre @@ -65,26 +76,71 @@ dependencies { testCompile library.java.junit testCompile library.java.powermock testCompile library.java.powermock_mockito + testCompile library.java.testcontainers_kafka testRuntimeOnly library.java.slf4j_jdk14 testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow") - kafkaVersion210 "org.apache.kafka:kafka-clients:2.1.0" + kafkaVersions.each {"kafkaVersion$it.key" "org.apache.kafka:kafka-clients:$it.value"} } -configurations.kafkaVersion210 { - resolutionStrategy { - force "org.apache.kafka:kafka-clients:2.1.0" +kafkaVersions.each { kv -> + configurations."kafkaVersion$kv.key" { + resolutionStrategy { + force "org.apache.kafka:kafka-clients:$kv.value" + } } } -task kafkaVersion210Test(type: Test) { +kafkaVersions.each {kv -> + task "kafkaVersion${kv.key}Test"(type: Test) { + group = "Verification" + description = "Runs KafkaIO tests with Kafka clients API $kv.value" + outputs.upToDateWhen { false } + testClassesDirs = sourceSets.test.output.classesDirs + classpath = configurations."kafkaVersion${kv.key}" + sourceSets.test.runtimeClasspath + include '**/KafkaIOTest.class' + } +} + +kafkaVersions.each {kv -> + task "kafkaVersion${kv.key}BatchIT"(type: Test) { + group = "Verification" + description = "Runs KafkaIO IT tests with Kafka clients API $kv.value" + outputs.upToDateWhen { false } + testClassesDirs = sourceSets.test.output.classesDirs + classpath = configurations."kafkaVersion${kv.key}" + sourceSets.test.runtimeClasspath + + def pipelineOptions = [ + '--sourceOptions={' + + '"numRecords": "1000",' + + '"keySizeBytes": "10",' + + '"valueSizeBytes": "90"' + + '}', + "--readTimeout=120", + "--kafkaTopic=beam", + "--withTestcontainers=true", + "--kafkaContainerVersion=5.5.2", + ] + + systemProperty "beamTestPipelineOptions", groovy.json.JsonOutput.toJson(pipelineOptions) + include '**/KafkaIOIT.class' + + filter { + includeTestsMatching "*InBatch" + } + } +} + +task kafkaVersionsCompatibilityTest { group = "Verification" - description = 'Runs KafkaIO tests with Kafka clients API 2.1.0' - outputs.upToDateWhen { false } - testClassesDirs = sourceSets.test.output.classesDirs - classpath = configurations.kafkaVersion210 + sourceSets.test.runtimeClasspath - include '**/KafkaIOTest.class' - shouldRunAfter test - useJUnit { } + description = 'Runs KafkaIO with different Kafka client APIs' + def testNames = createTestList(kafkaVersions, "Test") + def batchItTestNames = createTestList(kafkaVersions, "BatchIT") + dependsOn testNames + dependsOn batchItTestNames } -check.dependsOn kafkaVersion210Test +static def createTestList(Map prefixMap, String suffix) { + return prefixMap.keySet().stream() + .map{version -> "kafkaVersion${version}${suffix}"} + .collect(Collectors.toList()) +} diff --git a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/CustomTimestampPolicyWithLimitedDelayTest.java b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/CustomTimestampPolicyWithLimitedDelayTest.java index 44474e2bf7e5..e647a185ff93 100644 --- a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/CustomTimestampPolicyWithLimitedDelayTest.java +++ b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/CustomTimestampPolicyWithLimitedDelayTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.kafka; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOIT.java b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOIT.java index da169926a521..b2772c3f09d7 100644 --- a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOIT.java +++ b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOIT.java @@ -36,6 +36,7 @@ import org.apache.beam.sdk.io.synthetic.SyntheticSourceOptions; import org.apache.beam.sdk.metrics.Counter; import org.apache.beam.sdk.metrics.Metrics; +import org.apache.beam.sdk.options.Default; import org.apache.beam.sdk.options.Description; import org.apache.beam.sdk.options.StreamingOptions; import org.apache.beam.sdk.options.Validation; @@ -55,12 +56,16 @@ import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; import org.apache.kafka.common.serialization.ByteArraySerializer; +import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Duration; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.utility.DockerImageName; /** * IO Integration test for {@link org.apache.beam.sdk.io.kafka.KafkaIO}. @@ -103,17 +108,29 @@ public class KafkaIOIT { @Rule public TestPipeline readPipeline = TestPipeline.create(); + private static KafkaContainer kafkaContainer; + @BeforeClass public static void setup() throws IOException { options = IOITHelper.readIOTestPipelineOptions(Options.class); sourceOptions = fromJsonString(options.getSourceOptions(), SyntheticSourceOptions.class); + if (options.isWithTestcontainers()) { + setupKafkaContainer(); + } else { + settings = + InfluxDBSettings.builder() + .withHost(options.getInfluxHost()) + .withDatabase(options.getInfluxDatabase()) + .withMeasurement(options.getInfluxMeasurement()) + .get(); + } + } - settings = - InfluxDBSettings.builder() - .withHost(options.getInfluxHost()) - .withDatabase(options.getInfluxDatabase()) - .withMeasurement(options.getInfluxMeasurement()) - .get(); + @AfterClass + public static void afterClass() { + if (kafkaContainer != null) { + kafkaContainer.stop(); + } } @Test @@ -144,9 +161,12 @@ public void testKafkaIOReadsAndWritesCorrectlyInStreaming() throws IOException { assertEquals( sourceOptions.numRecords, readElementMetric(readResult, NAMESPACE, READ_ELEMENT_METRIC_NAME)); - Set metrics = readMetrics(writeResult, readResult); - IOITMetrics.publish(options.getBigQueryDataset(), options.getBigQueryTable(), metrics); - IOITMetrics.publishToInflux(TEST_ID, TIMESTAMP, metrics, settings); + + if (!options.isWithTestcontainers()) { + Set metrics = readMetrics(writeResult, readResult); + IOITMetrics.publish(options.getBigQueryDataset(), options.getBigQueryTable(), metrics); + IOITMetrics.publishToInflux(TEST_ID, TIMESTAMP, metrics, settings); + } } @Test @@ -181,9 +201,11 @@ public void testKafkaIOReadsAndWritesCorrectlyInBatch() throws IOException { cancelIfTimeouted(readResult, readState); - Set metrics = readMetrics(writeResult, readResult); - IOITMetrics.publish(options.getBigQueryDataset(), options.getBigQueryTable(), metrics); - IOITMetrics.publishToInflux(TEST_ID, TIMESTAMP, metrics, settings); + if (!options.isWithTestcontainers()) { + Set metrics = readMetrics(writeResult, readResult); + IOITMetrics.publish(options.getBigQueryDataset(), options.getBigQueryTable(), metrics); + IOITMetrics.publishToInflux(TEST_ID, TIMESTAMP, metrics, settings); + } } private long readElementMetric(PipelineResult result, String namespace, String name) { @@ -262,7 +284,7 @@ public interface Options extends IOTestPipelineOptions, StreamingOptions { void setSourceOptions(String sourceOptions); @Description("Kafka bootstrap server addresses") - @Validation.Required + @Default.String("localhost:9092") String getKafkaBootstrapServerAddresses(); void setKafkaBootstrapServerAddresses(String address); @@ -278,6 +300,18 @@ public interface Options extends IOTestPipelineOptions, StreamingOptions { Integer getReadTimeout(); void setReadTimeout(Integer readTimeout); + + @Description("Whether to use testcontainers") + @Default.Boolean(false) + Boolean isWithTestcontainers(); + + void setWithTestcontainers(Boolean withTestcontainers); + + @Description("Kafka container version in format 'X.Y.Z'. Use when useTestcontainers is true") + @Nullable + String getKafkaContainerVersion(); + + void setKafkaContainerVersion(String kafkaContainerVersion); } private static class MapKafkaRecordsToStrings @@ -298,4 +332,13 @@ public static String getHashForRecordCount(long recordCount, Map h } return hash; } + + private static void setupKafkaContainer() { + kafkaContainer = + new KafkaContainer( + DockerImageName.parse("confluentinc/cp-kafka") + .withTag(options.getKafkaContainerVersion())); + kafkaContainer.start(); + options.setKafkaBootstrapServerAddresses(kafkaContainer.getBootstrapServers()); + } } diff --git a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOTest.java b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOTest.java index 1f7d5902fb26..91b610bb74ca 100644 --- a/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOTest.java +++ b/sdks/java/io/kafka/src/test/java/org/apache/beam/sdk/io/kafka/KafkaIOTest.java @@ -20,6 +20,7 @@ import static org.apache.beam.sdk.io.kafka.ConfluentSchemaRegistryDeserializerProviderTest.mockDeserializerProvider; import static org.apache.beam.sdk.metrics.MetricResultsMatchers.attemptedMetricsResult; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasItem; @@ -28,7 +29,6 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import static org.junit.internal.matchers.ThrowableCauseMatcher.hasCause; @@ -41,7 +41,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.nio.ByteBuffer; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Arrays; @@ -1408,7 +1408,7 @@ public void testKafkaWriteHeaders() throws Exception { assertEquals(1, headersArray.length); assertEquals(header.getKey(), headersArray[0].key()); assertEquals( - header.getValue(), new String(headersArray[0].value(), Charset.defaultCharset())); + header.getValue(), new String(headersArray[0].value(), StandardCharsets.UTF_8)); } } } @@ -1491,7 +1491,7 @@ public void processElement(ProcessContext ctx) { headers = Arrays.asList( new RecordHeader( - header.getKey(), header.getValue().getBytes(Charset.defaultCharset()))); + header.getKey(), header.getValue().getBytes(StandardCharsets.UTF_8))); } if (isSingleTopic) { ctx.output(new ProducerRecord<>(topic, null, ts, kv.getKey(), kv.getValue(), headers)); diff --git a/sdks/java/io/kinesis/src/test/java/org/apache/beam/sdk/io/kinesis/KinesisIOIT.java b/sdks/java/io/kinesis/src/test/java/org/apache/beam/sdk/io/kinesis/KinesisIOIT.java index f369668cd7c8..aa3b4aa971e0 100644 --- a/sdks/java/io/kinesis/src/test/java/org/apache/beam/sdk/io/kinesis/KinesisIOIT.java +++ b/sdks/java/io/kinesis/src/test/java/org/apache/beam/sdk/io/kinesis/KinesisIOIT.java @@ -61,7 +61,7 @@ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) public class KinesisIOIT implements Serializable { - private static final String LOCALSTACK_VERSION = "0.11.3"; + private static final String LOCALSTACK_VERSION = "0.11.4"; @Rule public TestPipeline pipelineWrite = TestPipeline.create(); @Rule public TestPipeline pipelineRead = TestPipeline.create(); diff --git a/sdks/java/io/kudu/src/test/java/org/apache/beam/sdk/io/kudu/KuduIOIT.java b/sdks/java/io/kudu/src/test/java/org/apache/beam/sdk/io/kudu/KuduIOIT.java index 2948f7032f4d..f607f1818c16 100644 --- a/sdks/java/io/kudu/src/test/java/org/apache/beam/sdk/io/kudu/KuduIOIT.java +++ b/sdks/java/io/kudu/src/test/java/org/apache/beam/sdk/io/kudu/KuduIOIT.java @@ -23,6 +23,7 @@ import static org.apache.beam.sdk.io.kudu.KuduTestUtils.SCHEMA; import static org.apache.beam.sdk.io.kudu.KuduTestUtils.createTableOptions; import static org.apache.beam.sdk.io.kudu.KuduTestUtils.rowCount; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Arrays; @@ -45,7 +46,6 @@ import org.apache.kudu.client.KuduTable; import org.apache.kudu.client.RowResult; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -228,7 +228,7 @@ private void runWrite() throws Exception { .withFormatFn(new GenerateUpsert())); writePipeline.run().waitUntilFinish(); - Assert.assertThat( + assertThat( "Wrong number of records in table", rowCount(kuduTable), equalTo(options.getNumberOfRecords())); diff --git a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/GenericRecordReadConverter.java b/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/GenericRecordReadConverter.java deleted file mode 100644 index ad77ad7b8f12..000000000000 --- a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/GenericRecordReadConverter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.parquet; - -import com.google.auto.value.AutoValue; -import java.io.Serializable; -import org.apache.avro.generic.GenericRecord; -import org.apache.beam.sdk.schemas.Schema; -import org.apache.beam.sdk.schemas.utils.AvroUtils; -import org.apache.beam.sdk.transforms.DoFn; -import org.apache.beam.sdk.transforms.PTransform; -import org.apache.beam.sdk.transforms.ParDo; -import org.apache.beam.sdk.values.PCollection; -import org.apache.beam.sdk.values.Row; - -/** A {@link PTransform} to convert {@link GenericRecord} to {@link Row}. */ -@AutoValue -abstract class GenericRecordReadConverter - extends PTransform, PCollection> implements Serializable { - - public abstract Schema beamSchema(); - - public static Builder builder() { - return new AutoValue_GenericRecordReadConverter.Builder(); - } - - @Override - public PCollection expand(PCollection input) { - return input - .apply( - "GenericRecordsToRows", - ParDo.of( - new DoFn() { - @ProcessElement - public void processElement(ProcessContext c) { - Row row = AvroUtils.toBeamRowStrict(c.element(), beamSchema()); - c.output(row); - } - })) - .setRowSchema(beamSchema()); - } - - @AutoValue.Builder - abstract static class Builder { - public abstract Builder beamSchema(Schema beamSchema); - - public abstract GenericRecordReadConverter build(); - } -} diff --git a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetIO.java b/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetIO.java index 5dd9a11d76d7..6adbc59db3d6 100644 --- a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetIO.java +++ b/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetIO.java @@ -18,6 +18,7 @@ package org.apache.beam.sdk.io.parquet; import static java.lang.String.format; +import static org.apache.parquet.Preconditions.checkArgument; import static org.apache.parquet.Preconditions.checkNotNull; import static org.apache.parquet.hadoop.ParquetFileWriter.Mode.OVERWRITE; @@ -38,21 +39,31 @@ import org.apache.beam.sdk.annotations.Experimental; import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.coders.AvroCoder; +import org.apache.beam.sdk.coders.CannotProvideCoderException; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.coders.CoderRegistry; import org.apache.beam.sdk.coders.StringUtf8Coder; import org.apache.beam.sdk.io.FileIO; +import org.apache.beam.sdk.io.FileIO.ReadableFile; import org.apache.beam.sdk.io.fs.ResourceId; import org.apache.beam.sdk.io.hadoop.SerializableConfiguration; +import org.apache.beam.sdk.io.parquet.ParquetIO.ReadFiles.ReadFn; +import org.apache.beam.sdk.io.parquet.ParquetIO.ReadFiles.SplitReadFn; import org.apache.beam.sdk.io.range.OffsetRange; import org.apache.beam.sdk.options.ValueProvider; +import org.apache.beam.sdk.schemas.utils.AvroUtils; import org.apache.beam.sdk.transforms.Create; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.transforms.ParDo; +import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.transforms.display.DisplayData; import org.apache.beam.sdk.transforms.splittabledofn.OffsetRangeTracker; import org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker; import org.apache.beam.sdk.values.PBegin; import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.annotations.VisibleForTesting; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps; import org.apache.hadoop.conf.Configuration; @@ -112,7 +123,7 @@ * to set the data model associated with the {@link AvroParquetReader} * *

    For more advanced use cases, like reading each file in a {@link PCollection} of {@link - * FileIO.ReadableFile}, use the {@link ReadFiles} transform. + * ReadableFile}, use the {@link ReadFiles} transform. * *

    For example: * @@ -147,9 +158,69 @@ * column in a row is stored interleaved. * *

    {@code
    - * * PCollection records = pipeline.apply(ParquetIO.read(SCHEMA).from("/foo/bar").withProjection(Projection_schema,Encoder_Schema));
    - * * ...
    - * *
    + * PCollection records =
    + *   pipeline
    + *     .apply(
    + *       ParquetIO.read(SCHEMA).from("/foo/bar").withProjection(Projection_schema,Encoder_Schema));
    + * }
    + * + *

    Reading records of an unknown schema

    + * + *

    To read records from files whose schema is unknown at pipeline construction time or differs + * between files, use {@link #parseGenericRecords(SerializableFunction)} - in this case, you will + * need to specify a parsing function for converting each {@link GenericRecord} into a value of your + * custom type. + * + *

    For example: + * + *

    {@code
    + * Pipeline p = ...;
    + *
    + * PCollection records =
    + *     p.apply(
    + *       ParquetIO.parseGenericRecords(
    + *           new SerializableFunction() {
    + *               public Foo apply(GenericRecord record) {
    + *                   // If needed, access the schema of the record using record.getSchema()
    + *                   return ...;
    + *               }
    + *           })
    + *           .from(...));
    + *
    + * // For reading from files
    + *  PCollection files = p.apply(...);
    + *
    + *  PCollection records =
    + *     files
    + *       .apply(
    + *           ParquetIO.parseFilesGenericRecords(
    + *               new SerializableFunction() {
    + *                   public Foo apply(GenericRecord record) {
    + *                       // If needed, access the schema of the record using record.getSchema()
    + *                       return ...;
    + *                   }
    + *           }));
    + * }
    + * + *

    Inferring Beam schemas from Parquet files

    + * + *

    If you want to use SQL or schema based operations on an Parquet-based PCollection, you must + * configure the read transform to infer the Beam schema and automatically setup the Beam related + * coders by doing: + * + *

    {@code
    + * PCollection parquetRecords =
    + *   p.apply(ParquetIO.read(...).from(...).withBeamSchemas(true));
    + * }
    + * + * You can also use it when reading a list of filenams from a {@code PCollection}: + * + *
    {@code
    + * PCollection filePatterns = p.apply(...);
    + *
    + * PCollection parquetRecords =
    + *   filePatterns
    + *     .apply(ParquetIO.readFiles(...).withBeamSchemas(true));
      * }
    * *

    Writing Parquet files

    @@ -193,16 +264,44 @@ public class ParquetIO { * pattern). */ public static Read read(Schema schema) { - return new AutoValue_ParquetIO_Read.Builder().setSchema(schema).setSplittable(false).build(); + return new AutoValue_ParquetIO_Read.Builder() + .setSchema(schema) + .setInferBeamSchema(false) + .setSplittable(false) + .build(); } /** * Like {@link #read(Schema)}, but reads each file in a {@link PCollection} of {@link - * org.apache.beam.sdk.io.FileIO.ReadableFile}, which allows more flexible usage. + * ReadableFile}, which allows more flexible usage. */ public static ReadFiles readFiles(Schema schema) { return new AutoValue_ParquetIO_ReadFiles.Builder() + .setSplittable(false) + .setInferBeamSchema(false) .setSchema(schema) + .build(); + } + + /** + * Reads {@link GenericRecord} from a Parquet file (or multiple Parquet files matching the + * pattern) and converts to user defined type using provided parseFn. + */ + public static Parse parseGenericRecords(SerializableFunction parseFn) { + return new AutoValue_ParquetIO_Parse.Builder() + .setParseFn(parseFn) + .setSplittable(false) + .build(); + } + + /** + * Reads {@link GenericRecord} from Parquet files and converts to user defined type using provided + * {@code parseFn}. + */ + public static ParseFiles parseFilesGenericRecords( + SerializableFunction parseFn) { + return new AutoValue_ParquetIO_ParseFiles.Builder() + .setParseFn(parseFn) .setSplittable(false) .build(); } @@ -221,6 +320,10 @@ public abstract static class Read extends PTransform filepattern); @@ -240,6 +345,8 @@ abstract static class Builder { abstract Builder setAvroDataModel(GenericData model); + abstract Builder setConfiguration(SerializableConfiguration configuration); + abstract Read build(); } @@ -261,6 +368,16 @@ public Read withProjection(Schema projectionSchema, Schema encoderSchema) { .build(); } + /** Specify Hadoop configuration for ParquetReader. */ + public Read withConfiguration(Map configuration) { + return toBuilder().setConfiguration(SerializableConfiguration.fromMap(configuration)).build(); + } + + @Experimental(Kind.SCHEMAS) + public Read withBeamSchemas(boolean inferBeamSchema) { + return toBuilder().setInferBeamSchema(inferBeamSchema).build(); + } + /** Enable the Splittable reading. */ public Read withSplit() { return toBuilder().setSplittable(true).build(); @@ -276,7 +393,7 @@ public Read withAvroDataModel(GenericData model) { @Override public PCollection expand(PBegin input) { checkNotNull(getFilepattern(), "Filepattern cannot be null."); - PCollection inputFiles = + PCollection inputFiles = input .apply( "Create filepattern", Create.ofProvider(getFilepattern(), StringUtf8Coder.of())) @@ -286,10 +403,14 @@ public PCollection expand(PBegin input) { return inputFiles.apply( readFiles(getSchema()) .withSplit() + .withBeamSchemas(getInferBeamSchema()) .withAvroDataModel(getAvroDataModel()) .withProjection(getProjectionSchema(), getEncoderSchema())); } - return inputFiles.apply(readFiles(getSchema()).withAvroDataModel(getAvroDataModel())); + return inputFiles.apply( + readFiles(getSchema()) + .withBeamSchemas(getInferBeamSchema()) + .withAvroDataModel(getAvroDataModel())); } @Override @@ -300,10 +421,147 @@ public void populateDisplayData(DisplayData.Builder builder) { } } + /** Implementation of {@link #parseGenericRecords(SerializableFunction)}. */ + @AutoValue + public abstract static class Parse extends PTransform> { + abstract @Nullable ValueProvider getFilepattern(); + + abstract SerializableFunction getParseFn(); + + abstract @Nullable SerializableConfiguration getConfiguration(); + + abstract boolean isSplittable(); + + abstract Builder toBuilder(); + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setFilepattern(ValueProvider inputFiles); + + abstract Builder setParseFn(SerializableFunction parseFn); + + abstract Builder setConfiguration(SerializableConfiguration configuration); + + abstract Builder setSplittable(boolean splittable); + + abstract Parse build(); + } + + public Parse from(ValueProvider inputFiles) { + return toBuilder().setFilepattern(inputFiles).build(); + } + + public Parse from(String inputFiles) { + return from(ValueProvider.StaticValueProvider.of(inputFiles)); + } + + /** Specify Hadoop configuration for ParquetReader. */ + public Parse withConfiguration(Map configuration) { + return toBuilder().setConfiguration(SerializableConfiguration.fromMap(configuration)).build(); + } + + public Parse withSplit() { + return toBuilder().setSplittable(true).build(); + } + + @Override + public PCollection expand(PBegin input) { + checkNotNull(getFilepattern(), "Filepattern cannot be null."); + return input + .apply("Create filepattern", Create.ofProvider(getFilepattern(), StringUtf8Coder.of())) + .apply(FileIO.matchAll()) + .apply(FileIO.readMatches()) + .apply( + parseFilesGenericRecords(getParseFn()) + .toBuilder() + .setSplittable(isSplittable()) + .build()); + } + } + + /** Implementation of {@link #parseFilesGenericRecords(SerializableFunction)}. */ + @AutoValue + public abstract static class ParseFiles + extends PTransform, PCollection> { + + abstract SerializableFunction getParseFn(); + + abstract @Nullable SerializableConfiguration getConfiguration(); + + abstract boolean isSplittable(); + + abstract Builder toBuilder(); + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setParseFn(SerializableFunction parseFn); + + abstract Builder setConfiguration(SerializableConfiguration configuration); + + abstract Builder setSplittable(boolean split); + + abstract ParseFiles build(); + } + + /** Specify Hadoop configuration for ParquetReader. */ + public ParseFiles withConfiguration(Map configuration) { + return toBuilder().setConfiguration(SerializableConfiguration.fromMap(configuration)).build(); + } + + public ParseFiles withSplit() { + return toBuilder().setSplittable(true).build(); + } + + @Override + public PCollection expand(PCollection input) { + checkArgument(!isGenericRecordOutput(), "Parse can't be used for reading as GenericRecord."); + + return input + .apply(ParDo.of(buildFileReadingFn())) + .setCoder(inferCoder(input.getPipeline().getCoderRegistry())); + } + + /** Returns Splittable or normal Parquet file reading DoFn. */ + private DoFn buildFileReadingFn() { + return isSplittable() + ? new SplitReadFn<>(null, null, getParseFn(), getConfiguration()) + : new ReadFn<>(null, getParseFn(), getConfiguration()); + } + + /** Returns true if expected output is {@code PCollection}. */ + private boolean isGenericRecordOutput() { + String outputType = TypeDescriptors.outputOf(getParseFn()).getType().getTypeName(); + return outputType.equals(GenericRecord.class.getTypeName()); + } + + /** + * Identifies the {@code Coder} to be used for the output PCollection. + * + *

    Returns {@link AvroCoder} if expected output is {@link GenericRecord}. + * + * @param coderRegistry the {@link org.apache.beam.sdk.Pipeline}'s CoderRegistry to identify + * Coder for expected output type of {@link #getParseFn()} + */ + private Coder inferCoder(CoderRegistry coderRegistry) { + if (isGenericRecordOutput()) { + throw new IllegalArgumentException("Parse can't be used for reading as GenericRecord."); + } + + // If not GenericRecord infer it from ParseFn. + try { + return coderRegistry.getCoder(TypeDescriptors.outputOf(getParseFn())); + } catch (CannotProvideCoderException e) { + throw new IllegalArgumentException( + "Unable to infer coder for output of parseFn. Specify it explicitly using withCoder().", + e); + } + } + } + /** Implementation of {@link #readFiles(Schema)}. */ @AutoValue public abstract static class ReadFiles - extends PTransform, PCollection> { + extends PTransform, PCollection> { abstract @Nullable Schema getSchema(); @@ -313,6 +571,10 @@ public abstract static class ReadFiles abstract @Nullable Schema getProjectionSchema(); + abstract @Nullable SerializableConfiguration getConfiguration(); + + abstract boolean getInferBeamSchema(); + abstract boolean isSplittable(); abstract Builder toBuilder(); @@ -327,6 +589,10 @@ abstract static class Builder { abstract Builder setProjectionSchema(Schema schema); + abstract Builder setConfiguration(SerializableConfiguration configuration); + + abstract Builder setInferBeamSchema(boolean inferBeamSchema); + abstract Builder setSplittable(boolean split); abstract ReadFiles build(); @@ -346,49 +612,86 @@ public ReadFiles withProjection(Schema projectionSchema, Schema encoderSchema) { .setSplittable(true) .build(); } + + /** Specify Hadoop configuration for ParquetReader. */ + public ReadFiles withConfiguration(Map configuration) { + return toBuilder().setConfiguration(SerializableConfiguration.fromMap(configuration)).build(); + } + + @Experimental(Kind.SCHEMAS) + public ReadFiles withBeamSchemas(boolean inferBeamSchema) { + return toBuilder().setInferBeamSchema(inferBeamSchema).build(); + } + /** Enable the Splittable reading. */ public ReadFiles withSplit() { return toBuilder().setSplittable(true).build(); } @Override - public PCollection expand(PCollection input) { + public PCollection expand(PCollection input) { checkNotNull(getSchema(), "Schema can not be null"); - if (isSplittable()) { - Schema coderSchema = getProjectionSchema() == null ? getSchema() : getEncoderSchema(); - return input - .apply(ParDo.of(new SplitReadFn(getAvroDataModel(), getProjectionSchema()))) - .setCoder(AvroCoder.of(coderSchema)); - } - return input - .apply(ParDo.of(new ReadFn(getAvroDataModel()))) - .setCoder(AvroCoder.of(getSchema())); + return input.apply(ParDo.of(getReaderFn())).setCoder(getCollectionCoder()); + } + + /** Returns Parquet file reading function based on {@link #isSplittable()}. */ + private DoFn getReaderFn() { + return isSplittable() + ? new SplitReadFn<>( + getAvroDataModel(), + getProjectionSchema(), + GenericRecordPassthroughFn.create(), + getConfiguration()) + : new ReadFn<>( + getAvroDataModel(), GenericRecordPassthroughFn.create(), getConfiguration()); + } + + /** + * Returns {@link org.apache.beam.sdk.schemas.SchemaCoder} when using Beam schemas, {@link + * AvroCoder} when not using Beam schema. + */ + @Experimental(Kind.SCHEMAS) + private Coder getCollectionCoder() { + Schema coderSchema = + getProjectionSchema() != null && isSplittable() ? getEncoderSchema() : getSchema(); + + return getInferBeamSchema() ? AvroUtils.schemaCoder(coderSchema) : AvroCoder.of(coderSchema); } @DoFn.BoundedPerElement - static class SplitReadFn extends DoFn { - private Class modelClass; + static class SplitReadFn extends DoFn { + private final Class modelClass; private static final Logger LOG = LoggerFactory.getLogger(SplitReadFn.class); - private String requestSchemaString; + private final String requestSchemaString; // Default initial splitting the file into blocks of 64MB. Unit of SPLIT_LIMIT is byte. private static final long SPLIT_LIMIT = 64000000; - SplitReadFn(GenericData model, Schema requestSchema) { + private @Nullable final SerializableConfiguration configuration; + + private final SerializableFunction parseFn; + + SplitReadFn( + GenericData model, + Schema requestSchema, + SerializableFunction parseFn, + @Nullable SerializableConfiguration configuration) { this.modelClass = model != null ? model.getClass() : null; this.requestSchemaString = requestSchema != null ? requestSchema.toString() : null; + this.parseFn = checkNotNull(parseFn, "GenericRecord parse function can't be null"); + this.configuration = configuration; } - ParquetFileReader getParquetFileReader(FileIO.ReadableFile file) throws Exception { + ParquetFileReader getParquetFileReader(ReadableFile file) throws Exception { ParquetReadOptions options = HadoopReadOptions.builder(getConfWithModelClass()).build(); return ParquetFileReader.open(new BeamParquetInputFile(file.openSeekable()), options); } @ProcessElement public void processElement( - @Element FileIO.ReadableFile file, + @Element ReadableFile file, RestrictionTracker tracker, - OutputReceiver outputReceiver) + OutputReceiver outputReceiver) throws Exception { LOG.debug( "start " @@ -400,7 +703,7 @@ public void processElement( if (modelClass != null) { model = (GenericData) modelClass.getMethod("get").invoke(null); } - AvroReadSupport readSupport = new AvroReadSupport(model); + AvroReadSupport readSupport = new AvroReadSupport<>(model); if (requestSchemaString != null) { AvroReadSupport.setRequestedProjection( conf, new Schema.Parser().parse(requestSchemaString)); @@ -468,7 +771,7 @@ record = recordReader.read(); file.toString()); continue; } - outputReceiver.output(record); + outputReceiver.output(parseFn.apply(record)); } catch (RuntimeException e) { throw new ParquetDecodingException( @@ -486,12 +789,10 @@ record = recordReader.read(); } } - public Configuration getConfWithModelClass() throws Exception { - Configuration conf = new Configuration(); - GenericData model = null; - if (modelClass != null) { - model = (GenericData) modelClass.getMethod("get").invoke(null); - } + public Configuration getConfWithModelClass() throws ReflectiveOperationException { + Configuration conf = SerializableConfiguration.newConfiguration(configuration); + GenericData model = buildModelObject(modelClass); + if (model != null && (model.getClass() == GenericData.class || model.getClass() == SpecificData.class)) { conf.setBoolean(AvroReadSupport.AVRO_COMPATIBILITY, true); @@ -502,7 +803,7 @@ public Configuration getConfWithModelClass() throws Exception { } @GetInitialRestriction - public OffsetRange getInitialRestriction(@Element FileIO.ReadableFile file) throws Exception { + public OffsetRange getInitialRestriction(@Element ReadableFile file) throws Exception { ParquetFileReader reader = getParquetFileReader(file); return new OffsetRange(0, reader.getRowGroups().size()); } @@ -511,7 +812,7 @@ public OffsetRange getInitialRestriction(@Element FileIO.ReadableFile file) thro public void split( @Restriction OffsetRange restriction, OutputReceiver out, - @Element FileIO.ReadableFile file) + @Element ReadableFile file) throws Exception { ParquetFileReader reader = getParquetFileReader(file); List rowGroups = reader.getRowGroups(); @@ -524,7 +825,7 @@ public void split( public ArrayList splitBlockWithLimit( long start, long end, List blockList, long limit) { - ArrayList offsetList = new ArrayList(); + ArrayList offsetList = new ArrayList<>(); long totalSize = 0; long rangeStart = start; for (long rangeEnd = start; rangeEnd < end; rangeEnd++) { @@ -543,8 +844,7 @@ public ArrayList splitBlockWithLimit( @NewTracker public RestrictionTracker newTracker( - @Restriction OffsetRange restriction, @Element FileIO.ReadableFile file) - throws Exception { + @Restriction OffsetRange restriction, @Element ReadableFile file) throws Exception { CountAndSize recordCountAndSize = getRecordCountAndSize(file, restriction); return new BlockTracker( restriction, @@ -558,12 +858,12 @@ public OffsetRange.Coder getRestrictionCoder() { } @GetSize - public double getSize(@Element FileIO.ReadableFile file, @Restriction OffsetRange restriction) + public double getSize(@Element ReadableFile file, @Restriction OffsetRange restriction) throws Exception { return getRecordCountAndSize(file, restriction).getSize(); } - private CountAndSize getRecordCountAndSize(FileIO.ReadableFile file, OffsetRange restriction) + private CountAndSize getRecordCountAndSize(ReadableFile file, OffsetRange restriction) throws Exception { ParquetFileReader reader = getParquetFileReader(file); double size = 0; @@ -573,8 +873,7 @@ private CountAndSize getRecordCountAndSize(FileIO.ReadableFile file, OffsetRange recordCount += block.getRowCount(); size += block.getTotalByteSize(); } - CountAndSize countAndSize = CountAndSize.create(recordCount, size); - return countAndSize; + return CountAndSize.create(recordCount, size); } @AutoValue @@ -604,7 +903,7 @@ public BlockTracker(OffsetRange range, long totalByteSize, long recordCount) { } } - public void makeProgress() throws Exception { + public void makeProgress() throws IOException { progress += approximateRecordSize; if (progress > totalWork) { throw new IOException("Making progress out of range"); @@ -618,17 +917,26 @@ public Progress getProgress() { } } - static class ReadFn extends DoFn { + static class ReadFn extends DoFn { + + private final Class modelClass; + + private final SerializableFunction parseFn; - private Class modelClass; + private final SerializableConfiguration configuration; - ReadFn(GenericData model) { + ReadFn( + GenericData model, + SerializableFunction parseFn, + SerializableConfiguration configuration) { this.modelClass = model != null ? model.getClass() : null; + this.parseFn = checkNotNull(parseFn, "GenericRecord parse function is null"); + this.configuration = configuration; } @ProcessElement public void processElement(ProcessContext processContext) throws Exception { - FileIO.ReadableFile file = processContext.element(); + ReadableFile file = processContext.element(); if (!file.getMetadata().isReadSeekEfficient()) { ResourceId filename = file.getMetadata().resourceId(); @@ -637,17 +945,21 @@ public void processElement(ProcessContext processContext) throws Exception { SeekableByteChannel seekableByteChannel = file.openSeekable(); - AvroParquetReader.Builder builder = - AvroParquetReader.builder(new BeamParquetInputFile(seekableByteChannel)); + AvroParquetReader.Builder builder = + (AvroParquetReader.Builder) + AvroParquetReader.builder( + new BeamParquetInputFile(seekableByteChannel)) + .withConf(SerializableConfiguration.newConfiguration(configuration)); + if (modelClass != null) { // all GenericData implementations have a static get method - builder = builder.withDataModel((GenericData) modelClass.getMethod("get").invoke(null)); + builder = builder.withDataModel(buildModelObject(modelClass)); } try (ParquetReader reader = builder.build()) { GenericRecord read; while ((read = reader.read()) != null) { - processContext.output(read); + processContext.output(parseFn.apply(read)); } } } @@ -655,7 +967,7 @@ public void processElement(ProcessContext processContext) throws Exception { private static class BeamParquetInputFile implements InputFile { - private SeekableByteChannel seekableByteChannel; + private final SeekableByteChannel seekableByteChannel; BeamParquetInputFile(SeekableByteChannel seekableByteChannel) { this.seekableByteChannel = seekableByteChannel; @@ -722,13 +1034,7 @@ public Sink withCompressionCodec(CompressionCodecName compressionCodecName) { /** Specifies configuration to be passed into the sink's writer. */ public Sink withConfiguration(Map configuration) { - Configuration hadoopConfiguration = new Configuration(); - for (Map.Entry entry : configuration.entrySet()) { - hadoopConfiguration.set(entry.getKey(), entry.getValue()); - } - return toBuilder() - .setConfiguration(new SerializableConfiguration(hadoopConfiguration)) - .build(); + return toBuilder().setConfiguration(SerializableConfiguration.fromMap(configuration)).build(); } private transient @Nullable ParquetWriter writer; @@ -742,17 +1048,13 @@ public void open(WritableByteChannel channel) throws IOException { BeamParquetOutputFile beamParquetOutputFile = new BeamParquetOutputFile(Channels.newOutputStream(channel)); - AvroParquetWriter.Builder builder = + this.writer = AvroParquetWriter.builder(beamParquetOutputFile) .withSchema(schema) .withCompressionCodec(getCompressionCodec()) - .withWriteMode(OVERWRITE); - - if (getConfiguration() != null) { - builder = builder.withConf(getConfiguration().get()); - } - - this.writer = builder.build(); + .withWriteMode(OVERWRITE) + .withConf(SerializableConfiguration.newConfiguration(getConfiguration())) + .build(); } @Override @@ -769,7 +1071,7 @@ public void flush() throws IOException { private static class BeamParquetOutputFile implements OutputFile { - private OutputStream outputStream; + private final OutputStream outputStream; BeamParquetOutputFile(OutputStream outputStream) { this.outputStream = outputStream; @@ -798,14 +1100,14 @@ public long defaultBlockSize() { private static class BeamOutputStream extends PositionOutputStream { private long position = 0; - private OutputStream outputStream; + private final OutputStream outputStream; private BeamOutputStream(OutputStream outputStream) { this.outputStream = outputStream; } @Override - public long getPos() throws IOException { + public long getPos() { return position; } @@ -838,6 +1140,34 @@ public void close() throws IOException { } } + /** Returns a model object created using provided modelClass or null. */ + private static GenericData buildModelObject(@Nullable Class modelClass) + throws ReflectiveOperationException { + return (modelClass == null) ? null : (GenericData) modelClass.getMethod("get").invoke(null); + } + + /** + * Passthrough function to provide seamless backward compatibility to ParquetIO's functionality. + */ + @VisibleForTesting + static final class GenericRecordPassthroughFn + implements SerializableFunction { + + private static final GenericRecordPassthroughFn singleton = new GenericRecordPassthroughFn(); + + static GenericRecordPassthroughFn create() { + return singleton; + } + + @Override + public GenericRecord apply(GenericRecord input) { + return input; + } + + /** Enforce singleton pattern, by disallowing construction with {@code new} operator. */ + private GenericRecordPassthroughFn() {} + } + /** Disallow construction of utility class. */ private ParquetIO() {} } diff --git a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetSchemaIOProvider.java b/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetSchemaIOProvider.java index 59c03f9b456c..fc429d2f06dd 100644 --- a/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetSchemaIOProvider.java +++ b/sdks/java/io/parquet/src/main/java/org/apache/beam/sdk/io/parquet/ParquetSchemaIOProvider.java @@ -19,11 +19,11 @@ import com.google.auto.service.AutoService; import java.io.Serializable; -import org.apache.avro.generic.GenericRecord; import org.apache.beam.sdk.annotations.Internal; import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.sdk.schemas.io.SchemaIO; import org.apache.beam.sdk.schemas.io.SchemaIOProvider; +import org.apache.beam.sdk.schemas.transforms.Convert; import org.apache.beam.sdk.schemas.utils.AvroUtils; import org.apache.beam.sdk.transforms.PTransform; import org.apache.beam.sdk.values.PBegin; @@ -95,14 +95,13 @@ public PTransform> buildReader() { return new PTransform>() { @Override public PCollection expand(PBegin begin) { - PTransform, PCollection> readConverter = - GenericRecordReadConverter.builder().beamSchema(dataSchema).build(); - return begin .apply( "ParquetIORead", - ParquetIO.read(AvroUtils.toAvroSchema(dataSchema)).from(location)) - .apply("GenericRecordToRow", readConverter); + ParquetIO.read(AvroUtils.toAvroSchema(dataSchema)) + .withBeamSchemas(true) + .from(location)) + .apply("GenericRecordToRow", Convert.toRows()); } }; } diff --git a/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/GenericRecordToRowTest.java b/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/GenericRecordToRowTest.java deleted file mode 100644 index 020926866a17..000000000000 --- a/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/GenericRecordToRowTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.beam.sdk.io.parquet; - -import java.io.Serializable; -import org.apache.avro.Schema; -import org.apache.avro.generic.GenericData; -import org.apache.avro.generic.GenericRecord; -import org.apache.beam.sdk.coders.AvroCoder; -import org.apache.beam.sdk.testing.PAssert; -import org.apache.beam.sdk.testing.TestPipeline; -import org.apache.beam.sdk.transforms.Create; -import org.apache.beam.sdk.values.PCollection; -import org.apache.beam.sdk.values.Row; -import org.junit.Rule; -import org.junit.Test; - -/** Unit tests for {@link GenericRecordReadConverter}. */ -public class GenericRecordToRowTest implements Serializable { - @Rule public transient TestPipeline pipeline = TestPipeline.create(); - - org.apache.beam.sdk.schemas.Schema payloadSchema = - org.apache.beam.sdk.schemas.Schema.builder() - .addField("name", org.apache.beam.sdk.schemas.Schema.FieldType.STRING) - .addField("favorite_number", org.apache.beam.sdk.schemas.Schema.FieldType.INT32) - .addField("favorite_color", org.apache.beam.sdk.schemas.Schema.FieldType.STRING) - .addField("price", org.apache.beam.sdk.schemas.Schema.FieldType.DOUBLE) - .build(); - - @Test - public void testConvertsGenericRecordToRow() { - String schemaString = - "{\"namespace\": \"example.avro\",\n" - + " \"type\": \"record\",\n" - + " \"name\": \"User\",\n" - + " \"fields\": [\n" - + " {\"name\": \"name\", \"type\": \"string\"},\n" - + " {\"name\": \"favorite_number\", \"type\": \"int\"},\n" - + " {\"name\": \"favorite_color\", \"type\": \"string\"},\n" - + " {\"name\": \"price\", \"type\": \"double\"}\n" - + " ]\n" - + "}"; - Schema schema = (new Schema.Parser()).parse(schemaString); - - GenericRecord before = new GenericData.Record(schema); - before.put("name", "Bob"); - before.put("favorite_number", 256); - before.put("favorite_color", "red"); - before.put("price", 2.4); - - AvroCoder coder = AvroCoder.of(schema); - - PCollection rows = - pipeline - .apply("create PCollection", Create.of(before).withCoder(coder)) - .apply( - "convert", GenericRecordReadConverter.builder().beamSchema(payloadSchema).build()); - - PAssert.that(rows) - .containsInAnyOrder( - Row.withSchema(payloadSchema).addValues("Bob", 256, "red", 2.4).build()); - pipeline.run(); - } -} diff --git a/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/ParquetIOTest.java b/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/ParquetIOTest.java index 684ff5f8be10..f3406dfa8b57 100644 --- a/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/ParquetIOTest.java +++ b/sdks/java/io/parquet/src/test/java/org/apache/beam/sdk/io/parquet/ParquetIOTest.java @@ -17,31 +17,40 @@ */ package org.apache.beam.sdk.io.parquet; +import static java.util.stream.Collectors.toList; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.avro.Schema; import org.apache.avro.generic.GenericData; +import org.apache.avro.generic.GenericDatumWriter; import org.apache.avro.generic.GenericRecord; import org.apache.avro.generic.GenericRecordBuilder; +import org.apache.avro.io.EncoderFactory; +import org.apache.avro.io.JsonEncoder; import org.apache.avro.reflect.ReflectData; import org.apache.beam.sdk.coders.AvroCoder; import org.apache.beam.sdk.io.FileIO; +import org.apache.beam.sdk.io.parquet.ParquetIO.GenericRecordPassthroughFn; import org.apache.beam.sdk.io.range.OffsetRange; import org.apache.beam.sdk.testing.PAssert; import org.apache.beam.sdk.testing.TestPipeline; import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.SerializableFunction; import org.apache.beam.sdk.transforms.Values; import org.apache.beam.sdk.transforms.display.DisplayData; import org.apache.beam.sdk.values.PCollection; import org.apache.parquet.hadoop.metadata.BlockMetaData; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -123,7 +132,7 @@ public void testWriteAndReadWithProjection() { } @Test - public void testBlockTracker() throws Exception { + public void testBlockTracker() { OffsetRange range = new OffsetRange(0, 1); ParquetIO.ReadFiles.BlockTracker tracker = new ParquetIO.ReadFiles.BlockTracker(range, 7, 3); assertEquals(tracker.getProgress().getWorkRemaining(), 1.0, 0.01); @@ -136,8 +145,10 @@ public void testBlockTracker() throws Exception { @Test public void testSplitBlockWithLimit() { - ParquetIO.ReadFiles.SplitReadFn testFn = new ParquetIO.ReadFiles.SplitReadFn(null, null); - ArrayList blockList = new ArrayList(); + ParquetIO.ReadFiles.SplitReadFn testFn = + new ParquetIO.ReadFiles.SplitReadFn<>( + null, null, ParquetIO.GenericRecordPassthroughFn.create(), null); + ArrayList blockList = new ArrayList<>(); ArrayList rangeList; BlockMetaData testBlock = mock(BlockMetaData.class); when(testBlock.getTotalByteSize()).thenReturn((long) 60); @@ -194,6 +205,51 @@ public void testWriteAndReadWithSplit() { readPipeline.run().waitUntilFinish(); } + @Test + public void testWriteAndReadWithBeamSchema() { + List records = generateGenericRecords(1000); + + mainPipeline + .apply(Create.of(records).withCoder(AvroCoder.of(SCHEMA))) + .apply( + FileIO.write() + .via(ParquetIO.sink(SCHEMA)) + .to(temporaryFolder.getRoot().getAbsolutePath())); + + mainPipeline.run().waitUntilFinish(); + + PCollection readBackRecords = + readPipeline.apply( + ParquetIO.read(SCHEMA) + .from(temporaryFolder.getRoot().getAbsolutePath() + "/*") + .withBeamSchemas(true)); + + PAssert.that(readBackRecords).containsInAnyOrder(records); + readPipeline.run().waitUntilFinish(); + } + + @Test + public void testWriteAndReadFilesAsJsonForWithSplitForUnknownSchema() { + List records = generateGenericRecords(1000); + + mainPipeline + .apply(Create.of(records).withCoder(AvroCoder.of(SCHEMA))) + .apply( + FileIO.write() + .via(ParquetIO.sink(SCHEMA)) + .to(temporaryFolder.getRoot().getAbsolutePath())); + mainPipeline.run().waitUntilFinish(); + + PCollection readBackAsJsonWithSplit = + readPipeline.apply( + ParquetIO.parseGenericRecords(ParseGenericRecordAsJsonFn.create()) + .from(temporaryFolder.getRoot().getAbsolutePath() + "/*") + .withSplit()); + + PAssert.that(readBackAsJsonWithSplit).containsInAnyOrder(convertRecordsToJson(records)); + readPipeline.run().waitUntilFinish(); + } + @Test public void testWriteAndReadFiles() { List records = generateGenericRecords(1000); @@ -216,6 +272,44 @@ public void testWriteAndReadFiles() { mainPipeline.run().waitUntilFinish(); } + @Test + public void testReadFilesAsJsonForUnknownSchemaFiles() { + List records = generateGenericRecords(1000); + List expectedJsonRecords = convertRecordsToJson(records); + + PCollection writeThenRead = + mainPipeline + .apply(Create.of(records).withCoder(AvroCoder.of(SCHEMA))) + .apply( + FileIO.write() + .via(ParquetIO.sink(SCHEMA)) + .to(temporaryFolder.getRoot().getAbsolutePath())) + .getPerDestinationOutputFilenames() + .apply(Values.create()) + .apply(FileIO.matchAll()) + .apply(FileIO.readMatches()) + .apply(ParquetIO.parseFilesGenericRecords(ParseGenericRecordAsJsonFn.create())); + + assertEquals(1000, expectedJsonRecords.size()); + PAssert.that(writeThenRead).containsInAnyOrder(expectedJsonRecords); + + mainPipeline.run().waitUntilFinish(); + } + + @Test + @SuppressWarnings({"nullable", "ConstantConditions"} /* forced check. */) + public void testReadFilesUnknownSchemaFilesForGenericRecordThrowException() { + IllegalArgumentException illegalArgumentException = + assertThrows( + IllegalArgumentException.class, + () -> + ParquetIO.parseFilesGenericRecords(GenericRecordPassthroughFn.create()) + .expand(null)); + + assertEquals( + "Parse can't be used for reading as GenericRecord.", illegalArgumentException.getMessage()); + } + private List generateGenericRecords(long count) { ArrayList data = new ArrayList<>(); GenericRecordBuilder builder = new GenericRecordBuilder(SCHEMA); @@ -243,7 +337,7 @@ private List generateRequestedRecords(long count) { public void testReadDisplayData() { DisplayData displayData = DisplayData.from(ParquetIO.read(SCHEMA).from("foo.parquet")); - Assert.assertThat(displayData, hasDisplayItem("filePattern", "foo.parquet")); + assertThat(displayData, hasDisplayItem("filePattern", "foo.parquet")); } public static class TestRecord { @@ -345,4 +439,32 @@ public void testWriteAndReadwithSplitUsingReflectDataSchemaWithDataModel() { PAssert.that(readBack).containsInAnyOrder(records); readPipeline.run().waitUntilFinish(); } + + /** Returns list of JSON representation of GenericRecords. */ + private static List convertRecordsToJson(List records) { + return records.stream().map(ParseGenericRecordAsJsonFn.create()::apply).collect(toList()); + } + + /** Sample Parse function that converts GenericRecord as JSON. for testing. */ + private static class ParseGenericRecordAsJsonFn + implements SerializableFunction { + + public static ParseGenericRecordAsJsonFn create() { + return new ParseGenericRecordAsJsonFn(); + } + + @Override + public String apply(GenericRecord input) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + try { + JsonEncoder jsonEncoder = EncoderFactory.get().jsonEncoder(input.getSchema(), baos, true); + new GenericDatumWriter(input.getSchema()).write(input, jsonEncoder); + jsonEncoder.flush(); + } catch (IOException ioException) { + throw new RuntimeException("error converting record to JSON", ioException); + } + return baos.toString(); + } + } } diff --git a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/KeyPairUtils.java b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/KeyPairUtils.java index 437e96a07764..ca5753cc396d 100644 --- a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/KeyPairUtils.java +++ b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/KeyPairUtils.java @@ -18,7 +18,7 @@ package org.apache.beam.sdk.io.snowflake; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.security.InvalidKeyException; @@ -59,7 +59,7 @@ public static PrivateKey preparePrivateKey(String privateKey, String privateKeyP public static String readPrivateKeyFile(String privateKeyPath) { try { byte[] keyBytes = Files.readAllBytes(Paths.get(privateKeyPath)); - return new String(keyBytes, Charset.defaultCharset()); + return new String(keyBytes, StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException("Can't read private key from provided path"); } diff --git a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/crosslanguage/ReadBuilder.java b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/crosslanguage/ReadBuilder.java index ad275ed1b58a..47bd7ff06df0 100644 --- a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/crosslanguage/ReadBuilder.java +++ b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/crosslanguage/ReadBuilder.java @@ -18,7 +18,7 @@ package org.apache.beam.sdk.io.snowflake.crosslanguage; import java.io.Serializable; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import org.apache.beam.sdk.annotations.Experimental; import org.apache.beam.sdk.annotations.Experimental.Kind; import org.apache.beam.sdk.coders.ByteArrayCoder; @@ -59,7 +59,7 @@ public static SnowflakeIO.CsvMapper getCsvMapper() { return parts -> { String partsCSV = String.join(",", parts); - return partsCSV.getBytes(Charset.defaultCharset()); + return partsCSV.getBytes(StandardCharsets.UTF_8); }; } } diff --git a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/services/SnowflakeBatchServiceImpl.java b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/services/SnowflakeBatchServiceImpl.java index bee0daa8c637..2927829e7b6c 100644 --- a/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/services/SnowflakeBatchServiceImpl.java +++ b/sdks/java/io/snowflake/src/main/java/org/apache/beam/sdk/io/snowflake/services/SnowflakeBatchServiceImpl.java @@ -20,7 +20,7 @@ import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument; import java.math.BigInteger; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -98,7 +98,7 @@ private String copyIntoStage(SnowflakeBatchServiceConfig config) throws SQLExcep } private String getASCIICharRepresentation(String input) { - return String.format("0x%x", new BigInteger(1, input.getBytes(Charset.defaultCharset()))); + return String.format("0x%x", new BigInteger(1, input.getBytes(StandardCharsets.UTF_8))); } /** diff --git a/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/FakeSnowflakeStreamingServiceImpl.java b/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/FakeSnowflakeStreamingServiceImpl.java index 8df12afa06b7..b2abd8623cc5 100644 --- a/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/FakeSnowflakeStreamingServiceImpl.java +++ b/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/FakeSnowflakeStreamingServiceImpl.java @@ -21,7 +21,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; @@ -61,7 +61,7 @@ private List readGZIPFile(String file) { List lines = new ArrayList<>(); try { GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file)); - BufferedReader br = new BufferedReader(new InputStreamReader(gzip, Charset.defaultCharset())); + BufferedReader br = new BufferedReader(new InputStreamReader(gzip, StandardCharsets.UTF_8)); String line; while ((line = br.readLine()) != null) { diff --git a/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/TestUtils.java b/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/TestUtils.java index 5f094bf22203..64e4e4391496 100644 --- a/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/TestUtils.java +++ b/sdks/java/io/snowflake/src/test/java/org/apache/beam/sdk/io/snowflake/test/TestUtils.java @@ -26,7 +26,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -152,7 +152,7 @@ public static List readGZIPFile(String file) { List lines = new ArrayList<>(); try { GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file)); - BufferedReader br = new BufferedReader(new InputStreamReader(gzip, Charset.defaultCharset())); + BufferedReader br = new BufferedReader(new InputStreamReader(gzip, StandardCharsets.UTF_8)); String line; while ((line = br.readLine()) != null) { @@ -175,7 +175,7 @@ public static String getValidPrivateKeyPath(Class c) { public static String getRawValidPrivateKey(Class c) throws IOException { byte[] keyBytes = Files.readAllBytes(Paths.get(getValidPrivateKeyPath(c))); - return new String(keyBytes, Charset.defaultCharset()); + return new String(keyBytes, StandardCharsets.UTF_8); } public static String getPrivateKeyPassphrase() { diff --git a/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/JavaBinCodecCoderTest.java b/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/JavaBinCodecCoderTest.java index 19c6aeadf3b3..900bbfd2d546 100644 --- a/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/JavaBinCodecCoderTest.java +++ b/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/JavaBinCodecCoderTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.io.solr; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; diff --git a/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/SolrIOTest.java b/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/SolrIOTest.java index 16c4815db4c0..79d4947926a0 100644 --- a/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/SolrIOTest.java +++ b/sdks/java/io/solr/src/test/java/org/apache/beam/sdk/io/solr/SolrIOTest.java @@ -24,7 +24,7 @@ import com.carrotsearch.randomizedtesting.RandomizedRunner; import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Set; import org.apache.beam.sdk.Pipeline; @@ -112,7 +112,7 @@ public static void beforeClass() throws Exception { ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader(); zkStateReader .getZkClient() - .setData("/security.json", securityJson.getBytes(Charset.defaultCharset()), true); + .setData("/security.json", securityJson.getBytes(StandardCharsets.UTF_8), true); String zkAddress = cluster.getZkServer().getZkAddress(); connectionConfiguration = SolrIO.ConnectionConfiguration.create(zkAddress).withBasicCredentials("solr", password); diff --git a/sdks/java/io/thrift/build.gradle b/sdks/java/io/thrift/build.gradle index 90bec04697b8..d22b934256e7 100644 --- a/sdks/java/io/thrift/build.gradle +++ b/sdks/java/io/thrift/build.gradle @@ -20,7 +20,15 @@ plugins { id 'org.apache.beam.module' // id "org.jruyi.thrift" version "0.4.1" } -applyJavaNature(automaticModuleName: 'org.apache.beam.sdk.io.thrift') +applyJavaNature( + automaticModuleName: 'org.apache.beam.sdk.io.thrift', + generatedClassPatterns: [ + /^org\.apache\.beam\.sdk\.io\.thrift\.TestThriftStruct/, + /^org\.apache\.beam\.sdk\.io\.thrift\.TestThriftInnerStruct/, + /^org\.apache\.beam\.sdk\.io\.thrift\.TestThriftEnum/, + /^org\.apache\.beam\.sdk\.io\.thrift\.TestThriftUnion/, + ], +) description = "Apache Beam :: SDKs :: Java :: IO :: Thrift" ext.summary = "IO to read and write Thrift encoded data files" diff --git a/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftCoder.java b/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftCoder.java index 242d58137230..91c638c95808 100644 --- a/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftCoder.java +++ b/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftCoder.java @@ -17,7 +17,6 @@ */ package org.apache.beam.sdk.io.thrift; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -37,7 +36,7 @@ @SuppressWarnings({ "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) }) -class ThriftCoder extends CustomCoder { +public class ThriftCoder extends CustomCoder { private final Class type; private final TProtocolFactory protocolFactory; @@ -57,7 +56,7 @@ protected ThriftCoder(Class type, TProtocolFactory protocolFactory) { * @return ThriftCoder initialize with class to be encoded/decoded and {@link TProtocolFactory} * used to encode/decode. */ - static ThriftCoder of(Class clazz, TProtocolFactory protocolFactory) { + public static ThriftCoder of(Class clazz, TProtocolFactory protocolFactory) { return new ThriftCoder<>(clazz, protocolFactory); } @@ -72,15 +71,13 @@ static ThriftCoder of(Class clazz, TProtocolFactory protocolFactory) { */ @Override public void encode(T value, OutputStream outStream) throws CoderException, IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - TProtocol protocol = protocolFactory.getProtocol(new TIOStreamTransport(baos)); + TProtocol protocol = protocolFactory.getProtocol(new TIOStreamTransport(outStream)); try { TBase tBase = (TBase) value; tBase.write(protocol); } catch (Exception te) { throw new CoderException("Could not write value. Error: " + te.getMessage()); } - outStream.write(baos.toByteArray()); } /** diff --git a/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftSchema.java b/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftSchema.java new file mode 100644 index 000000000000..0bf47c671d35 --- /dev/null +++ b/sdks/java/io/thrift/src/main/java/org/apache/beam/sdk/io/thrift/ThriftSchema.java @@ -0,0 +1,408 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.thrift; + +import static java.util.Collections.unmodifiableMap; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; +import org.apache.beam.sdk.annotations.Experimental; +import org.apache.beam.sdk.schemas.FieldValueGetter; +import org.apache.beam.sdk.schemas.FieldValueTypeInformation; +import org.apache.beam.sdk.schemas.GetterBasedSchemaProvider; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.Schema.Builder; +import org.apache.beam.sdk.schemas.Schema.FieldType; +import org.apache.beam.sdk.schemas.SchemaProvider; +import org.apache.beam.sdk.schemas.SchemaUserTypeCreator; +import org.apache.beam.sdk.schemas.logicaltypes.EnumerationType; +import org.apache.beam.sdk.schemas.logicaltypes.OneOfType; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.thrift.TBase; +import org.apache.thrift.TEnum; +import org.apache.thrift.TFieldIdEnum; +import org.apache.thrift.TFieldRequirementType; +import org.apache.thrift.TUnion; +import org.apache.thrift.meta_data.EnumMetaData; +import org.apache.thrift.meta_data.FieldMetaData; +import org.apache.thrift.meta_data.FieldValueMetaData; +import org.apache.thrift.meta_data.ListMetaData; +import org.apache.thrift.meta_data.MapMetaData; +import org.apache.thrift.meta_data.SetMetaData; +import org.apache.thrift.meta_data.StructMetaData; +import org.apache.thrift.protocol.TType; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * Schema provider for generated thrift types. + * + *

      + *
    • Primitive type mapping is straight-forward (e.g. {@link TType#I32} -> {@link + * FieldType#INT32}). + *
    • {@link TType#STRING} gets mapped as either {@link FieldType#STRING} or {@link + * FieldType#BYTES}, depending on whether the {@link FieldValueMetaData#isBinary()} flag is + * set. + *
    • {@link TType#MAP} becomes {@link FieldType#map(FieldType, FieldType) a beam map} passing + * the key and value types recursively. + *
    • {@link TType#SET} gets translated into a beam {@link FieldType#iterable(FieldType) + * iterable}, passing the corresponding element type. + *
    • {@link TType#LIST} becomes an {@link FieldType#array(FieldType) array} of the corresponding + * element type. + *
    • {@link TType#ENUM thrift enums} are converted into {@link EnumerationType beam enumeration + * types}. + *
    • {@link TUnion thrift union} types get mapped to {@link OneOfType beam one-of} types. + *
    + * + *

    The mapping logic relies on the available {@link FieldMetaData thrift metadata} introspection + * and tries to make as few assumptions about the generated code as possible (i.e. does not rely on + * accessor naming convention, as the thrift compiler supports options such as "beans" or + * "fullcamel"/"nocamel".
    + * However, the following strong assumptions are made by this class: + * + *

      + *
    • All thrift generated classes implement {@link TBase}, except for enums which become {@link + * Enum java enums} implementing {@link TEnum}. + *
    • All {@link TUnion} types provide static factory methods for each of the supported field + * types, with the same name as the field itself and only one such method taking a single + * parameter exists. + *
    • All non-union types have a corresponding java field with the same name for every field in + * the original thrift source file. + *
    + * + *

    Thrift typedefs for container types (and possibly others) do not preserve the full type + * information. For this reason, this class allows for {@link #custom() manual registration} of such + * "lossy" typedefs with their corresponding beam types. + * + *

    Note: Thrift encoding and decoding are not fully symmetrical, i.e. the {@link + * TBase#isSet(TFieldIdEnum) isSet} flag may not be preserved upon converting a thrift object to a + * beam row and back. On encoding, we extract all thrift values, no matter if the fields are set or + * not. On decoding, we set all non-{@code null} beam row values to the corresponding thrift fields, + * leaving the rest unset. + */ +@Experimental(Experimental.Kind.SCHEMAS) +public final class ThriftSchema extends GetterBasedSchemaProvider { + private static final ThriftSchema defaultProvider = new ThriftSchema(Collections.emptyMap()); + + private final Map typedefs; + + private ThriftSchema(Map typedefs) { + this.typedefs = typedefs; + } + + /** + * Schema provider that maps any thrift type to a Beam schema, assuming that any typedefs that + * might have been used in the thrift definitions will preserve all required metadata to infer the + * beam type (which is the case for any primitive typedefs and alike). + * + * @see #custom() for how to manually pass the beam type for container typedefs + */ + public static @NonNull SchemaProvider provider() { + return defaultProvider; + } + + /** + * Builds a schema provider that maps any thrift type to a Beam schema, allowing for custom thrift + * typedef entries (which cannot be resolved using the available metadata) to be manually + * registered with their corresponding beam types. + * + *

    E.g. {@code typedef set StringSet} will not carry the element type information and + * needs to be manually mapped here as {@code .custom().withTypedef("StringSet", + * FieldType.iterable(FieldType.STRING)).provider()}. + */ + public static @NonNull Customizer custom() { + return new Customizer(); + } + + public static final class Customizer { + private final Map typedefs = new HashMap<>(); + + private Customizer() {} + + public @NonNull Customizer typedef( + @NonNull String thriftTypedefName, @NonNull FieldType beamType) { + typedefs.put(thriftTypedefName, beamType); + return this; + } + + public @NonNull SchemaProvider provider() { + if (typedefs.isEmpty()) { + return defaultProvider; + } else { + return new ThriftSchema(unmodifiableMap(new HashMap<>(typedefs))); + } + } + } + + @Override + public @NonNull Schema schemaFor(TypeDescriptor typeDescriptor) { + return schemaFor(typeDescriptor.getRawType()); + } + + private Schema schemaFor(Class targetClass) { + if (!TBase.class.isAssignableFrom(targetClass)) { + throw new IllegalArgumentException("Expected thrift class but got: " + targetClass); + } + final Stream fields = + thriftFieldDescriptors(targetClass).values().stream().map(this::beamField); + if (TUnion.class.isAssignableFrom(targetClass)) { + return OneOfType.create(fields.collect(Collectors.toList())).getOneOfSchema(); + } else { + return fields + .reduce(Schema.builder(), Builder::addField, ThriftSchema::throwingCombiner) + .build(); + } + } + + private static X throwingCombiner(X lhs, X rhs) { + throw new IllegalStateException(); + } + + private Schema.Field beamField(FieldMetaData fieldDescriptor) { + try { + final FieldType type = beamType(fieldDescriptor.valueMetaData); + switch (fieldDescriptor.requirementType) { + case TFieldRequirementType.REQUIRED: + return Schema.Field.of(fieldDescriptor.fieldName, type); + case TFieldRequirementType.DEFAULT: + // aka "opt-in, req-out", so it's safest to fall through to nullable + case TFieldRequirementType.OPTIONAL: + default: + return Schema.Field.nullable(fieldDescriptor.fieldName, type); + } + } catch (Exception e) { + throw new IllegalStateException( + "Could not infer beam type for thrift field: " + fieldDescriptor.fieldName, e); + } + } + + @SuppressWarnings("rawtypes") + @Override + public @NonNull List fieldValueGetters( + @NonNull Class targetClass, @NonNull Schema schema) { + return schemaFieldDescriptors(targetClass, schema).keySet().stream() + .map(FieldExtractor::new) + .collect(Collectors.toList()); + } + + @Override + public @NonNull List fieldValueTypeInformations( + @NonNull Class targetClass, @NonNull Schema schema) { + return schemaFieldDescriptors(targetClass, schema).values().stream() + .map(descriptor -> fieldValueTypeInfo(targetClass, descriptor.fieldName)) + .collect(Collectors.toList()); + } + + @SuppressWarnings("unchecked") + private static > + Map thriftFieldDescriptors(Class targetClass) { + return (Map) FieldMetaData.getStructMetaDataMap((Class) targetClass); + } + + private FieldValueTypeInformation fieldValueTypeInfo(Class type, String fieldName) { + if (TUnion.class.isAssignableFrom(type)) { + final List factoryMethods = + Stream.of(type.getDeclaredMethods()) + .filter(m -> m.getName().equals(fieldName)) + .filter(m -> m.getModifiers() == (Modifier.PUBLIC | Modifier.STATIC)) + .filter(m -> m.getParameterCount() == 1) + .filter(m -> m.getReturnType() == type) + .collect(Collectors.toList()); + if (factoryMethods.isEmpty()) { + throw new IllegalArgumentException( + String.format( + "No suitable static factory method: %s.%s(...)", type.getName(), fieldName)); + } + if (factoryMethods.size() > 1) { + throw new IllegalStateException("Overloaded factory methods: " + factoryMethods); + } + return FieldValueTypeInformation.forSetter(factoryMethods.get(0), ""); + } else { + try { + return FieldValueTypeInformation.forField(type.getDeclaredField(fieldName)); + } catch (NoSuchFieldException e) { + throw new IllegalArgumentException(e); + } + } + } + + @Override + public @NonNull SchemaUserTypeCreator schemaTypeCreator( + @NonNull Class targetClass, @NonNull Schema schema) { + final Map fieldDescriptors = + schemaFieldDescriptors(targetClass, schema); + return params -> restoreThriftObject(targetClass, fieldDescriptors, params); + } + + @SuppressWarnings("nullness") + private Map schemaFieldDescriptors( + Class targetClass, Schema schema) { + final Map fieldDescriptors = thriftFieldDescriptors(targetClass); + final Map fields = + fieldDescriptors.keySet().stream() + .collect(Collectors.toMap(TFieldIdEnum::getFieldName, Function.identity())); + + return schema.getFields().stream() + .map(Schema.Field::getName) + .map(fields::get) + .collect( + Collectors.toMap( + Function.identity(), + fieldDescriptors::get, + ThriftSchema::throwingCombiner, + LinkedHashMap::new)); + } + + private > T restoreThriftObject( + Class targetClass, Map fields, Object[] params) { + if (params.length != fields.size()) { + throw new IllegalArgumentException( + String.format( + "The parameter list: %s does not match the expected fields: %s", + Arrays.toString(params), fields.keySet())); + } + try { + @SuppressWarnings("unchecked") + final T thrift = (T) targetClass.getDeclaredConstructor().newInstance(); + final Iterator> iter = fields.entrySet().iterator(); + Stream.of(params).forEach(param -> setThriftField(thrift, iter.next(), param)); + return thrift; + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private > void setThriftField( + T thrift, Entry fieldDescriptor, Object value) { + final FieldT field = fieldDescriptor.getKey(); + final FieldMetaData descriptor = fieldDescriptor.getValue(); + if (value != null) { + final Object actualValue; + switch (descriptor.valueMetaData.type) { + case TType.SET: + actualValue = + StreamSupport.stream(((Iterable) value).spliterator(), false) + .collect(Collectors.toSet()); + break; + case TType.ENUM: + final Class enumClass = + ((EnumMetaData) descriptor.valueMetaData).enumClass; + @SuppressWarnings("nullness") // it's either "nullness" or "unsafe", apparently + final TEnum @NonNull [] enumConstants = enumClass.getEnumConstants(); + actualValue = enumConstants[(Integer) value]; + break; + default: + actualValue = value; + } + thrift.setFieldValue(field, actualValue); + } + } + + private & TEnum> FieldType beamType(FieldValueMetaData metadata) { + if (metadata.isTypedef()) { + final FieldType beamType = typedefs.get(metadata.getTypedefName()); + if (beamType != null) { + return beamType; + } + } + switch (metadata.type) { + case TType.BOOL: + return FieldType.BOOLEAN; + case TType.BYTE: + return FieldType.BYTE; + case TType.I16: + return FieldType.INT16; + case TType.I32: + return FieldType.INT32; + case TType.I64: + return FieldType.INT64; + case TType.DOUBLE: + return FieldType.DOUBLE; + case TType.STRING: + return metadata.isBinary() ? FieldType.BYTES : FieldType.STRING; + case TType.SET: + final FieldValueMetaData setElemMetadata = ((SetMetaData) metadata).elemMetaData; + return FieldType.iterable(beamType(setElemMetadata)); + case TType.LIST: + final FieldValueMetaData listElemMetadata = ((ListMetaData) metadata).elemMetaData; + return FieldType.array(beamType(listElemMetadata)); + case TType.MAP: + final MapMetaData mapMetadata = ((MapMetaData) metadata); + return FieldType.map( + beamType(mapMetadata.keyMetaData), beamType(mapMetadata.valueMetaData)); + case TType.STRUCT: + final StructMetaData structMetadata = ((StructMetaData) metadata); + return FieldType.row(schemaFor(structMetadata.structClass)); + case TType.ENUM: + @SuppressWarnings("unchecked") + final Class enumClass = (Class) ((EnumMetaData) metadata).enumClass; + @SuppressWarnings("nullness") // it's either "nullness" or "unsafe", apparently + final EnumT @NonNull [] enumConstants = enumClass.getEnumConstants(); + final String[] enumValues = + Stream.of(enumConstants).map(EnumT::name).toArray(String[]::new); + return FieldType.logicalType(EnumerationType.create(enumValues)); + default: + throw new IllegalArgumentException("Unsupported thrift type code: " + metadata.type); + } + } + + private static class FieldExtractor> + implements FieldValueGetter { + private final FieldT field; + + private FieldExtractor(FieldT field) { + this.field = field; + } + + @Override + public @Nullable Object get(T thrift) { + if (!(thrift instanceof TUnion) || thrift.isSet(field)) { + final Object value = thrift.getFieldValue(field); + if (value instanceof Enum) { + return ((Enum) value).ordinal(); + } else { + return value; + } + } else { + return null; + } + } + + @Override + public @NonNull String name() { + return field.getFieldName(); + } + + @Override + public String toString() { + return name(); + } + } +} diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftEnum.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftEnum.java new file mode 100644 index 000000000000..dbb434a8f8f5 --- /dev/null +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftEnum.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.thrift; + +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-12") +public enum TestThriftEnum implements org.apache.thrift.TEnum { + C1(0), + C2(1); + + private final int value; + + private TestThriftEnum(int value) { + this.value = value; + } + + /** Get the integer value of this enum value, as defined in the Thrift IDL. */ + public int getValue() { + return value; + } + + /** + * Find a the enum type by its integer value, as defined in the Thrift IDL. + * + * @return null if the value is not found. + */ + @org.apache.thrift.annotation.Nullable + public static TestThriftEnum findByValue(int value) { + switch (value) { + case 0: + return C1; + case 1: + return C2; + default: + return null; + } + } +} diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftInnerStruct.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftInnerStruct.java new file mode 100644 index 000000000000..26e5ac7ba61c --- /dev/null +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftInnerStruct.java @@ -0,0 +1,526 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.thrift; + +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-12") +public class TestThriftInnerStruct + implements org.apache.thrift.TBase, + java.io.Serializable, + Cloneable, + Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = + new org.apache.thrift.protocol.TStruct("TestThriftInnerStruct"); + + private static final org.apache.thrift.protocol.TField TEST_NAME_TYPEDEF_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testNameTypedef", org.apache.thrift.protocol.TType.STRING, (short) 1); + private static final org.apache.thrift.protocol.TField TEST_AGE_TYPEDEF_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testAgeTypedef", org.apache.thrift.protocol.TType.I16, (short) 2); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = + new TestThriftInnerStructStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = + new TestThriftInnerStructTupleSchemeFactory(); + + private @org.apache.thrift.annotation.Nullable java.lang.String testNameTypedef; // required + private short testAgeTypedef; // required + + /** + * The set of fields this struct contains, along with convenience methods for finding and + * manipulating them. + */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + TEST_NAME_TYPEDEF((short) 1, "testNameTypedef"), + TEST_AGE_TYPEDEF((short) 2, "testAgeTypedef"); + + private static final java.util.Map byName = + new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** Find the _Fields constant that matches fieldId, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch (fieldId) { + case 1: // TEST_NAME_TYPEDEF + return TEST_NAME_TYPEDEF; + case 2: // TEST_AGE_TYPEDEF + return TEST_AGE_TYPEDEF; + default: + return null; + } + } + + /** Find the _Fields constant that matches fieldId, throwing an exception if it is not found. */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) + throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** Find the _Fields constant that matches name, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + private static final int __TESTAGETYPEDEF_ISSET_ID = 0; + private byte __isset_bitfield = 0; + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = + new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put( + _Fields.TEST_NAME_TYPEDEF, + new org.apache.thrift.meta_data.FieldMetaData( + "testNameTypedef", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.STRING, "Name"))); + tmpMap.put( + _Fields.TEST_AGE_TYPEDEF, + new org.apache.thrift.meta_data.FieldMetaData( + "testAgeTypedef", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I16, "Age"))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( + TestThriftInnerStruct.class, metaDataMap); + } + + public TestThriftInnerStruct() { + this.testNameTypedef = "kid"; + + this.testAgeTypedef = (short) 12; + } + + public TestThriftInnerStruct(java.lang.String testNameTypedef, short testAgeTypedef) { + this(); + this.testNameTypedef = testNameTypedef; + this.testAgeTypedef = testAgeTypedef; + setTestAgeTypedefIsSet(true); + } + + /** Performs a deep copy on other. */ + public TestThriftInnerStruct(TestThriftInnerStruct other) { + __isset_bitfield = other.__isset_bitfield; + if (other.isSetTestNameTypedef()) { + this.testNameTypedef = other.testNameTypedef; + } + this.testAgeTypedef = other.testAgeTypedef; + } + + public TestThriftInnerStruct deepCopy() { + return new TestThriftInnerStruct(this); + } + + @Override + public void clear() { + this.testNameTypedef = "kid"; + + this.testAgeTypedef = (short) 12; + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getTestNameTypedef() { + return this.testNameTypedef; + } + + public void setTestNameTypedef( + @org.apache.thrift.annotation.Nullable java.lang.String testNameTypedef) { + this.testNameTypedef = testNameTypedef; + } + + public void unsetTestNameTypedef() { + this.testNameTypedef = null; + } + + /** + * Returns true if field testNameTypedef is set (has been assigned a value) and false otherwise + */ + public boolean isSetTestNameTypedef() { + return this.testNameTypedef != null; + } + + public void setTestNameTypedefIsSet(boolean value) { + if (!value) { + this.testNameTypedef = null; + } + } + + public short getTestAgeTypedef() { + return this.testAgeTypedef; + } + + public void setTestAgeTypedef(short testAgeTypedef) { + this.testAgeTypedef = testAgeTypedef; + setTestAgeTypedefIsSet(true); + } + + public void unsetTestAgeTypedef() { + __isset_bitfield = + org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TESTAGETYPEDEF_ISSET_ID); + } + + /** Returns true if field testAgeTypedef is set (has been assigned a value) and false otherwise */ + public boolean isSetTestAgeTypedef() { + return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __TESTAGETYPEDEF_ISSET_ID); + } + + public void setTestAgeTypedefIsSet(boolean value) { + __isset_bitfield = + org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TESTAGETYPEDEF_ISSET_ID, value); + } + + public void setFieldValue( + _Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case TEST_NAME_TYPEDEF: + if (value == null) { + unsetTestNameTypedef(); + } else { + setTestNameTypedef((java.lang.String) value); + } + break; + + case TEST_AGE_TYPEDEF: + if (value == null) { + unsetTestAgeTypedef(); + } else { + setTestAgeTypedef((java.lang.Short) value); + } + break; + } + } + + @org.apache.thrift.annotation.Nullable + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case TEST_NAME_TYPEDEF: + return getTestNameTypedef(); + + case TEST_AGE_TYPEDEF: + return getTestAgeTypedef(); + } + throw new java.lang.IllegalStateException(); + } + + /** + * Returns true if field corresponding to fieldID is set (has been assigned a value) and false + * otherwise + */ + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case TEST_NAME_TYPEDEF: + return isSetTestNameTypedef(); + case TEST_AGE_TYPEDEF: + return isSetTestAgeTypedef(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that == null) return false; + if (that instanceof TestThriftInnerStruct) return this.equals((TestThriftInnerStruct) that); + return false; + } + + public boolean equals(TestThriftInnerStruct that) { + if (that == null) return false; + if (this == that) return true; + + boolean this_present_testNameTypedef = true && this.isSetTestNameTypedef(); + boolean that_present_testNameTypedef = true && that.isSetTestNameTypedef(); + if (this_present_testNameTypedef || that_present_testNameTypedef) { + if (!(this_present_testNameTypedef && that_present_testNameTypedef)) return false; + if (!this.testNameTypedef.equals(that.testNameTypedef)) return false; + } + + boolean this_present_testAgeTypedef = true; + boolean that_present_testAgeTypedef = true; + if (this_present_testAgeTypedef || that_present_testAgeTypedef) { + if (!(this_present_testAgeTypedef && that_present_testAgeTypedef)) return false; + if (this.testAgeTypedef != that.testAgeTypedef) return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + ((isSetTestNameTypedef()) ? 131071 : 524287); + if (isSetTestNameTypedef()) hashCode = hashCode * 8191 + testNameTypedef.hashCode(); + + hashCode = hashCode * 8191 + testAgeTypedef; + + return hashCode; + } + + @Override + public int compareTo(TestThriftInnerStruct other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = + java.lang.Boolean.valueOf(isSetTestNameTypedef()).compareTo(other.isSetTestNameTypedef()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestNameTypedef()) { + lastComparison = + org.apache.thrift.TBaseHelper.compareTo(this.testNameTypedef, other.testNameTypedef); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = + java.lang.Boolean.valueOf(isSetTestAgeTypedef()).compareTo(other.isSetTestAgeTypedef()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestAgeTypedef()) { + lastComparison = + org.apache.thrift.TBaseHelper.compareTo(this.testAgeTypedef, other.testAgeTypedef); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("TestThriftInnerStruct("); + boolean first = true; + + sb.append("testNameTypedef:"); + if (this.testNameTypedef == null) { + sb.append("null"); + } else { + sb.append(this.testNameTypedef); + } + first = false; + if (!first) sb.append(", "); + sb.append("testAgeTypedef:"); + sb.append(this.testAgeTypedef); + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) + throws java.io.IOException, java.lang.ClassNotFoundException { + try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and + // doesn't call the default constructor. + __isset_bitfield = 0; + read( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class TestThriftInnerStructStandardSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public TestThriftInnerStructStandardScheme getScheme() { + return new TestThriftInnerStructStandardScheme(); + } + } + + private static class TestThriftInnerStructStandardScheme + extends org.apache.thrift.scheme.StandardScheme { + + public void read(org.apache.thrift.protocol.TProtocol iprot, TestThriftInnerStruct struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // TEST_NAME_TYPEDEF + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.testNameTypedef = iprot.readString(); + struct.setTestNameTypedefIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 2: // TEST_AGE_TYPEDEF + if (schemeField.type == org.apache.thrift.protocol.TType.I16) { + struct.testAgeTypedef = iprot.readI16(); + struct.setTestAgeTypedefIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + struct.validate(); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot, TestThriftInnerStruct struct) + throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.testNameTypedef != null) { + oprot.writeFieldBegin(TEST_NAME_TYPEDEF_FIELD_DESC); + oprot.writeString(struct.testNameTypedef); + oprot.writeFieldEnd(); + } + oprot.writeFieldBegin(TEST_AGE_TYPEDEF_FIELD_DESC); + oprot.writeI16(struct.testAgeTypedef); + oprot.writeFieldEnd(); + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + } + + private static class TestThriftInnerStructTupleSchemeFactory + implements org.apache.thrift.scheme.SchemeFactory { + public TestThriftInnerStructTupleScheme getScheme() { + return new TestThriftInnerStructTupleScheme(); + } + } + + private static class TestThriftInnerStructTupleScheme + extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, TestThriftInnerStruct struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet optionals = new java.util.BitSet(); + if (struct.isSetTestNameTypedef()) { + optionals.set(0); + } + if (struct.isSetTestAgeTypedef()) { + optionals.set(1); + } + oprot.writeBitSet(optionals, 2); + if (struct.isSetTestNameTypedef()) { + oprot.writeString(struct.testNameTypedef); + } + if (struct.isSetTestAgeTypedef()) { + oprot.writeI16(struct.testAgeTypedef); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, TestThriftInnerStruct struct) + throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = + (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet incoming = iprot.readBitSet(2); + if (incoming.get(0)) { + struct.testNameTypedef = iprot.readString(); + struct.setTestNameTypedefIsSet(true); + } + if (incoming.get(1)) { + struct.testAgeTypedef = iprot.readI16(); + struct.setTestAgeTypedefIsSet(true); + } + } + } + + private static S scheme( + org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) + ? STANDARD_SCHEME_FACTORY + : TUPLE_SCHEME_FACTORY) + .getScheme(); + } +} diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftStruct.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftStruct.java index 0e4850d9bbed..6d6487f25d78 100644 --- a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftStruct.java +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftStruct.java @@ -17,17 +17,10 @@ */ package org.apache.beam.sdk.io.thrift; -@SuppressWarnings({ - "cast", - "rawtypes", - "serial", - "unchecked", - "unused", - "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-10402) -}) +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) @javax.annotation.Generated( value = "Autogenerated by Thrift Compiler (0.13.0)", - date = "2019-12-21") + date = "2020-12-12") public class TestThriftStruct implements org.apache.thrift.TBase, java.io.Serializable, @@ -60,21 +53,43 @@ public class TestThriftStruct private static final org.apache.thrift.protocol.TField TEST_BOOL_FIELD_DESC = new org.apache.thrift.protocol.TField( "testBool", org.apache.thrift.protocol.TType.BOOL, (short) 8); + private static final org.apache.thrift.protocol.TField TEST_LIST_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testList", org.apache.thrift.protocol.TType.LIST, (short) 9); + private static final org.apache.thrift.protocol.TField TEST_STRING_SET_TYPEDEF_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testStringSetTypedef", org.apache.thrift.protocol.TType.SET, (short) 10); + private static final org.apache.thrift.protocol.TField TEST_ENUM_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testEnum", org.apache.thrift.protocol.TType.I32, (short) 11); + private static final org.apache.thrift.protocol.TField TEST_NESTED_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testNested", org.apache.thrift.protocol.TType.STRUCT, (short) 12); + private static final org.apache.thrift.protocol.TField TEST_UNION_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "testUnion", org.apache.thrift.protocol.TType.STRUCT, (short) 13); private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new TestThriftStructStandardSchemeFactory(); private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new TestThriftStructTupleSchemeFactory(); - public byte testByte; // required - public short testShort; // required - public int testInt; // required - public long testLong; // required - public double testDouble; // required - public @org.apache.thrift.annotation.Nullable java.util.Map + private byte testByte; // required + private short testShort; // required + private int testInt; // required + private long testLong; // required + private double testDouble; // required + private @org.apache.thrift.annotation.Nullable java.util.Map stringIntMap; // required - public @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer testBinary; // required - public boolean testBool; // required + private @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer testBinary; // required + private boolean testBool; // required + private @org.apache.thrift.annotation.Nullable java.util.List + testList; // required + private @org.apache.thrift.annotation.Nullable java.util.Set + testStringSetTypedef; // required + private @org.apache.thrift.annotation.Nullable TestThriftEnum testEnum; // required + private @org.apache.thrift.annotation.Nullable TestThriftInnerStruct testNested; // required + private @org.apache.thrift.annotation.Nullable TestThriftUnion testUnion; // required /** * The set of fields this struct contains, along with convenience methods for finding and @@ -88,7 +103,13 @@ public enum _Fields implements org.apache.thrift.TFieldIdEnum { TEST_DOUBLE((short) 5, "testDouble"), STRING_INT_MAP((short) 6, "stringIntMap"), TEST_BINARY((short) 7, "testBinary"), - TEST_BOOL((short) 8, "testBool"); + TEST_BOOL((short) 8, "testBool"), + TEST_LIST((short) 9, "testList"), + TEST_STRING_SET_TYPEDEF((short) 10, "testStringSetTypedef"), + /** @see TestThriftEnum */ + TEST_ENUM((short) 11, "testEnum"), + TEST_NESTED((short) 12, "testNested"), + TEST_UNION((short) 13, "testUnion"); private static final java.util.Map byName = new java.util.HashMap(); @@ -119,6 +140,16 @@ public static _Fields findByThriftId(int fieldId) { return TEST_BINARY; case 8: // TEST_BOOL return TEST_BOOL; + case 9: // TEST_LIST + return TEST_LIST; + case 10: // TEST_STRING_SET_TYPEDEF + return TEST_STRING_SET_TYPEDEF; + case 11: // TEST_ENUM + return TEST_ENUM; + case 12: // TEST_NESTED + return TEST_NESTED; + case 13: // TEST_UNION + return TEST_UNION; default: return null; } @@ -228,6 +259,43 @@ public java.lang.String getFieldName() { org.apache.thrift.TFieldRequirementType.DEFAULT, new org.apache.thrift.meta_data.FieldValueMetaData( org.apache.thrift.protocol.TType.BOOL))); + tmpMap.put( + _Fields.TEST_LIST, + new org.apache.thrift.meta_data.FieldMetaData( + "testList", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.ListMetaData( + org.apache.thrift.protocol.TType.LIST, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.I32)))); + tmpMap.put( + _Fields.TEST_STRING_SET_TYPEDEF, + new org.apache.thrift.meta_data.FieldMetaData( + "testStringSetTypedef", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData( + org.apache.thrift.protocol.TType.SET, "StringSet"))); + tmpMap.put( + _Fields.TEST_ENUM, + new org.apache.thrift.meta_data.FieldMetaData( + "testEnum", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.EnumMetaData( + org.apache.thrift.protocol.TType.ENUM, TestThriftEnum.class))); + tmpMap.put( + _Fields.TEST_NESTED, + new org.apache.thrift.meta_data.FieldMetaData( + "testNested", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.StructMetaData( + org.apache.thrift.protocol.TType.STRUCT, TestThriftInnerStruct.class))); + tmpMap.put( + _Fields.TEST_UNION, + new org.apache.thrift.meta_data.FieldMetaData( + "testUnion", + org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.StructMetaData( + org.apache.thrift.protocol.TType.STRUCT, TestThriftUnion.class))); metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( TestThriftStruct.class, metaDataMap); @@ -243,7 +311,12 @@ public TestThriftStruct( double testDouble, java.util.Map stringIntMap, java.nio.ByteBuffer testBinary, - boolean testBool) { + boolean testBool, + java.util.List testList, + java.util.Set testStringSetTypedef, + TestThriftEnum testEnum, + TestThriftInnerStruct testNested, + TestThriftUnion testUnion) { this(); this.testByte = testByte; setTestByteIsSet(true); @@ -259,6 +332,11 @@ public TestThriftStruct( this.testBinary = org.apache.thrift.TBaseHelper.copyBinary(testBinary); this.testBool = testBool; setTestBoolIsSet(true); + this.testList = testList; + this.testStringSetTypedef = testStringSetTypedef; + this.testEnum = testEnum; + this.testNested = testNested; + this.testUnion = testUnion; } /** Performs a deep copy on other. */ @@ -278,6 +356,25 @@ public TestThriftStruct(TestThriftStruct other) { this.testBinary = org.apache.thrift.TBaseHelper.copyBinary(other.testBinary); } this.testBool = other.testBool; + if (other.isSetTestList()) { + java.util.List __this__testList = + new java.util.ArrayList(other.testList); + this.testList = __this__testList; + } + if (other.isSetTestStringSetTypedef()) { + java.util.Set __this__testStringSetTypedef = + new java.util.HashSet(other.testStringSetTypedef); + this.testStringSetTypedef = __this__testStringSetTypedef; + } + if (other.isSetTestEnum()) { + this.testEnum = other.testEnum; + } + if (other.isSetTestNested()) { + this.testNested = new TestThriftInnerStruct(other.testNested); + } + if (other.isSetTestUnion()) { + this.testUnion = new TestThriftUnion(other.testUnion); + } } public TestThriftStruct deepCopy() { @@ -300,16 +397,20 @@ public void clear() { this.testBinary = null; setTestBoolIsSet(false); this.testBool = false; + this.testList = null; + this.testStringSetTypedef = null; + this.testEnum = null; + this.testNested = null; + this.testUnion = null; } public byte getTestByte() { return this.testByte; } - public TestThriftStruct setTestByte(byte testByte) { + public void setTestByte(byte testByte) { this.testByte = testByte; setTestByteIsSet(true); - return this; } public void unsetTestByte() { @@ -331,10 +432,9 @@ public short getTestShort() { return this.testShort; } - public TestThriftStruct setTestShort(short testShort) { + public void setTestShort(short testShort) { this.testShort = testShort; setTestShortIsSet(true); - return this; } public void unsetTestShort() { @@ -356,10 +456,9 @@ public int getTestInt() { return this.testInt; } - public TestThriftStruct setTestInt(int testInt) { + public void setTestInt(int testInt) { this.testInt = testInt; setTestIntIsSet(true); - return this; } public void unsetTestInt() { @@ -381,10 +480,9 @@ public long getTestLong() { return this.testLong; } - public TestThriftStruct setTestLong(long testLong) { + public void setTestLong(long testLong) { this.testLong = testLong; setTestLongIsSet(true); - return this; } public void unsetTestLong() { @@ -406,10 +504,9 @@ public double getTestDouble() { return this.testDouble; } - public TestThriftStruct setTestDouble(double testDouble) { + public void setTestDouble(double testDouble) { this.testDouble = testDouble; setTestDoubleIsSet(true); - return this; } public void unsetTestDouble() { @@ -443,11 +540,10 @@ public java.util.Map getStringIntMap() { return this.stringIntMap; } - public TestThriftStruct setStringIntMap( + public void setStringIntMap( @org.apache.thrift.annotation.Nullable java.util.Map stringIntMap) { this.stringIntMap = stringIntMap; - return this; } public void unsetStringIntMap() { @@ -474,18 +570,15 @@ public java.nio.ByteBuffer bufferForTestBinary() { return org.apache.thrift.TBaseHelper.copyBinary(testBinary); } - public TestThriftStruct setTestBinary(byte[] testBinary) { + public void setTestBinary(byte[] testBinary) { this.testBinary = testBinary == null ? (java.nio.ByteBuffer) null : java.nio.ByteBuffer.wrap(testBinary.clone()); - return this; } - public TestThriftStruct setTestBinary( - @org.apache.thrift.annotation.Nullable java.nio.ByteBuffer testBinary) { + public void setTestBinary(@org.apache.thrift.annotation.Nullable java.nio.ByteBuffer testBinary) { this.testBinary = org.apache.thrift.TBaseHelper.copyBinary(testBinary); - return this; } public void unsetTestBinary() { @@ -507,10 +600,9 @@ public boolean isTestBool() { return this.testBool; } - public TestThriftStruct setTestBool(boolean testBool) { + public void setTestBool(boolean testBool) { this.testBool = testBool; setTestBoolIsSet(true); - return this; } public void unsetTestBool() { @@ -528,6 +620,166 @@ public void setTestBoolIsSet(boolean value) { org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TESTBOOL_ISSET_ID, value); } + public int getTestListSize() { + return (this.testList == null) ? 0 : this.testList.size(); + } + + @org.apache.thrift.annotation.Nullable + public java.util.Iterator getTestListIterator() { + return (this.testList == null) ? null : this.testList.iterator(); + } + + public void addToTestList(int elem) { + if (this.testList == null) { + this.testList = new java.util.ArrayList(); + } + this.testList.add(elem); + } + + @org.apache.thrift.annotation.Nullable + public java.util.List getTestList() { + return this.testList; + } + + public void setTestList( + @org.apache.thrift.annotation.Nullable java.util.List testList) { + this.testList = testList; + } + + public void unsetTestList() { + this.testList = null; + } + + /** Returns true if field testList is set (has been assigned a value) and false otherwise */ + public boolean isSetTestList() { + return this.testList != null; + } + + public void setTestListIsSet(boolean value) { + if (!value) { + this.testList = null; + } + } + + public int getTestStringSetTypedefSize() { + return (this.testStringSetTypedef == null) ? 0 : this.testStringSetTypedef.size(); + } + + @org.apache.thrift.annotation.Nullable + public java.util.Iterator getTestStringSetTypedefIterator() { + return (this.testStringSetTypedef == null) ? null : this.testStringSetTypedef.iterator(); + } + + public void addToTestStringSetTypedef(java.lang.String elem) { + if (this.testStringSetTypedef == null) { + this.testStringSetTypedef = new java.util.HashSet(); + } + this.testStringSetTypedef.add(elem); + } + + @org.apache.thrift.annotation.Nullable + public java.util.Set getTestStringSetTypedef() { + return this.testStringSetTypedef; + } + + public void setTestStringSetTypedef( + @org.apache.thrift.annotation.Nullable java.util.Set testStringSetTypedef) { + this.testStringSetTypedef = testStringSetTypedef; + } + + public void unsetTestStringSetTypedef() { + this.testStringSetTypedef = null; + } + + /** + * Returns true if field testStringSetTypedef is set (has been assigned a value) and false + * otherwise + */ + public boolean isSetTestStringSetTypedef() { + return this.testStringSetTypedef != null; + } + + public void setTestStringSetTypedefIsSet(boolean value) { + if (!value) { + this.testStringSetTypedef = null; + } + } + + /** @see TestThriftEnum */ + @org.apache.thrift.annotation.Nullable + public TestThriftEnum getTestEnum() { + return this.testEnum; + } + + /** @see TestThriftEnum */ + public void setTestEnum(@org.apache.thrift.annotation.Nullable TestThriftEnum testEnum) { + this.testEnum = testEnum; + } + + public void unsetTestEnum() { + this.testEnum = null; + } + + /** Returns true if field testEnum is set (has been assigned a value) and false otherwise */ + public boolean isSetTestEnum() { + return this.testEnum != null; + } + + public void setTestEnumIsSet(boolean value) { + if (!value) { + this.testEnum = null; + } + } + + @org.apache.thrift.annotation.Nullable + public TestThriftInnerStruct getTestNested() { + return this.testNested; + } + + public void setTestNested( + @org.apache.thrift.annotation.Nullable TestThriftInnerStruct testNested) { + this.testNested = testNested; + } + + public void unsetTestNested() { + this.testNested = null; + } + + /** Returns true if field testNested is set (has been assigned a value) and false otherwise */ + public boolean isSetTestNested() { + return this.testNested != null; + } + + public void setTestNestedIsSet(boolean value) { + if (!value) { + this.testNested = null; + } + } + + @org.apache.thrift.annotation.Nullable + public TestThriftUnion getTestUnion() { + return this.testUnion; + } + + public void setTestUnion(@org.apache.thrift.annotation.Nullable TestThriftUnion testUnion) { + this.testUnion = testUnion; + } + + public void unsetTestUnion() { + this.testUnion = null; + } + + /** Returns true if field testUnion is set (has been assigned a value) and false otherwise */ + public boolean isSetTestUnion() { + return this.testUnion != null; + } + + public void setTestUnionIsSet(boolean value) { + if (!value) { + this.testUnion = null; + } + } + public void setFieldValue( _Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { switch (field) { @@ -598,6 +850,46 @@ public void setFieldValue( setTestBool((java.lang.Boolean) value); } break; + + case TEST_LIST: + if (value == null) { + unsetTestList(); + } else { + setTestList((java.util.List) value); + } + break; + + case TEST_STRING_SET_TYPEDEF: + if (value == null) { + unsetTestStringSetTypedef(); + } else { + setTestStringSetTypedef((java.util.Set) value); + } + break; + + case TEST_ENUM: + if (value == null) { + unsetTestEnum(); + } else { + setTestEnum((TestThriftEnum) value); + } + break; + + case TEST_NESTED: + if (value == null) { + unsetTestNested(); + } else { + setTestNested((TestThriftInnerStruct) value); + } + break; + + case TEST_UNION: + if (value == null) { + unsetTestUnion(); + } else { + setTestUnion((TestThriftUnion) value); + } + break; } } @@ -627,6 +919,21 @@ public java.lang.Object getFieldValue(_Fields field) { case TEST_BOOL: return isTestBool(); + + case TEST_LIST: + return getTestList(); + + case TEST_STRING_SET_TYPEDEF: + return getTestStringSetTypedef(); + + case TEST_ENUM: + return getTestEnum(); + + case TEST_NESTED: + return getTestNested(); + + case TEST_UNION: + return getTestUnion(); } throw new java.lang.IllegalStateException(); } @@ -657,6 +964,16 @@ public boolean isSet(_Fields field) { return isSetTestBinary(); case TEST_BOOL: return isSetTestBool(); + case TEST_LIST: + return isSetTestList(); + case TEST_STRING_SET_TYPEDEF: + return isSetTestStringSetTypedef(); + case TEST_ENUM: + return isSetTestEnum(); + case TEST_NESTED: + return isSetTestNested(); + case TEST_UNION: + return isSetTestUnion(); } throw new java.lang.IllegalStateException(); } @@ -728,6 +1045,41 @@ public boolean equals(TestThriftStruct that) { if (this.testBool != that.testBool) return false; } + boolean this_present_testList = true && this.isSetTestList(); + boolean that_present_testList = true && that.isSetTestList(); + if (this_present_testList || that_present_testList) { + if (!(this_present_testList && that_present_testList)) return false; + if (!this.testList.equals(that.testList)) return false; + } + + boolean this_present_testStringSetTypedef = true && this.isSetTestStringSetTypedef(); + boolean that_present_testStringSetTypedef = true && that.isSetTestStringSetTypedef(); + if (this_present_testStringSetTypedef || that_present_testStringSetTypedef) { + if (!(this_present_testStringSetTypedef && that_present_testStringSetTypedef)) return false; + if (!this.testStringSetTypedef.equals(that.testStringSetTypedef)) return false; + } + + boolean this_present_testEnum = true && this.isSetTestEnum(); + boolean that_present_testEnum = true && that.isSetTestEnum(); + if (this_present_testEnum || that_present_testEnum) { + if (!(this_present_testEnum && that_present_testEnum)) return false; + if (!this.testEnum.equals(that.testEnum)) return false; + } + + boolean this_present_testNested = true && this.isSetTestNested(); + boolean that_present_testNested = true && that.isSetTestNested(); + if (this_present_testNested || that_present_testNested) { + if (!(this_present_testNested && that_present_testNested)) return false; + if (!this.testNested.equals(that.testNested)) return false; + } + + boolean this_present_testUnion = true && this.isSetTestUnion(); + boolean that_present_testUnion = true && that.isSetTestUnion(); + if (this_present_testUnion || that_present_testUnion) { + if (!(this_present_testUnion && that_present_testUnion)) return false; + if (!this.testUnion.equals(that.testUnion)) return false; + } + return true; } @@ -753,6 +1105,21 @@ public int hashCode() { hashCode = hashCode * 8191 + ((testBool) ? 131071 : 524287); + hashCode = hashCode * 8191 + ((isSetTestList()) ? 131071 : 524287); + if (isSetTestList()) hashCode = hashCode * 8191 + testList.hashCode(); + + hashCode = hashCode * 8191 + ((isSetTestStringSetTypedef()) ? 131071 : 524287); + if (isSetTestStringSetTypedef()) hashCode = hashCode * 8191 + testStringSetTypedef.hashCode(); + + hashCode = hashCode * 8191 + ((isSetTestEnum()) ? 131071 : 524287); + if (isSetTestEnum()) hashCode = hashCode * 8191 + testEnum.getValue(); + + hashCode = hashCode * 8191 + ((isSetTestNested()) ? 131071 : 524287); + if (isSetTestNested()) hashCode = hashCode * 8191 + testNested.hashCode(); + + hashCode = hashCode * 8191 + ((isSetTestUnion()) ? 131071 : 524287); + if (isSetTestUnion()) hashCode = hashCode * 8191 + testUnion.hashCode(); + return hashCode; } @@ -848,6 +1215,61 @@ public int compareTo(TestThriftStruct other) { return lastComparison; } } + lastComparison = java.lang.Boolean.valueOf(isSetTestList()).compareTo(other.isSetTestList()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestList()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.testList, other.testList); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = + java.lang.Boolean.valueOf(isSetTestStringSetTypedef()) + .compareTo(other.isSetTestStringSetTypedef()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestStringSetTypedef()) { + lastComparison = + org.apache.thrift.TBaseHelper.compareTo( + this.testStringSetTypedef, other.testStringSetTypedef); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetTestEnum()).compareTo(other.isSetTestEnum()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestEnum()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.testEnum, other.testEnum); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = + java.lang.Boolean.valueOf(isSetTestNested()).compareTo(other.isSetTestNested()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestNested()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.testNested, other.testNested); + if (lastComparison != 0) { + return lastComparison; + } + } + lastComparison = java.lang.Boolean.valueOf(isSetTestUnion()).compareTo(other.isSetTestUnion()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetTestUnion()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.testUnion, other.testUnion); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -909,6 +1331,46 @@ public java.lang.String toString() { sb.append("testBool:"); sb.append(this.testBool); first = false; + if (!first) sb.append(", "); + sb.append("testList:"); + if (this.testList == null) { + sb.append("null"); + } else { + sb.append(this.testList); + } + first = false; + if (!first) sb.append(", "); + sb.append("testStringSetTypedef:"); + if (this.testStringSetTypedef == null) { + sb.append("null"); + } else { + sb.append(this.testStringSetTypedef); + } + first = false; + if (!first) sb.append(", "); + sb.append("testEnum:"); + if (this.testEnum == null) { + sb.append("null"); + } else { + sb.append(this.testEnum); + } + first = false; + if (!first) sb.append(", "); + sb.append("testNested:"); + if (this.testNested == null) { + sb.append("null"); + } else { + sb.append(this.testNested); + } + first = false; + if (!first) sb.append(", "); + sb.append("testUnion:"); + if (this.testUnion == null) { + sb.append("null"); + } else { + sb.append(this.testUnion); + } + first = false; sb.append(")"); return sb.toString(); } @@ -916,6 +1378,9 @@ public java.lang.String toString() { public void validate() throws org.apache.thrift.TException { // check for required fields // check for sub-struct validity + if (testNested != null) { + testNested.validate(); + } } private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { @@ -1038,14 +1503,74 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TestThriftStruct st org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; + case 9: // TEST_LIST + if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { + { + org.apache.thrift.protocol.TList _list4 = iprot.readListBegin(); + struct.testList = new java.util.ArrayList(_list4.size); + int _elem5; + for (int _i6 = 0; _i6 < _list4.size; ++_i6) { + _elem5 = iprot.readI32(); + struct.testList.add(_elem5); + } + iprot.readListEnd(); + } + struct.setTestListIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 10: // TEST_STRING_SET_TYPEDEF + if (schemeField.type == org.apache.thrift.protocol.TType.SET) { + { + org.apache.thrift.protocol.TSet _set7 = iprot.readSetBegin(); + struct.testStringSetTypedef = + new java.util.HashSet(2 * _set7.size); + @org.apache.thrift.annotation.Nullable java.lang.String _elem8; + for (int _i9 = 0; _i9 < _set7.size; ++_i9) { + _elem8 = iprot.readString(); + struct.testStringSetTypedef.add(_elem8); + } + iprot.readSetEnd(); + } + struct.setTestStringSetTypedefIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 11: // TEST_ENUM + if (schemeField.type == org.apache.thrift.protocol.TType.I32) { + struct.testEnum = + org.apache.beam.sdk.io.thrift.TestThriftEnum.findByValue(iprot.readI32()); + struct.setTestEnumIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 12: // TEST_NESTED + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.testNested = new TestThriftInnerStruct(); + struct.testNested.read(iprot); + struct.setTestNestedIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + case 13: // TEST_UNION + if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { + struct.testUnion = new TestThriftUnion(); + struct.testUnion.read(iprot); + struct.setTestUnionIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; default: org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } iprot.readFieldEnd(); } iprot.readStructEnd(); - - // check for required fields of primitive type, which can't be checked in the validate method struct.validate(); } @@ -1077,10 +1602,10 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TestThriftStruct s org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.I16, struct.stringIntMap.size())); - for (java.util.Map.Entry _iter4 : + for (java.util.Map.Entry _iter10 : struct.stringIntMap.entrySet()) { - oprot.writeString(_iter4.getKey()); - oprot.writeI16(_iter4.getValue()); + oprot.writeString(_iter10.getKey()); + oprot.writeI16(_iter10.getValue()); } oprot.writeMapEnd(); } @@ -1094,6 +1619,47 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TestThriftStruct s oprot.writeFieldBegin(TEST_BOOL_FIELD_DESC); oprot.writeBool(struct.testBool); oprot.writeFieldEnd(); + if (struct.testList != null) { + oprot.writeFieldBegin(TEST_LIST_FIELD_DESC); + { + oprot.writeListBegin( + new org.apache.thrift.protocol.TList( + org.apache.thrift.protocol.TType.I32, struct.testList.size())); + for (int _iter11 : struct.testList) { + oprot.writeI32(_iter11); + } + oprot.writeListEnd(); + } + oprot.writeFieldEnd(); + } + if (struct.testStringSetTypedef != null) { + oprot.writeFieldBegin(TEST_STRING_SET_TYPEDEF_FIELD_DESC); + { + oprot.writeSetBegin( + new org.apache.thrift.protocol.TSet( + org.apache.thrift.protocol.TType.STRING, struct.testStringSetTypedef.size())); + for (java.lang.String _iter12 : struct.testStringSetTypedef) { + oprot.writeString(_iter12); + } + oprot.writeSetEnd(); + } + oprot.writeFieldEnd(); + } + if (struct.testEnum != null) { + oprot.writeFieldBegin(TEST_ENUM_FIELD_DESC); + oprot.writeI32(struct.testEnum.getValue()); + oprot.writeFieldEnd(); + } + if (struct.testNested != null) { + oprot.writeFieldBegin(TEST_NESTED_FIELD_DESC); + struct.testNested.write(oprot); + oprot.writeFieldEnd(); + } + if (struct.testUnion != null) { + oprot.writeFieldBegin(TEST_UNION_FIELD_DESC); + struct.testUnion.write(oprot); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } @@ -1139,7 +1705,22 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct st if (struct.isSetTestBool()) { optionals.set(7); } - oprot.writeBitSet(optionals, 8); + if (struct.isSetTestList()) { + optionals.set(8); + } + if (struct.isSetTestStringSetTypedef()) { + optionals.set(9); + } + if (struct.isSetTestEnum()) { + optionals.set(10); + } + if (struct.isSetTestNested()) { + optionals.set(11); + } + if (struct.isSetTestUnion()) { + optionals.set(12); + } + oprot.writeBitSet(optionals, 13); if (struct.isSetTestByte()) { oprot.writeByte(struct.testByte); } @@ -1158,10 +1739,10 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct st if (struct.isSetStringIntMap()) { { oprot.writeI32(struct.stringIntMap.size()); - for (java.util.Map.Entry _iter5 : + for (java.util.Map.Entry _iter13 : struct.stringIntMap.entrySet()) { - oprot.writeString(_iter5.getKey()); - oprot.writeI16(_iter5.getValue()); + oprot.writeString(_iter13.getKey()); + oprot.writeI16(_iter13.getValue()); } } } @@ -1171,6 +1752,31 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct st if (struct.isSetTestBool()) { oprot.writeBool(struct.testBool); } + if (struct.isSetTestList()) { + { + oprot.writeI32(struct.testList.size()); + for (int _iter14 : struct.testList) { + oprot.writeI32(_iter14); + } + } + } + if (struct.isSetTestStringSetTypedef()) { + { + oprot.writeI32(struct.testStringSetTypedef.size()); + for (java.lang.String _iter15 : struct.testStringSetTypedef) { + oprot.writeString(_iter15); + } + } + } + if (struct.isSetTestEnum()) { + oprot.writeI32(struct.testEnum.getValue()); + } + if (struct.isSetTestNested()) { + struct.testNested.write(oprot); + } + if (struct.isSetTestUnion()) { + struct.testUnion.write(oprot); + } } @Override @@ -1178,7 +1784,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct str throws org.apache.thrift.TException { org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; - java.util.BitSet incoming = iprot.readBitSet(8); + java.util.BitSet incoming = iprot.readBitSet(13); if (incoming.get(0)) { struct.testByte = iprot.readByte(); struct.setTestByteIsSet(true); @@ -1201,19 +1807,19 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct str } if (incoming.get(5)) { { - org.apache.thrift.protocol.TMap _map6 = + org.apache.thrift.protocol.TMap _map16 = new org.apache.thrift.protocol.TMap( org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.I16, iprot.readI32()); struct.stringIntMap = - new java.util.HashMap(2 * _map6.size); - @org.apache.thrift.annotation.Nullable java.lang.String _key7; - short _val8; - for (int _i9 = 0; _i9 < _map6.size; ++_i9) { - _key7 = iprot.readString(); - _val8 = iprot.readI16(); - struct.stringIntMap.put(_key7, _val8); + new java.util.HashMap(2 * _map16.size); + @org.apache.thrift.annotation.Nullable java.lang.String _key17; + short _val18; + for (int _i19 = 0; _i19 < _map16.size; ++_i19) { + _key17 = iprot.readString(); + _val18 = iprot.readI16(); + struct.stringIntMap.put(_key17, _val18); } } struct.setStringIntMapIsSet(true); @@ -1226,6 +1832,48 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TestThriftStruct str struct.testBool = iprot.readBool(); struct.setTestBoolIsSet(true); } + if (incoming.get(8)) { + { + org.apache.thrift.protocol.TList _list20 = + new org.apache.thrift.protocol.TList( + org.apache.thrift.protocol.TType.I32, iprot.readI32()); + struct.testList = new java.util.ArrayList(_list20.size); + int _elem21; + for (int _i22 = 0; _i22 < _list20.size; ++_i22) { + _elem21 = iprot.readI32(); + struct.testList.add(_elem21); + } + } + struct.setTestListIsSet(true); + } + if (incoming.get(9)) { + { + org.apache.thrift.protocol.TSet _set23 = + new org.apache.thrift.protocol.TSet( + org.apache.thrift.protocol.TType.STRING, iprot.readI32()); + struct.testStringSetTypedef = new java.util.HashSet(2 * _set23.size); + @org.apache.thrift.annotation.Nullable java.lang.String _elem24; + for (int _i25 = 0; _i25 < _set23.size; ++_i25) { + _elem24 = iprot.readString(); + struct.testStringSetTypedef.add(_elem24); + } + } + struct.setTestStringSetTypedefIsSet(true); + } + if (incoming.get(10)) { + struct.testEnum = org.apache.beam.sdk.io.thrift.TestThriftEnum.findByValue(iprot.readI32()); + struct.setTestEnumIsSet(true); + } + if (incoming.get(11)) { + struct.testNested = new TestThriftInnerStruct(); + struct.testNested.read(iprot); + struct.setTestNestedIsSet(true); + } + if (incoming.get(12)) { + struct.testUnion = new TestThriftUnion(); + struct.testUnion.read(iprot); + struct.setTestUnionIsSet(true); + } } } diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftUnion.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftUnion.java new file mode 100644 index 000000000000..5cac062c9d67 --- /dev/null +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/TestThriftUnion.java @@ -0,0 +1,401 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.thrift; + +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +@javax.annotation.Generated( + value = "Autogenerated by Thrift Compiler (0.13.0)", + date = "2020-12-12") +public class TestThriftUnion + extends org.apache.thrift.TUnion { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = + new org.apache.thrift.protocol.TStruct("TestThriftUnion"); + private static final org.apache.thrift.protocol.TField SNAKE_CASE_NESTED_STRUCT_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "snake_case_nested_struct", org.apache.thrift.protocol.TType.STRUCT, (short) 1); + private static final org.apache.thrift.protocol.TField CAMEL_CASE_ENUM_FIELD_DESC = + new org.apache.thrift.protocol.TField( + "camelCaseEnum", org.apache.thrift.protocol.TType.I32, (short) 2); + + /** + * The set of fields this struct contains, along with convenience methods for finding and + * manipulating them. + */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + SNAKE_CASE_NESTED_STRUCT((short) 1, "snake_case_nested_struct"), + /** @see TestThriftEnum */ + CAMEL_CASE_ENUM((short) 2, "camelCaseEnum"); + + private static final java.util.Map byName = + new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** Find the _Fields constant that matches fieldId, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch (fieldId) { + case 1: // SNAKE_CASE_NESTED_STRUCT + return SNAKE_CASE_NESTED_STRUCT; + case 2: // CAMEL_CASE_ENUM + return CAMEL_CASE_ENUM; + default: + return null; + } + } + + /** Find the _Fields constant that matches fieldId, throwing an exception if it is not found. */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) + throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** Find the _Fields constant that matches name, or null if its not found. */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + public short getThriftFieldId() { + return _thriftId; + } + + public java.lang.String getFieldName() { + return _fieldName; + } + } + + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = + new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put( + _Fields.SNAKE_CASE_NESTED_STRUCT, + new org.apache.thrift.meta_data.FieldMetaData( + "snake_case_nested_struct", + org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.StructMetaData( + org.apache.thrift.protocol.TType.STRUCT, TestThriftInnerStruct.class))); + tmpMap.put( + _Fields.CAMEL_CASE_ENUM, + new org.apache.thrift.meta_data.FieldMetaData( + "camelCaseEnum", + org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.EnumMetaData( + org.apache.thrift.protocol.TType.ENUM, TestThriftEnum.class))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap( + TestThriftUnion.class, metaDataMap); + } + + public TestThriftUnion() { + super(); + } + + public TestThriftUnion(_Fields setField, java.lang.Object value) { + super(setField, value); + } + + public TestThriftUnion(TestThriftUnion other) { + super(other); + } + + public TestThriftUnion deepCopy() { + return new TestThriftUnion(this); + } + + public static TestThriftUnion snake_case_nested_struct(TestThriftInnerStruct value) { + TestThriftUnion x = new TestThriftUnion(); + x.setSnake_case_nested_struct(value); + return x; + } + + public static TestThriftUnion camelCaseEnum(TestThriftEnum value) { + TestThriftUnion x = new TestThriftUnion(); + x.setCamelCaseEnum(value); + return x; + } + + @Override + protected void checkType(_Fields setField, java.lang.Object value) + throws java.lang.ClassCastException { + switch (setField) { + case SNAKE_CASE_NESTED_STRUCT: + if (value instanceof TestThriftInnerStruct) { + break; + } + throw new java.lang.ClassCastException( + "Was expecting value of type TestThriftInnerStruct for field 'snake_case_nested_struct', but got " + + value.getClass().getSimpleName()); + case CAMEL_CASE_ENUM: + if (value instanceof TestThriftEnum) { + break; + } + throw new java.lang.ClassCastException( + "Was expecting value of type TestThriftEnum for field 'camelCaseEnum', but got " + + value.getClass().getSimpleName()); + default: + throw new java.lang.IllegalArgumentException("Unknown field id " + setField); + } + } + + @Override + protected java.lang.Object standardSchemeReadValue( + org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TField field) + throws org.apache.thrift.TException { + _Fields setField = _Fields.findByThriftId(field.id); + if (setField != null) { + switch (setField) { + case SNAKE_CASE_NESTED_STRUCT: + if (field.type == SNAKE_CASE_NESTED_STRUCT_FIELD_DESC.type) { + TestThriftInnerStruct snake_case_nested_struct; + snake_case_nested_struct = new TestThriftInnerStruct(); + snake_case_nested_struct.read(iprot); + return snake_case_nested_struct; + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type); + return null; + } + case CAMEL_CASE_ENUM: + if (field.type == CAMEL_CASE_ENUM_FIELD_DESC.type) { + TestThriftEnum camelCaseEnum; + camelCaseEnum = + org.apache.beam.sdk.io.thrift.TestThriftEnum.findByValue(iprot.readI32()); + return camelCaseEnum; + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type); + return null; + } + default: + throw new java.lang.IllegalStateException( + "setField wasn't null, but didn't match any of the case statements!"); + } + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type); + return null; + } + } + + @Override + protected void standardSchemeWriteValue(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + switch (setField_) { + case SNAKE_CASE_NESTED_STRUCT: + TestThriftInnerStruct snake_case_nested_struct = (TestThriftInnerStruct) value_; + snake_case_nested_struct.write(oprot); + return; + case CAMEL_CASE_ENUM: + TestThriftEnum camelCaseEnum = (TestThriftEnum) value_; + oprot.writeI32(camelCaseEnum.getValue()); + return; + default: + throw new java.lang.IllegalStateException( + "Cannot write union with unknown field " + setField_); + } + } + + @Override + protected java.lang.Object tupleSchemeReadValue( + org.apache.thrift.protocol.TProtocol iprot, short fieldID) + throws org.apache.thrift.TException { + _Fields setField = _Fields.findByThriftId(fieldID); + if (setField != null) { + switch (setField) { + case SNAKE_CASE_NESTED_STRUCT: + TestThriftInnerStruct snake_case_nested_struct; + snake_case_nested_struct = new TestThriftInnerStruct(); + snake_case_nested_struct.read(iprot); + return snake_case_nested_struct; + case CAMEL_CASE_ENUM: + TestThriftEnum camelCaseEnum; + camelCaseEnum = org.apache.beam.sdk.io.thrift.TestThriftEnum.findByValue(iprot.readI32()); + return camelCaseEnum; + default: + throw new java.lang.IllegalStateException( + "setField wasn't null, but didn't match any of the case statements!"); + } + } else { + throw new org.apache.thrift.protocol.TProtocolException( + "Couldn't find a field with field id " + fieldID); + } + } + + @Override + protected void tupleSchemeWriteValue(org.apache.thrift.protocol.TProtocol oprot) + throws org.apache.thrift.TException { + switch (setField_) { + case SNAKE_CASE_NESTED_STRUCT: + TestThriftInnerStruct snake_case_nested_struct = (TestThriftInnerStruct) value_; + snake_case_nested_struct.write(oprot); + return; + case CAMEL_CASE_ENUM: + TestThriftEnum camelCaseEnum = (TestThriftEnum) value_; + oprot.writeI32(camelCaseEnum.getValue()); + return; + default: + throw new java.lang.IllegalStateException( + "Cannot write union with unknown field " + setField_); + } + } + + @Override + protected org.apache.thrift.protocol.TField getFieldDesc(_Fields setField) { + switch (setField) { + case SNAKE_CASE_NESTED_STRUCT: + return SNAKE_CASE_NESTED_STRUCT_FIELD_DESC; + case CAMEL_CASE_ENUM: + return CAMEL_CASE_ENUM_FIELD_DESC; + default: + throw new java.lang.IllegalArgumentException("Unknown field id " + setField); + } + } + + @Override + protected org.apache.thrift.protocol.TStruct getStructDesc() { + return STRUCT_DESC; + } + + @Override + protected _Fields enumForId(short id) { + return _Fields.findByThriftIdOrThrow(id); + } + + @org.apache.thrift.annotation.Nullable + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + public TestThriftInnerStruct getSnake_case_nested_struct() { + if (getSetField() == _Fields.SNAKE_CASE_NESTED_STRUCT) { + return (TestThriftInnerStruct) getFieldValue(); + } else { + throw new java.lang.RuntimeException( + "Cannot get field 'snake_case_nested_struct' because union is currently set to " + + getFieldDesc(getSetField()).name); + } + } + + public void setSnake_case_nested_struct(TestThriftInnerStruct value) { + if (value == null) throw new java.lang.NullPointerException(); + setField_ = _Fields.SNAKE_CASE_NESTED_STRUCT; + value_ = value; + } + + /** @see TestThriftEnum */ + public TestThriftEnum getCamelCaseEnum() { + if (getSetField() == _Fields.CAMEL_CASE_ENUM) { + return (TestThriftEnum) getFieldValue(); + } else { + throw new java.lang.RuntimeException( + "Cannot get field 'camelCaseEnum' because union is currently set to " + + getFieldDesc(getSetField()).name); + } + } + + /** @see TestThriftEnum */ + public void setCamelCaseEnum(TestThriftEnum value) { + if (value == null) throw new java.lang.NullPointerException(); + setField_ = _Fields.CAMEL_CASE_ENUM; + value_ = value; + } + + public boolean isSetSnake_case_nested_struct() { + return setField_ == _Fields.SNAKE_CASE_NESTED_STRUCT; + } + + public boolean isSetCamelCaseEnum() { + return setField_ == _Fields.CAMEL_CASE_ENUM; + } + + public boolean equals(java.lang.Object other) { + if (other instanceof TestThriftUnion) { + return equals((TestThriftUnion) other); + } else { + return false; + } + } + + public boolean equals(TestThriftUnion other) { + return other != null + && getSetField() == other.getSetField() + && getFieldValue().equals(other.getFieldValue()); + } + + @Override + public int compareTo(TestThriftUnion other) { + int lastComparison = + org.apache.thrift.TBaseHelper.compareTo(getSetField(), other.getSetField()); + if (lastComparison == 0) { + return org.apache.thrift.TBaseHelper.compareTo(getFieldValue(), other.getFieldValue()); + } + return lastComparison; + } + + @Override + public int hashCode() { + java.util.List list = new java.util.ArrayList(); + list.add(this.getClass().getName()); + org.apache.thrift.TFieldIdEnum setField = getSetField(); + if (setField != null) { + list.add(setField.getThriftFieldId()); + java.lang.Object value = getFieldValue(); + if (value instanceof org.apache.thrift.TEnum) { + list.add(((org.apache.thrift.TEnum) getFieldValue()).getValue()); + } else { + list.add(value); + } + } + return list.hashCode(); + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) + throws java.io.IOException, java.lang.ClassNotFoundException { + try { + read( + new org.apache.thrift.protocol.TCompactProtocol( + new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } +} diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftIOTest.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftIOTest.java index 5400b0ffb1b1..4bb29e64ff14 100644 --- a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftIOTest.java +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftIOTest.java @@ -72,16 +72,16 @@ public void setUp() throws Exception { byte[] bytes = new byte[10]; ByteBuffer buffer = ByteBuffer.wrap(bytes); - TEST_THRIFT_STRUCT.testByte = 100; - TEST_THRIFT_STRUCT.testShort = 200; - TEST_THRIFT_STRUCT.testInt = 2500; - TEST_THRIFT_STRUCT.testLong = 79303L; - TEST_THRIFT_STRUCT.testDouble = 25.007; - TEST_THRIFT_STRUCT.testBool = true; - TEST_THRIFT_STRUCT.stringIntMap = new HashMap<>(); - TEST_THRIFT_STRUCT.stringIntMap.put("first", (short) 1); - TEST_THRIFT_STRUCT.stringIntMap.put("second", (short) 2); - TEST_THRIFT_STRUCT.testBinary = buffer; + TEST_THRIFT_STRUCT.setTestByte((byte) 100); + TEST_THRIFT_STRUCT.setTestShort((short) 200); + TEST_THRIFT_STRUCT.setTestInt(2500); + TEST_THRIFT_STRUCT.setTestLong(79303L); + TEST_THRIFT_STRUCT.setTestDouble(25.007); + TEST_THRIFT_STRUCT.setTestBool(true); + TEST_THRIFT_STRUCT.setStringIntMap(new HashMap<>()); + TEST_THRIFT_STRUCT.getStringIntMap().put("first", (short) 1); + TEST_THRIFT_STRUCT.getStringIntMap().put("second", (short) 2); + TEST_THRIFT_STRUCT.setTestBinary(buffer); testThriftStructs = ImmutableList.copyOf(generateTestObjects(1000L)); } @@ -240,15 +240,15 @@ private List generateTestObjects(long count) { // Generate random string String randomString = RandomStringUtils.random(10, true, false); short s = (short) RandomUtils.nextInt(0, Short.MAX_VALUE + 1); - temp.stringIntMap = new HashMap<>(); - temp.stringIntMap.put(randomString, s); - temp.testShort = s; - temp.testBinary = buffer; - temp.testBool = RandomUtils.nextBoolean(); - temp.testByte = (byte) RandomUtils.nextInt(0, Byte.MAX_VALUE + 1); - temp.testDouble = RandomUtils.nextDouble(); - temp.testInt = RandomUtils.nextInt(); - temp.testLong = RandomUtils.nextLong(); + temp.setStringIntMap(new HashMap<>()); + temp.getStringIntMap().put(randomString, s); + temp.setTestShort(s); + temp.setTestBinary(buffer); + temp.setTestBool(RandomUtils.nextBoolean()); + temp.setTestByte((byte) RandomUtils.nextInt(0, Byte.MAX_VALUE + 1)); + temp.setTestDouble(RandomUtils.nextDouble()); + temp.setTestInt(RandomUtils.nextInt()); + temp.setTestLong(RandomUtils.nextLong()); testThriftStructList.add(temp); } diff --git a/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftSchemaTest.java b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftSchemaTest.java new file mode 100644 index 000000000000..c269f5a18421 --- /dev/null +++ b/sdks/java/io/thrift/src/test/java/org/apache/beam/sdk/io/thrift/ThriftSchemaTest.java @@ -0,0 +1,251 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.io.thrift; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.beam.sdk.schemas.Schema; +import org.apache.beam.sdk.schemas.Schema.Field; +import org.apache.beam.sdk.schemas.Schema.FieldType; +import org.apache.beam.sdk.schemas.Schema.TypeName; +import org.apache.beam.sdk.schemas.SchemaProvider; +import org.apache.beam.sdk.schemas.logicaltypes.EnumerationType; +import org.apache.beam.sdk.schemas.transforms.Convert; +import org.apache.beam.sdk.schemas.transforms.Group; +import org.apache.beam.sdk.schemas.transforms.Select; +import org.apache.beam.sdk.testing.PAssert; +import org.apache.beam.sdk.testing.TestPipeline; +import org.apache.beam.sdk.transforms.Count; +import org.apache.beam.sdk.transforms.Create; +import org.apache.beam.sdk.transforms.Distinct; +import org.apache.beam.sdk.transforms.FlatMapElements; +import org.apache.beam.sdk.transforms.MapElements; +import org.apache.beam.sdk.transforms.Sum; +import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.Row; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.sdk.values.TypeDescriptors; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings({ + "nullness" // TODO(https://issues.apache.org/jira/browse/BEAM-11436) +}) +public class ThriftSchemaTest { + private static final SchemaProvider defaultSchemaProvider = ThriftSchema.provider(); + private static final SchemaProvider customSchemaProvider = + ThriftSchema.custom().typedef("StringSet", FieldType.iterable(FieldType.STRING)).provider(); + + @Rule public transient TestPipeline testPipeline = TestPipeline.create(); + + @Test(expected = IllegalArgumentException.class) + public void testThriftSchemaOnlyAllowsThriftClasses() { + defaultSchemaProvider.schemaFor(TypeDescriptor.of(String.class)); + } + + @Test + public void testInnerStructSchemaWithSimpleTypedefs() { + // primitive typedefs don't need any special handling + final Schema schema = + defaultSchemaProvider.schemaFor(TypeDescriptor.of(TestThriftInnerStruct.class)); + assertNotNull(schema); + assertEquals(TypeName.STRING, schema.getField("testNameTypedef").getType().getTypeName()); + assertEquals(TypeName.INT16, schema.getField("testAgeTypedef").getType().getTypeName()); + } + + @Test + public void testUnionSchema() { + final Schema schema = defaultSchemaProvider.schemaFor(TypeDescriptor.of(TestThriftUnion.class)); + assertNotNull(schema); + assertEquals(TypeName.LOGICAL_TYPE, schema.getField("camelCaseEnum").getType().getTypeName()); + assertEquals( + EnumerationType.IDENTIFIER, + schema.getField("camelCaseEnum").getType().getLogicalType().getIdentifier()); + assertEquals(TypeName.ROW, schema.getField("snake_case_nested_struct").getType().getTypeName()); + } + + @Test(expected = IllegalStateException.class) + public void testMainStructSchemaWithoutTypedefRegistration() { + // container typedefs like set cannot be inferred based on available metadata + defaultSchemaProvider.schemaFor(TypeDescriptor.of(TestThriftStruct.class)); + } + + @Test + public void testMainStructSchemaWithContainerTypedefRegistered() { + final Schema schema = customSchemaProvider.schemaFor(TypeDescriptor.of(TestThriftStruct.class)); + assertNotNull(schema); + assertEquals(TypeName.BOOLEAN, schema.getField("testBool").getType().getTypeName()); + assertEquals(TypeName.BYTE, schema.getField("testByte").getType().getTypeName()); + assertEquals(TypeName.INT16, schema.getField("testShort").getType().getTypeName()); + assertEquals(TypeName.INT32, schema.getField("testInt").getType().getTypeName()); + assertEquals(TypeName.INT64, schema.getField("testLong").getType().getTypeName()); + assertEquals(TypeName.DOUBLE, schema.getField("testDouble").getType().getTypeName()); + assertEquals(TypeName.BYTES, schema.getField("testBinary").getType().getTypeName()); + assertEquals(TypeName.MAP, schema.getField("stringIntMap").getType().getTypeName()); + assertEquals(TypeName.LOGICAL_TYPE, schema.getField("testEnum").getType().getTypeName()); + assertEquals( + EnumerationType.IDENTIFIER, + schema.getField("testEnum").getType().getLogicalType().getIdentifier()); + assertEquals(TypeName.ARRAY, schema.getField("testList").getType().getTypeName()); + assertEquals(TypeName.ROW, schema.getField("testNested").getType().getTypeName()); + assertEquals( + TypeName.ITERABLE, schema.getField("testStringSetTypedef").getType().getTypeName()); + } + + @Test + public void testSchemaUsage() { + final List thriftData = + Arrays.asList( + thriftObj(1, 0.5, "k1", "k2"), + thriftObj(2, 1.5, "k1", "k2"), + thriftObj(1, 2.5, "k2", "k3"), + thriftObj(2, 3.5, "k2", "k3")); + + testPipeline + .getSchemaRegistry() + .registerSchemaProvider(TestThriftStruct.class, customSchemaProvider); + final PCollection rows = + testPipeline.apply(Create.of(thriftData)).apply("toRows", Convert.toRows()); + + playWithVariousDataTypes(rows); + + final PCollection restored = + rows.apply("backToThrift", Convert.fromRows(TypeDescriptor.of(TestThriftStruct.class))); + PAssert.that(restored).containsInAnyOrder(thriftData); + + testPipeline.run(); + } + + private void playWithVariousDataTypes(PCollection rows) { + final PCollection sumByKey = + rows.apply( + Group.byFieldNames("testLong") + .aggregateField("testDouble", Sum.ofDoubles(), "total")); + final Schema keySchema = Schema.of(Field.of("key", FieldType.INT64)); + final Schema valueSchema = Schema.of(Field.of("value", FieldType.DOUBLE)); + PAssert.that(sumByKey) + .containsInAnyOrder( + Row.withSchema(sumByKey.getSchema()) + .addValues( + Row.withSchema(keySchema).addValues(1L).build(), + Row.withSchema(valueSchema).addValues(3.0).build()) + .build(), + Row.withSchema(sumByKey.getSchema()) + .addValues( + Row.withSchema(keySchema).addValues(2L).build(), + Row.withSchema(valueSchema).addValues(5.0).build()) + .build()); + + final PCollection count = + rows.apply("bin", Select.fieldNames("testBinary")) + .apply("distinctBin", Distinct.create()) + .apply(Count.globally()); + PAssert.that(count).containsInAnyOrder(2L); + + final PCollection mapEntries = + rows.apply( + MapElements.into(TypeDescriptors.strings()) + .via( + row -> + row.getMap("stringIntMap").keySet().stream() + .collect(Collectors.joining()))) + .apply("distinctMapEntries", Distinct.create()); + PAssert.that(mapEntries).containsInAnyOrder("k1k2", "k3k2"); + + final PCollection tags = + rows.apply( + FlatMapElements.into(TypeDescriptor.of(String.class)) + .via(row -> row.getIterable("testStringSetTypedef"))) + .apply("distinctTags", Distinct.create()); + PAssert.that(tags).containsInAnyOrder("tag"); + + final PCollection enumerated = + rows.apply("enumSelect", Select.fieldNames("testEnum")) + .apply("distinctEnumValues", Distinct.create()); + + final Schema enumSchema = + Schema.of(Field.of("testEnum", FieldType.logicalType(EnumerationType.create("C1", "C2")))); + PAssert.that(enumerated) + .containsInAnyOrder( + Row.withSchema(enumSchema).addValues(new EnumerationType.Value(0)).build(), + Row.withSchema(enumSchema).addValues(new EnumerationType.Value(1)).build()); + + final PCollection unionNestedStructNames = + rows.apply( + "unionSelectStruct", + Select.fieldNames("testUnion.snake_case_nested_struct.testNameTypedef")) + .apply("distinctUnionNames", Distinct.create()); + + final Schema unionNameSchema = Schema.of(Field.nullable("name", FieldType.STRING)); + PAssert.that(unionNestedStructNames) + .containsInAnyOrder( + Row.withSchema(unionNameSchema).addValues("kid").build(), + Row.withSchema(unionNameSchema).addValues((String) null).build()); + + final PCollection unionNestedEnumValues = + rows.apply("unionSelectEnum", Select.fieldNames("testUnion.camelCaseEnum")) + .apply("distinctUnionEnum", Distinct.create()); + + final Schema unionNestedEnumSchema = + Schema.of( + Field.nullable("testEnum", FieldType.logicalType(EnumerationType.create("C1", "C2")))); + PAssert.that(unionNestedEnumValues) + .containsInAnyOrder( + Row.withSchema(unionNestedEnumSchema).addValues(new EnumerationType.Value(0)).build(), + Row.withSchema(unionNestedEnumSchema).addValues((EnumerationType.Value) null).build()); + + final Schema nameSchema = Schema.of(Field.of("name", FieldType.STRING)); + final PCollection names = + rows.apply("names", Select.fieldNames("testNested.testNameTypedef")) + .apply("distinctNames", Distinct.create()); + PAssert.that(names) + .containsInAnyOrder(Row.withSchema(nameSchema).addValues("Maradona").build()); + } + + private TestThriftStruct thriftObj(int index, double doubleValue, String... mapKeys) { + final TestThriftStruct thrift = new TestThriftStruct(); + thrift.setTestLong(index); + thrift.setTestInt(index); + thrift.setTestDouble(doubleValue); + final Map map = + Stream.of(mapKeys).collect(Collectors.toMap(Function.identity(), k -> (short) k.length())); + thrift.setStringIntMap(map); + thrift.setTestBinary(String.join("", mapKeys).getBytes(StandardCharsets.UTF_8)); + thrift.setTestStringSetTypedef(Collections.singleton("tag")); + thrift.setTestList(Arrays.asList(1, 2, 3)); + final TestThriftInnerStruct nested = new TestThriftInnerStruct("Maradona", (short) 60); + thrift.setTestNested(nested); + if (index % 2 == 0) { + thrift.setTestEnum(TestThriftEnum.C1); + thrift.setTestUnion(TestThriftUnion.snake_case_nested_struct(new TestThriftInnerStruct())); + } else { + thrift.setTestEnum(TestThriftEnum.C2); + thrift.setTestUnion(TestThriftUnion.camelCaseEnum(TestThriftEnum.C1)); + } + return thrift; + } +} diff --git a/sdks/java/io/thrift/src/test/resources/thrift/thrift_test.thrift b/sdks/java/io/thrift/src/test/resources/thrift/thrift_test.thrift index 93b04b304c91..df3a0b625b6d 100644 --- a/sdks/java/io/thrift/src/test/resources/thrift/thrift_test.thrift +++ b/sdks/java/io/thrift/src/test/resources/thrift/thrift_test.thrift @@ -15,9 +15,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// This thrift file is used to generate the TestThriftStruct class. -namespace java test_thrift +/* +This thrift file is used to generate the TestThrift* classes: + +thrift --gen java:beans \ + -out sdks/java/io/thrift/src/test/java/ \ + sdks/java/io/thrift/src/test/resources/thrift/thrift_test.thrift + +./gradlew :sdks:java:io:thrift:spotlessApply +*/ + +namespace java org.apache.beam.sdk.io.thrift + +typedef string Name +typedef i16 Age + +struct TestThriftInnerStruct { + 1: Name testNameTypedef = "kid" + 2: Age testAgeTypedef = 12 +} + +enum TestThriftEnum { C1, C2 } + +union TestThriftUnion { + 1: TestThriftInnerStruct snake_case_nested_struct; + 2: TestThriftEnum camelCaseEnum; +} + +typedef set StringSet struct TestThriftStruct { 1: i8 testByte @@ -28,4 +54,9 @@ struct TestThriftStruct { 6: map stringIntMap 7: binary testBinary 8: bool testBool + 9: list testList + 10: StringSet testStringSetTypedef + 11: TestThriftEnum testEnum + 12: TestThriftInnerStruct testNested + 13: TestThriftUnion testUnion } diff --git a/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/ParseResultTest.java b/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/ParseResultTest.java index 9b324db2b36d..05de20f71e61 100644 --- a/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/ParseResultTest.java +++ b/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/ParseResultTest.java @@ -19,8 +19,8 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import org.apache.tika.metadata.Metadata; import org.junit.Test; diff --git a/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/TikaIOTest.java b/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/TikaIOTest.java index e254fd82fd98..76ebd4f3533b 100644 --- a/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/TikaIOTest.java +++ b/sdks/java/io/tika/src/test/java/org/apache/beam/sdk/io/tika/TikaIOTest.java @@ -18,9 +18,9 @@ package org.apache.beam.sdk.io.tika; import static org.apache.beam.sdk.transforms.display.DisplayDataMatchers.hasDisplayItem; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; diff --git a/sdks/java/io/xml/src/main/java/org/apache/beam/sdk/io/xml/XmlSource.java b/sdks/java/io/xml/src/main/java/org/apache/beam/sdk/io/xml/XmlSource.java index a7bd320b5fea..04bb74a37cd1 100644 --- a/sdks/java/io/xml/src/main/java/org/apache/beam/sdk/io/xml/XmlSource.java +++ b/sdks/java/io/xml/src/main/java/org/apache/beam/sdk/io/xml/XmlSource.java @@ -233,6 +233,8 @@ private long getFirstOccurenceOfRecordElement( int charBytesFound = 0; ByteBuffer buf = ByteBuffer.allocate(BUF_SIZE); + boolean bufSizeChanged = false; + byte[] recordStartBytes = ("<" + getCurrentSource().configuration.getRecordElement()) .getBytes(StandardCharsets.UTF_8); @@ -281,7 +283,16 @@ private long getFirstOccurenceOfRecordElement( break outer; } else { // Matching was unsuccessful. Reset the buffer to include bytes read for the char. - ByteBuffer newbuf = ByteBuffer.allocate(BUF_SIZE); + int bytesToWrite = buf.remaining() + charBytes.length; + ByteBuffer newbuf; + if (bytesToWrite > BUF_SIZE) { + // Avoiding buffer overflow. The number of bytes to push to the buffer might be + // larger than BUF_SIZE due to additional 'charBytes'. + newbuf = ByteBuffer.allocate(bytesToWrite); + bufSizeChanged = true; + } else { + newbuf = ByteBuffer.allocate(BUF_SIZE); + } newbuf.put(charBytes); offsetInFileOfCurrentByte -= charBytes.length; while (buf.hasRemaining()) { @@ -320,7 +331,14 @@ private long getFirstOccurenceOfRecordElement( recordStartBytesMatched = true; } } - buf.clear(); + if (bufSizeChanged) { + // We have to reset the size of the buffer to 'BUF_SIZE' + // to prevent it from infinitely increasing. + buf = ByteBuffer.allocate(BUF_SIZE); + bufSizeChanged = false; + } else { + buf.clear(); + } } if (!fullyMatched) { diff --git a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/JAXBCoderTest.java b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/JAXBCoderTest.java index 8d995edd049b..3af608ac8590 100644 --- a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/JAXBCoderTest.java +++ b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/JAXBCoderTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.io.xml; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import java.io.IOException; import java.io.InputStream; diff --git a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlIOTest.java b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlIOTest.java index ac4543244317..bc32ae5c4212 100644 --- a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlIOTest.java +++ b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlIOTest.java @@ -37,7 +37,6 @@ import org.apache.beam.sdk.values.PCollection; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists; import org.checkerframework.checker.nullness.qual.Nullable; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -187,11 +186,11 @@ public void testDisplayData() { .withMinBundleSize(1234) .withRecordClass(Integer.class)); - Assert.assertThat(displayData, hasDisplayItem("filePattern", "foo.xml")); - Assert.assertThat(displayData, hasDisplayItem("rootElement", "bird")); - Assert.assertThat(displayData, hasDisplayItem("recordElement", "cat")); - Assert.assertThat(displayData, hasDisplayItem("recordClass", Integer.class)); - Assert.assertThat(displayData, hasDisplayItem("minBundleSize", 1234)); + assertThat(displayData, hasDisplayItem("filePattern", "foo.xml")); + assertThat(displayData, hasDisplayItem("rootElement", "bird")); + assertThat(displayData, hasDisplayItem("recordElement", "cat")); + assertThat(displayData, hasDisplayItem("recordClass", Integer.class)); + assertThat(displayData, hasDisplayItem("minBundleSize", 1234)); } @Test diff --git a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlSourceTest.java b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlSourceTest.java index f84f8f404a14..18c7de985fee 100644 --- a/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlSourceTest.java +++ b/sdks/java/io/xml/src/test/java/org/apache/beam/sdk/io/xml/XmlSourceTest.java @@ -20,9 +20,9 @@ import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionExhaustive; import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionFails; import static org.apache.beam.sdk.testing.SourceTestUtils.assertSplitAtFractionSucceedsAndConsistent; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.BufferedWriter; @@ -158,6 +158,12 @@ public class XmlSourceTest { + "Cédric7blue" + ""; + private String trainXMLWithTrainTagsTemplate = + "" + + "%trainTags%Thomas1blue" + + "%trainTags%Henry3green" + + ""; + @XmlRootElement static class TinyTrain { TinyTrain(String name) { @@ -873,6 +879,42 @@ public void testSplitAtFractionExhaustiveSingleByte() throws Exception { assertSplitAtFractionExhaustive(source, options); } + @Test + public void testNoBufferOverflowThrown() throws IOException { + // The magicNumber was found imperatively and will be different for different xml content. + // Test with the current setup causes BufferOverflow in + // XMLReader#getFirstOccurenceOfRecordElement method, + // if the specific corner case is not handled + final int magicNumber = 51; + StringBuilder tagsSb = new StringBuilder(); + for (int j = 0; j < magicNumber; j++) { + // tags which start the same way as the record element, trigger + // a special flow, which could end up with BufferOverflow + // exception + tagsSb.append("").append(j).append(""); + } + File file = tempFolder.newFile("trainXMLWithTags"); + + String xmlWithNoise = trainXMLWithTrainTagsTemplate.replace("%trainTags%", tagsSb.toString()); + Files.write(file.toPath(), xmlWithNoise.getBytes(StandardCharsets.UTF_8)); + + PCollection output = + p.apply( + "ReadFileData", + XmlIO.read() + .from(file.toPath().toString()) + .withRootElement("trains") + .withRecordElement("train") + .withRecordClass(Train.class) + .withMinBundleSize(1024)); + + List expectedResults = + ImmutableList.of( + new Train("Thomas", 1, "blue", null), new Train("Henry", 3, "green", null)); + PAssert.that(output).containsInAnyOrder(expectedResults); + p.run(); + } + @Test @Ignore( "Multi-byte characters in XML are not supported because the parser " diff --git a/sdks/java/maven-archetypes/examples/build.gradle b/sdks/java/maven-archetypes/examples/build.gradle index 43f3021e20d4..a1a91ecc4c41 100644 --- a/sdks/java/maven-archetypes/examples/build.gradle +++ b/sdks/java/maven-archetypes/examples/build.gradle @@ -45,7 +45,7 @@ processResources { 'maven-jar-plugin.version': dependencies.create(project.library.maven.maven_jar_plugin).getVersion(), 'maven-shade-plugin.version': dependencies.create(project.library.maven.maven_shade_plugin).getVersion(), 'maven-surefire-plugin.version': dependencies.create(project.library.maven.maven_surefire_plugin).getVersion(), - 'flink.artifact.name': 'beam-runners-flink-'.concat(project(":runners:flink:1.10").getName()), + 'flink.artifact.name': 'beam-runners-flink-'.concat(project(":runners:flink:${project.ext.latestFlinkVersion}").getName()), ] } diff --git a/sdks/java/testing/jpms-tests/build.gradle b/sdks/java/testing/jpms-tests/build.gradle index a292aa21d994..bb611a59ecd7 100644 --- a/sdks/java/testing/jpms-tests/build.gradle +++ b/sdks/java/testing/jpms-tests/build.gradle @@ -59,7 +59,7 @@ dependencies { baseIntegrationTest project(path: ":sdks:java:testing:jpms-tests", configuration: "testRuntime") directRunnerIntegrationTest project(":runners:direct-java") - flinkRunnerIntegrationTest project(":runners:flink:1.10") + flinkRunnerIntegrationTest project(":runners:flink:${project.ext.latestFlinkVersion}") dataflowRunnerIntegrationTest project(":runners:google-cloud-dataflow-java") } diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/Monitor.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/Monitor.java index b4cc5ae7bdad..e8e5fa7b8e79 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/Monitor.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/Monitor.java @@ -39,20 +39,15 @@ public class Monitor implements Serializable { private class MonitorDoFn extends DoFn { final Counter elementCounter = Metrics.counter(name, prefix + ".elements"); final Counter bytesCounter = Metrics.counter(name, prefix + ".bytes"); - final Distribution startTime = Metrics.distribution(name, prefix + ".startTime"); - final Distribution endTime = Metrics.distribution(name, prefix + ".endTime"); - final Distribution startTimestamp = Metrics.distribution(name, prefix + ".startTimestamp"); - final Distribution endTimestamp = Metrics.distribution(name, prefix + ".endTimestamp"); + final Distribution processingTime = Metrics.distribution(name, prefix + ".processingTime"); + final Distribution eventTimestamp = Metrics.distribution(name, prefix + ".eventTimestamp"); @ProcessElement public void processElement(ProcessContext c) { elementCounter.inc(); bytesCounter.inc(c.element().sizeInBytes()); - long now = System.currentTimeMillis(); - startTime.update(now); - endTime.update(now); - startTimestamp.update(c.timestamp().getMillis()); - endTimestamp.update(c.timestamp().getMillis()); + processingTime.update(System.currentTimeMillis()); + eventTimestamp.update(c.timestamp().getMillis()); c.output(c.element()); } } diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkLauncher.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkLauncher.java index fd2044f652e9..068b3465b97f 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkLauncher.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkLauncher.java @@ -104,9 +104,9 @@ import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists; import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps; +import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.serialization.ByteArrayDeserializer; import org.apache.kafka.common.serialization.ByteArraySerializer; -import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.StringSerializer; import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Duration; @@ -275,18 +275,18 @@ private NexmarkPerf currentPerf( long numEvents = eventMetrics.getCounterMetric(eventMonitor.prefix + ".elements"); long numEventBytes = eventMetrics.getCounterMetric(eventMonitor.prefix + ".bytes"); - long eventStart = eventMetrics.getStartTimeMetric(eventMonitor.prefix + ".startTime"); - long eventEnd = eventMetrics.getEndTimeMetric(eventMonitor.prefix + ".endTime"); + long eventStart = eventMetrics.getStartTimeMetric(eventMonitor.prefix + ".processingTime"); + long eventEnd = eventMetrics.getEndTimeMetric(eventMonitor.prefix + ".processingTime"); MetricsReader resultMetrics = new MetricsReader(result, resultMonitor.name); long numResults = resultMetrics.getCounterMetric(resultMonitor.prefix + ".elements"); long numResultBytes = resultMetrics.getCounterMetric(resultMonitor.prefix + ".bytes"); - long resultStart = resultMetrics.getStartTimeMetric(resultMonitor.prefix + ".startTime"); - long resultEnd = resultMetrics.getEndTimeMetric(resultMonitor.prefix + ".endTime"); + long resultStart = resultMetrics.getStartTimeMetric(resultMonitor.prefix + ".processingTime"); + long resultEnd = resultMetrics.getEndTimeMetric(resultMonitor.prefix + ".processingTime"); long timestampStart = - resultMetrics.getStartTimeMetric(resultMonitor.prefix + ".startTimestamp"); - long timestampEnd = resultMetrics.getEndTimeMetric(resultMonitor.prefix + ".endTimestamp"); + resultMetrics.getStartTimeMetric(resultMonitor.prefix + ".eventTimestamp"); + long timestampEnd = resultMetrics.getEndTimeMetric(resultMonitor.prefix + ".eventTimestamp"); long effectiveEnd = -1; if (eventEnd >= 0 && resultEnd >= 0) { @@ -717,11 +717,12 @@ private void sinkEventsToKafka(PCollection events) { .withBootstrapServers(options.getBootstrapServers()) .withTopic(options.getKafkaTopic()) .withValueSerializer(ByteArraySerializer.class) + .withInputTimestamp() .values()); } - static final DoFn, Event> BYTEARRAY_TO_EVENT = - new DoFn, Event>() { + static final DoFn, Event> BYTEARRAY_TO_EVENT = + new DoFn, Event>() { @ProcessElement public void processElement(ProcessContext c) throws IOException { byte[] encodedEvent = c.element().getValue(); @@ -731,20 +732,35 @@ public void processElement(ProcessContext c) throws IOException { }; /** Return source of events from Kafka. */ - private PCollection sourceEventsFromKafka(Pipeline p, final Instant now) { + private PCollection sourceEventsFromKafka(Pipeline p, final Instant start) { checkArgument((options.getBootstrapServers() != null), "Missing --bootstrapServers"); NexmarkUtils.console("Reading events from Kafka Topic %s", options.getKafkaTopic()); - KafkaIO.Read read = - KafkaIO.read() + KafkaIO.Read read = + KafkaIO.read() .withBootstrapServers(options.getBootstrapServers()) - .withTopic(options.getKafkaTopic()) - .withKeyDeserializer(LongDeserializer.class) + .withKeyDeserializer(ByteArrayDeserializer.class) .withValueDeserializer(ByteArrayDeserializer.class) - .withStartReadTime(now) + .withStartReadTime(start) .withMaxNumRecords( options.getNumEvents() != null ? options.getNumEvents() : Long.MAX_VALUE); + if (options.getKafkaTopicCreateTimeMaxDelaySec() >= 0) { + read = + read.withCreateTime( + Duration.standardSeconds(options.getKafkaTopicCreateTimeMaxDelaySec())); + } + + if (options.getNumKafkaTopicPartitions() > 0) { + ArrayList partitionArrayList = new ArrayList<>(); + for (int i = 0; i < options.getNumKafkaTopicPartitions(); ++i) { + partitionArrayList.add(new TopicPartition(options.getKafkaTopic(), i)); + } + read = read.withTopicPartitions(partitionArrayList); + } else { + read = read.withTopic(options.getKafkaTopic()); + } + return p.apply(queryName + ".ReadKafkaEvents", read.withoutMetadata()) .apply(queryName + ".KafkaToEvents", ParDo.of(BYTEARRAY_TO_EVENT)); } @@ -802,6 +818,7 @@ private void sinkResultsToKafka(PCollection formattedResults) { .withBootstrapServers(options.getBootstrapServers()) .withTopic(options.getKafkaResultsTopic()) .withValueSerializer(StringSerializer.class) + .withInputTimestamp() .values()); } @@ -1012,7 +1029,8 @@ private PCollection createSource(Pipeline p, final Instant now) throws IO // finished. In other case. when pubSubMode=SUBSCRIBE_ONLY, now should be null and // it will be ignored. source = - sourceEventsFromKafka(p, configuration.pubSubMode == COMBINED ? now : null); + sourceEventsFromKafka( + p, configuration.pubSubMode == COMBINED ? now : Instant.EPOCH); } else { source = sourceEventsFromPubsub(p); } diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkOptions.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkOptions.java index 31a459edf736..7fa560759c1a 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkOptions.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/NexmarkOptions.java @@ -429,6 +429,20 @@ void setPubsubMessageSerializationMethod( void setKafkaTopic(String value); + @Description( + "Number of partitions for Kafka topic in streaming mode. If unspecified, the broker will be queried for all partitions.") + int getNumKafkaTopicPartitions(); + + void setNumKafkaTopicPartitions(int value); + + @Description( + "If non-negative, events from the Kafka topic will get their timestamps from the Kafka createtime, with the maximum delay for" + + "disorder as specified.") + @Default.Integer(60) + int getKafkaTopicCreateTimeMaxDelaySec(); + + void setKafkaTopicCreateTimeMaxDelaySec(int value); + @Description("Base name of Kafka results topic in streaming mode.") @Default.String("nexmark-results") @Nullable diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQuery.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQuery.java index 7ae1523b1206..13947e9a25e8 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQuery.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQuery.java @@ -39,7 +39,6 @@ public final class NexmarkQuery final NexmarkConfiguration configuration; public final Monitor eventMonitor; public final Monitor resultMonitor; - private final Monitor endOfStreamMonitor; private final Counter fatalCounter; private final NexmarkQueryTransform transform; private transient PCollection> sideInput = null; @@ -51,12 +50,10 @@ public NexmarkQuery(NexmarkConfiguration configuration, NexmarkQueryTransform if (configuration.debug) { eventMonitor = new Monitor<>(name + ".Events", "event"); resultMonitor = new Monitor<>(name + ".Results", "result"); - endOfStreamMonitor = new Monitor<>(name + ".EndOfStream", "end"); fatalCounter = Metrics.counter(name, "fatal"); } else { eventMonitor = null; resultMonitor = null; - endOfStreamMonitor = null; fatalCounter = null; } } diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQueryModel.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQueryModel.java index 3b8479d4626a..8bb911fdc0b9 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQueryModel.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/NexmarkQueryModel.java @@ -17,6 +17,8 @@ */ package org.apache.beam.sdk.nexmark.queries; +import static org.hamcrest.MatcherAssert.assertThat; + import java.io.Serializable; import java.util.Collection; import java.util.HashSet; @@ -99,7 +101,7 @@ public SerializableFunction>, Void> assertionFor() @Override public @Nullable Void apply(Iterable> actual) { Collection actualStrings = toCollection(relevantResults(actual).iterator()); - Assert.assertThat("wrong pipeline output", actualStrings, IsEqual.equalTo(expectedStrings)); + assertThat("wrong pipeline output", actualStrings, IsEqual.equalTo(expectedStrings)); return null; } }; diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query10.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query10.java index c8b58f9a5d6b..0c5e8b901bf6 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query10.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query10.java @@ -188,7 +188,7 @@ public PCollection expand(PCollection events) { public void processElement(ProcessContext c) { if (c.element().hasAnnotation("LATE")) { lateCounter.inc(); - LOG.info("Observed late: {}", c.element()); + LOG.debug("Observed late: {}", c.element()); } else { onTimeCounter.inc(); } @@ -240,7 +240,7 @@ public void processElement(ProcessContext c, BoundedWindow window) { } } String shard = c.element().getKey(); - LOG.info( + LOG.debug( String.format( "%s with timestamp %s has %d actually late and %d on-time " + "elements in pane %s for window %s", @@ -289,7 +289,7 @@ public void processElement(ProcessContext c, BoundedWindow window) String shard = c.element().getKey(); GcsOptions options = c.getPipelineOptions().as(GcsOptions.class); OutputFile outputFile = outputFileFor(window, shard, c.pane()); - LOG.info( + LOG.debug( String.format( "Writing %s with record timestamp %s, window timestamp %s, pane %s", shard, c.timestamp(), window.maxTimestamp(), c.pane())); @@ -350,7 +350,7 @@ public void processElement(ProcessContext c, BoundedWindow window) LOG.error("ERROR! Unexpected ON_TIME pane index: {}", c.pane()); } else { GcsOptions options = c.getPipelineOptions().as(GcsOptions.class); - LOG.info( + LOG.debug( "Index with record timestamp {}, window timestamp {}, pane {}", c.timestamp(), window.maxTimestamp(), diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query3.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query3.java index 0d23d5fa422d..11ca3d7aa792 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query3.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query3.java @@ -17,9 +17,6 @@ */ package org.apache.beam.sdk.nexmark.queries; -import java.util.ArrayList; -import java.util.List; -import org.apache.beam.sdk.coders.ListCoder; import org.apache.beam.sdk.metrics.Counter; import org.apache.beam.sdk.metrics.Metrics; import org.apache.beam.sdk.nexmark.NexmarkConfiguration; @@ -27,6 +24,7 @@ import org.apache.beam.sdk.nexmark.model.Event; import org.apache.beam.sdk.nexmark.model.NameCityStateId; import org.apache.beam.sdk.nexmark.model.Person; +import org.apache.beam.sdk.state.BagState; import org.apache.beam.sdk.state.StateSpec; import org.apache.beam.sdk.state.StateSpecs; import org.apache.beam.sdk.state.TimeDomain; @@ -36,16 +34,11 @@ import org.apache.beam.sdk.state.ValueState; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.Filter; +import org.apache.beam.sdk.transforms.Flatten; import org.apache.beam.sdk.transforms.ParDo; -import org.apache.beam.sdk.transforms.join.CoGbkResult; -import org.apache.beam.sdk.transforms.join.CoGroupByKey; -import org.apache.beam.sdk.transforms.join.KeyedPCollectionTuple; -import org.apache.beam.sdk.transforms.windowing.AfterPane; -import org.apache.beam.sdk.transforms.windowing.GlobalWindows; -import org.apache.beam.sdk.transforms.windowing.Repeatedly; -import org.apache.beam.sdk.transforms.windowing.Window; import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.PCollectionList; import org.joda.time.Duration; import org.joda.time.Instant; import org.slf4j.Logger; @@ -83,27 +76,29 @@ public Query3(NexmarkConfiguration configuration) { @Override public PCollection expand(PCollection events) { - int numEventsInPane = 30; - - PCollection eventsWindowed = - events.apply( - Window.into(new GlobalWindows()) - .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(numEventsInPane))) - .discardingFiredPanes() - .withAllowedLateness(Duration.ZERO)); - PCollection> auctionsBySellerId = - eventsWindowed + PCollection> auctionsBySellerId = + events // Only want the new auction events. .apply(NexmarkQueryUtil.JUST_NEW_AUCTIONS) // We only want auctions in category 10. .apply(name + ".InCategory", Filter.by(auction -> auction.category == 10)) - // Key auctions by their seller id. - .apply("AuctionBySeller", NexmarkQueryUtil.AUCTION_BY_SELLER); + // Key auctions by their seller id and move to union Event type. + .apply( + "EventByAuctionSeller", + ParDo.of( + new DoFn>() { + @ProcessElement + public void processElement(ProcessContext c) { + Event e = new Event(); + e.newAuction = c.element(); + c.output(KV.of(c.element().seller, e)); + } + })); - PCollection> personsById = - eventsWindowed + PCollection> personsById = + events // Only want the new people events. .apply(NexmarkQueryUtil.JUST_NEW_PERSONS) @@ -116,18 +111,24 @@ public PCollection expand(PCollection events) { || "ID".equals(person.state) || "CA".equals(person.state))) - // Key people by their id. - .apply("PersonById", NexmarkQueryUtil.PERSON_BY_ID); + // Key persons by their id and move to the union event type. + .apply( + "EventByPersonId", + ParDo.of( + new DoFn>() { + @ProcessElement + public void processElement(ProcessContext c) { + Event e = new Event(); + e.newPerson = c.element(); + c.output(KV.of(c.element().id, e)); + } + })); - return // Join auctions and people. - // concatenate KeyedPCollections - KeyedPCollectionTuple.of(NexmarkQueryUtil.AUCTION_TAG, auctionsBySellerId) - .and(NexmarkQueryUtil.PERSON_TAG, personsById) - // group auctions and persons by personId - .apply(CoGroupByKey.create()) + return PCollectionList.of(auctionsBySellerId) + .and(personsById) + .apply(Flatten.pCollections()) .apply(name + ".Join", ParDo.of(joinDoFn)) - // Project what we want. .apply( name + ".Project", @@ -154,8 +155,11 @@ public void processElement(ProcessContext c) { *

    However we know that each auction is associated with at most one person, so only need to * store auction records in persistent state until we have seen the corresponding person record. * And of course may have already seen that record. + * + *

    To prevent state from accumulating over time, we cleanup buffered people or auctions after a + * max waiting time. */ - private static class JoinDoFn extends DoFn, KV> { + private static class JoinDoFn extends DoFn, KV> { private final int maxAuctionsWaitingTime; private static final String AUCTIONS = "auctions"; @@ -164,13 +168,12 @@ private static class JoinDoFn extends DoFn, KV> personSpec = StateSpecs.value(Person.CODER); - private static final String PERSON_STATE_EXPIRING = "personStateExpiring"; + private static final String STATE_EXPIRING = "stateExpiring"; @StateId(AUCTIONS) - private final StateSpec>> auctionsSpec = - StateSpecs.value(ListCoder.of(Auction.CODER)); + private final StateSpec> auctionsSpec = StateSpecs.bag(Auction.CODER); - @TimerId(PERSON_STATE_EXPIRING) + @TimerId(STATE_EXPIRING) private final TimerSpec timerSpec = TimerSpecs.timer(TimeDomain.EVENT_TIME); // Used to refer the metrics namespace @@ -178,7 +181,6 @@ private static class JoinDoFn extends DoFn, KV personState, - @StateId(AUCTIONS) ValueState> auctionsState) { + @Element KV element, + OutputReceiver> output, + @TimerId(STATE_EXPIRING) Timer timer, + @StateId(PERSON) @AlwaysFetched ValueState personState, + @StateId(AUCTIONS) BagState auctionsState) { // We would *almost* implement this by rewindowing into the global window and // running a combiner over the result. The combiner's accumulator would be the // state we use below. However, combiners cannot emit intermediate results, thus - // we need to wait for the pending ReduceFn API. + // we need to wait for the pending ReduceFn API Person existingPerson = personState.read(); - if (existingPerson != null) { - // We've already seen the new person event for this person id. - // We can join with any new auctions on-the-fly without needing any - // additional persistent state. - for (Auction newAuction : c.element().getValue().getAll(NexmarkQueryUtil.AUCTION_TAG)) { - newAuctionCounter.inc(); - newOldOutputCounter.inc(); - c.output(KV.of(newAuction, existingPerson)); - } - return; - } - - Person theNewPerson = null; - for (Person newPerson : c.element().getValue().getAll(NexmarkQueryUtil.PERSON_TAG)) { - if (theNewPerson == null) { - theNewPerson = newPerson; + Event event = element.getValue(); + Instant eventTime = null; + // Event is a union object, handle a new person or auction. + if (event.newPerson != null) { + Person person = event.newPerson; + eventTime = person.dateTime; + if (existingPerson == null) { + newPersonCounter.inc(); + personState.write(person); + // We've now seen the person for this person id so can flush any + // pending auctions for the same seller id (an auction is done by only one seller). + Iterable pendingAuctions = auctionsState.read(); + if (pendingAuctions != null) { + for (Auction pendingAuction : pendingAuctions) { + oldNewOutputCounter.inc(); + output.output(KV.of(pendingAuction, person)); + } + auctionsState.clear(); + } } else { - if (theNewPerson.equals(newPerson)) { - LOG.error("Duplicate person {}", theNewPerson); + if (person.equals(existingPerson)) { + LOG.error("Duplicate person {}", person); } else { - LOG.error("Conflicting persons {} and {}", theNewPerson, newPerson); + LOG.error("Conflicting persons {} and {}", existingPerson, person); } fatalCounter.inc(); - continue; } - newPersonCounter.inc(); - // We've now seen the person for this person id so can flush any - // pending auctions for the same seller id (an auction is done by only one seller). - List pendingAuctions = auctionsState.read(); - if (pendingAuctions != null) { - for (Auction pendingAuction : pendingAuctions) { - oldNewOutputCounter.inc(); - c.output(KV.of(pendingAuction, newPerson)); - } - auctionsState.clear(); - } - // Also deal with any new auctions. - for (Auction newAuction : c.element().getValue().getAll(NexmarkQueryUtil.AUCTION_TAG)) { + } else if (event.newAuction != null) { + Auction auction = event.newAuction; + eventTime = auction.dateTime; + newAuctionCounter.inc(); + if (existingPerson == null) { + auctionsState.add(auction); + } else { newAuctionCounter.inc(); - newNewOutputCounter.inc(); - c.output(KV.of(newAuction, newPerson)); + newOldOutputCounter.inc(); + output.output(KV.of(auction, existingPerson)); } - // Remember this person for any future auctions. - personState.write(newPerson); - // set a time out to clear this state + } else { + LOG.error("Only expecting people or auctions but received {}", event); + fatalCounter.inc(); + } + if (eventTime != null) { + // Set or reset the cleanup timer to clear the state. Instant firingTime = - new Instant(newPerson.dateTime).plus(Duration.standardSeconds(maxAuctionsWaitingTime)); + new Instant(eventTime).plus(Duration.standardSeconds(maxAuctionsWaitingTime)); timer.set(firingTime); } - if (theNewPerson != null) { - return; - } - - // We'll need to remember the auctions until we see the corresponding - // new person event. - List pendingAuctions = auctionsState.read(); - if (pendingAuctions == null) { - pendingAuctions = new ArrayList<>(); - } - for (Auction newAuction : c.element().getValue().getAll(NexmarkQueryUtil.AUCTION_TAG)) { - newAuctionCounter.inc(); - pendingAuctions.add(newAuction); - } - auctionsState.write(pendingAuctions); } - @OnTimer(PERSON_STATE_EXPIRING) + @OnTimer(STATE_EXPIRING) public void onTimerCallback( - OnTimerContext context, @StateId(PERSON) ValueState personState) { + OnTimerContext context, + @StateId(PERSON) ValueState personState, + @StateId(AUCTIONS) BagState auctionState) { personState.clear(); + auctionState.clear(); } } } diff --git a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query5.java b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query5.java index 76d9e64d3245..77d64ab0b07b 100644 --- a/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query5.java +++ b/sdks/java/testing/nexmark/src/main/java/org/apache/beam/sdk/nexmark/queries/Query5.java @@ -18,12 +18,18 @@ package org.apache.beam.sdk.nexmark.queries; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; +import org.apache.beam.sdk.coders.Coder; +import org.apache.beam.sdk.coders.CoderRegistry; import org.apache.beam.sdk.nexmark.NexmarkConfiguration; import org.apache.beam.sdk.nexmark.model.AuctionCount; import org.apache.beam.sdk.nexmark.model.Event; +import org.apache.beam.sdk.nexmark.queries.Query5.TopCombineFn.Accum; +import org.apache.beam.sdk.schemas.JavaFieldSchema; +import org.apache.beam.sdk.schemas.SchemaCoder; import org.apache.beam.sdk.transforms.Combine; +import org.apache.beam.sdk.transforms.Combine.AccumulatingCombineFn; import org.apache.beam.sdk.transforms.Count; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.ParDo; @@ -31,6 +37,10 @@ import org.apache.beam.sdk.transforms.windowing.Window; import org.apache.beam.sdk.values.KV; import org.apache.beam.sdk.values.PCollection; +import org.apache.beam.sdk.values.TypeDescriptor; +import org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.joda.time.Duration; /** @@ -53,6 +63,80 @@ public class Query5 extends NexmarkQueryTransform { private final NexmarkConfiguration configuration; + /** CombineFn that takes bidders with counts and keeps all bidders with the top count. */ + public static class TopCombineFn + extends AccumulatingCombineFn, Accum, KV>> { + @Override + public Accum createAccumulator() { + return new Accum(); + } + + @Override + public Coder getAccumulatorCoder( + @NonNull CoderRegistry registry, @NonNull Coder> inputCoder) { + JavaFieldSchema provider = new JavaFieldSchema(); + TypeDescriptor typeDescriptor = new TypeDescriptor() {}; + return SchemaCoder.of( + provider.schemaFor(typeDescriptor), + typeDescriptor, + provider.toRowFunction(typeDescriptor), + provider.fromRowFunction(typeDescriptor)); + } + + /** Accumulator that takes bidders with counts and keeps all bidders with the top count. */ + public static class Accum + implements AccumulatingCombineFn.Accumulator, Accum, KV>> { + + public ArrayList auctions = new ArrayList<>(); + public long count = 0; + + @Override + public void addInput(KV input) { + if (input.getValue() > count) { + count = input.getValue(); + auctions.clear(); + auctions.add(input.getKey()); + } else if (input.getValue() == count) { + auctions.add(input.getKey()); + } + } + + @Override + public void mergeAccumulator(Accum other) { + if (other.count > this.count) { + this.count = other.count; + this.auctions.clear(); + this.auctions.addAll(other.auctions); + } else if (other.count == this.count) { + this.auctions.addAll(other.auctions); + } + } + + @Override + public KV> extractOutput() { + return KV.of(count, auctions); + } + + @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Accum other = (Accum) o; + return this.count == other.count && Iterables.elementsEqual(this.auctions, other.auctions); + } + + @Override + public int hashCode() { + return Objects.hash(count, auctions); + } + } + } + public Query5(NexmarkConfiguration configuration) { super("Query5"); this.configuration = configuration; @@ -74,58 +158,19 @@ public PCollection expand(PCollection events) { // Count the number of bids per auction id. .apply(Count.perElement()) - // We'll want to keep all auctions with the maximal number of bids. - // Start by lifting each into a singleton list. - // need to do so because bellow combine returns a list of auctions in the key in case of - // equal number of bids. Combine needs to have same input type and return type. - .apply( - name + ".ToSingletons", - ParDo.of( - new DoFn, KV, Long>>() { - @ProcessElement - public void processElement(ProcessContext c) { - c.output( - KV.of( - Collections.singletonList(c.element().getKey()), - c.element().getValue())); - } - })) - // Keep only the auction ids with the most bids. .apply( - Combine.globally( - new Combine.BinaryCombineFn, Long>>() { - @Override - public KV, Long> apply( - KV, Long> left, KV, Long> right) { - List leftBestAuctions = left.getKey(); - long leftCount = left.getValue(); - List rightBestAuctions = right.getKey(); - long rightCount = right.getValue(); - if (leftCount > rightCount) { - return left; - } else if (leftCount < rightCount) { - return right; - } else { - List newBestAuctions = new ArrayList<>(); - newBestAuctions.addAll(leftBestAuctions); - newBestAuctions.addAll(rightBestAuctions); - return KV.of(newBestAuctions, leftCount); - } - } - }) - .withoutDefaults() - .withFanout(configuration.fanout)) + Combine.globally(new TopCombineFn()).withoutDefaults().withFanout(configuration.fanout)) // Project into result. .apply( name + ".Select", ParDo.of( - new DoFn, Long>, AuctionCount>() { + new DoFn>, AuctionCount>() { @ProcessElement public void processElement(ProcessContext c) { - long count = c.element().getValue(); - for (long auction : c.element().getKey()) { + long count = c.element().getKey(); + for (long auction : c.element().getValue()) { c.output(new AuctionCount(auction, count)); } } diff --git a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/NexmarkConfigurationTest.java b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/NexmarkConfigurationTest.java index de447b03c47a..c621bd40469c 100644 --- a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/NexmarkConfigurationTest.java +++ b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/NexmarkConfigurationTest.java @@ -17,8 +17,8 @@ */ package org.apache.beam.sdk.nexmark; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; import org.apache.beam.sdk.options.PipelineOptionsFactory; import org.junit.Test; diff --git a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/PerfsToBigQueryTest.java b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/PerfsToBigQueryTest.java index c60c6e70d895..caf22f012ff3 100644 --- a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/PerfsToBigQueryTest.java +++ b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/PerfsToBigQueryTest.java @@ -18,7 +18,7 @@ package org.apache.beam.sdk.nexmark; import static org.hamcrest.CoreMatchers.hasItems; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import java.util.HashMap; import java.util.List; diff --git a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/BoundedSideInputJoinTest.java b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/BoundedSideInputJoinTest.java index f8f65d253a7d..7435b894cb48 100644 --- a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/BoundedSideInputJoinTest.java +++ b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/BoundedSideInputJoinTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.nexmark.queries; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertThat; import java.util.Random; import org.apache.beam.sdk.PipelineResult; diff --git a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/SessionSideInputJoinTest.java b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/SessionSideInputJoinTest.java index efb904b25c9b..c139e957d111 100644 --- a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/SessionSideInputJoinTest.java +++ b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/SessionSideInputJoinTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.nexmark.queries; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertThat; import java.util.Random; import org.apache.beam.sdk.PipelineResult; diff --git a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/sql/SqlBoundedSideInputJoinTest.java b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/sql/SqlBoundedSideInputJoinTest.java index 577ee70deed0..3810eecc4f57 100644 --- a/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/sql/SqlBoundedSideInputJoinTest.java +++ b/sdks/java/testing/nexmark/src/test/java/org/apache/beam/sdk/nexmark/queries/sql/SqlBoundedSideInputJoinTest.java @@ -17,9 +17,9 @@ */ package org.apache.beam.sdk.nexmark.queries.sql; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertThat; import java.util.Random; import org.apache.beam.sdk.PipelineResult; diff --git a/sdks/python/apache_beam/coders/coders.py b/sdks/python/apache_beam/coders/coders.py index 725a5d4632cc..66f4bff16a85 100644 --- a/sdks/python/apache_beam/coders/coders.py +++ b/sdks/python/apache_beam/coders/coders.py @@ -37,7 +37,6 @@ from typing import Tuple from typing import Type from typing import TypeVar -from typing import Union from typing import overload import google.protobuf.wrappers_pb2 @@ -88,6 +87,7 @@ 'NullableCoder', 'PickleCoder', 'ProtoCoder', + 'ShardedKeyCoder', 'SingletonCoder', 'StrUtf8Coder', 'TimestampCoder', @@ -358,26 +358,17 @@ def to_runner_api(self, context): @classmethod def from_runner_api(cls, coder_proto, context): - # type: (Type[CoderT], beam_runner_api_pb2.Coder, PipelineContext) -> Union[CoderT, ExternalCoder] + # type: (Type[CoderT], beam_runner_api_pb2.Coder, PipelineContext) -> CoderT """Converts from an FunctionSpec to a Fn object. Prefer registering a urn with its parameter type and constructor. """ - if (context.allow_proto_holders and - coder_proto.spec.urn not in cls._known_urns): - # We hold this in proto form since there's no coder available in Python - # SDK. - # This is potentially a coder that is only available in an external SDK. - return ExternalCoder(coder_proto) - else: - parameter_type, constructor = cls._known_urns[coder_proto.spec.urn] - return constructor( - proto_utils.parse_Bytes(coder_proto.spec.payload, parameter_type), [ - context.coders.get_by_id(c) - for c in coder_proto.component_coder_ids - ], - context) + parameter_type, constructor = cls._known_urns[coder_proto.spec.urn] + return constructor( + proto_utils.parse_Bytes(coder_proto.spec.payload, parameter_type), + [context.coders.get_by_id(c) for c in coder_proto.component_coder_ids], + context) def to_runner_api_parameter(self, context): # type: (Optional[PipelineContext]) -> Tuple[str, Any, Sequence[Coder]] @@ -1485,6 +1476,21 @@ def as_cloud_object(self, coders_context=None): ], } + def to_type_hint(self): + from apache_beam.typehints import sharded_key_type + return sharded_key_type.ShardedKeyTypeConstraint( + self._key_coder.to_type_hint()) + + @staticmethod + def from_type_hint(typehint, registry): + from apache_beam.typehints import sharded_key_type + if isinstance(typehint, sharded_key_type.ShardedKeyTypeConstraint): + return ShardedKeyCoder(registry.get_coder(typehint.key_type)) + else: + raise ValueError(( + 'Expected an instance of ShardedKeyTypeConstraint' + ', but got a %s' % typehint)) + def __eq__(self, other): return type(self) == type(other) and self._key_coder == other._key_coder @@ -1494,50 +1500,3 @@ def __hash__(self): Coder.register_structured_urn( common_urns.coders.SHARDED_KEY.urn, ShardedKeyCoder) - - -class CoderElementType(typehints.TypeConstraint): - """An element type that just holds a coder.""" - def __init__(self, coder): - self.coder = coder - - -class ExternalCoder(Coder): - """A `Coder` that holds a runner API `Coder` proto. - - This is used for coders for which corresponding objects cannot be - initialized in Python SDK. For example, coders for remote SDKs that may - be available in Python SDK transform graph when expanding a cross-language - transform. - """ - def __init__(self, coder_proto): - self._coder_proto = coder_proto - - def as_cloud_object(self, coders_context=None): - if not coders_context: - raise Exception( - 'coders_context must be specified to correctly encode external coders' - ) - coder_id = coders_context.get_by_proto(self._coder_proto, deduplicate=True) - - # 'kind:external' is just a placeholder kind. Dataflow will get the actual - # coder from pipeline proto using the pipeline_proto_coder_id property. - return {'@type': 'kind:external', 'pipeline_proto_coder_id': coder_id} - - @staticmethod - def from_type_hint(typehint, unused_registry): - if isinstance(typehint, CoderElementType): - return typehint.coder - else: - raise ValueError(( - 'Expected an instance of CoderElementType' - ', but got a %s' % typehint)) - - def to_runner_api_parameter(self, context): - return ( - self._coder_proto.spec.urn, - self._coder_proto.spec.payload, - self._coder_proto.component_coder_ids) - - def to_type_hint(self): - return CoderElementType(self) diff --git a/sdks/python/apache_beam/coders/coders_test_common.py b/sdks/python/apache_beam/coders/coders_test_common.py index 63ed0ba0f852..d0cc568e204b 100644 --- a/sdks/python/apache_beam/coders/coders_test_common.py +++ b/sdks/python/apache_beam/coders/coders_test_common.py @@ -30,11 +30,14 @@ from apache_beam.coders import proto2_coder_test_messages_pb2 as test_message from apache_beam.coders import coders +from apache_beam.coders import typecoders from apache_beam.internal import pickler from apache_beam.runners import pipeline_context from apache_beam.transforms import userstate from apache_beam.transforms import window from apache_beam.transforms.window import GlobalWindow +from apache_beam.typehints import sharded_key_type +from apache_beam.typehints import typehints from apache_beam.utils import timestamp from apache_beam.utils import windowed_value from apache_beam.utils.sharded_key import ShardedKey @@ -77,7 +80,6 @@ def tearDownClass(cls): coders.Coder, coders.AvroGenericCoder, coders.DeterministicProtoCoder, - coders.ExternalCoder, coders.FastCoder, coders.ProtoCoder, coders.ToBytesCoder @@ -596,6 +598,20 @@ def test_sharded_key_coder(self): self.check_coder(coder, ShardedKey(key, b'')) self.check_coder(coder, ShardedKey(key, b'123')) + # Test type hints + self.assertTrue( + isinstance( + coder.to_type_hint(), sharded_key_type.ShardedKeyTypeConstraint)) + key_type = coder.to_type_hint().key_type + if isinstance(key_type, typehints.TupleConstraint): + self.assertEqual(key_type.tuple_types, (type(key[0]), type(key[1]))) + else: + self.assertEqual(key_type, type(key)) + self.assertEqual( + coders.ShardedKeyCoder.from_type_hint( + coder.to_type_hint(), typecoders.CoderRegistry()), + coder) + for other_key, _, other_key_coder in key_and_coders: other_coder = coders.ShardedKeyCoder(other_key_coder) # Test nested diff --git a/sdks/python/apache_beam/coders/typecoders.py b/sdks/python/apache_beam/coders/typecoders.py index 52159a25dc2f..958511e2ccaf 100644 --- a/sdks/python/apache_beam/coders/typecoders.py +++ b/sdks/python/apache_beam/coders/typecoders.py @@ -78,8 +78,6 @@ def MakeXyzs(v): from past.builtins import unicode from apache_beam.coders import coders -from apache_beam.coders.coders import CoderElementType -from apache_beam.coders.coders import ExternalCoder from apache_beam.typehints import typehints __all__ = ['registry'] @@ -100,7 +98,6 @@ def register_standard_coders(self, fallback_coder): self._register_coder_internal(bool, coders.BooleanCoder) self._register_coder_internal(unicode, coders.StrUtf8Coder) self._register_coder_internal(typehints.TupleConstraint, coders.TupleCoder) - self._register_coder_internal(CoderElementType, ExternalCoder) # Default fallback coders applied in that order until the first matching # coder found. default_fallback_coders = [coders.ProtoCoder, coders.FastPrimitivesCoder] diff --git a/sdks/python/apache_beam/dataframe/frames.py b/sdks/python/apache_beam/dataframe/frames.py index 442768b304ca..be7b9339d38c 100644 --- a/sdks/python/apache_beam/dataframe/frames.py +++ b/sdks/python/apache_beam/dataframe/frames.py @@ -1182,6 +1182,7 @@ def merge( right_on, left_index, right_index, + suffixes, **kwargs): self_proxy = self._expr.proxy() right_proxy = right._expr.proxy() @@ -1195,14 +1196,14 @@ def merge( right_index=right_index, **kwargs) if not any([on, left_on, right_on, left_index, right_index]): - on = [col for col in self_proxy.columns() if col in right_proxy.columns()] + on = [col for col in self_proxy.columns if col in right_proxy.columns] if not left_on: left_on = on - elif not isinstance(left_on, list): + if left_on and not isinstance(left_on, list): left_on = [left_on] if not right_on: right_on = on - elif not isinstance(right_on, list): + if right_on and not isinstance(right_on, list): right_on = [right_on] if left_index: @@ -1215,11 +1216,25 @@ def merge( else: indexed_right = right.set_index(right_on, drop=False) + if left_on and right_on: + common_cols = set(left_on).intersection(right_on) + if len(common_cols): + # When merging on the same column name from both dfs, we need to make + # sure only one df has the column. Otherwise we end up with + # two duplicate columns, one with lsuffix and one with rsuffix. + # It's safe to drop from either because the data has already been duped + # to the index. + indexed_right = indexed_right.drop(columns=common_cols) + + merged = frame_base.DeferredFrame.wrap( expressions.ComputedExpression( 'merge', - lambda left, right: left.merge( - right, left_index=True, right_index=True, **kwargs), + lambda left, right: left.merge(right, + left_index=True, + right_index=True, + suffixes=suffixes, + **kwargs), [indexed_left._expr, indexed_right._expr], preserves_partition_by=partitionings.Singleton(), requires_partition_by=partitionings.Index())) @@ -1227,6 +1242,7 @@ def merge( if left_index or right_index: return merged else: + return merged.reset_index(drop=True) @frame_base.args_to_kwargs(pd.DataFrame) diff --git a/sdks/python/apache_beam/dataframe/frames_test.py b/sdks/python/apache_beam/dataframe/frames_test.py index 18799cb5965a..4cff34eeb802 100644 --- a/sdks/python/apache_beam/dataframe/frames_test.py +++ b/sdks/python/apache_beam/dataframe/frames_test.py @@ -124,7 +124,6 @@ def test_groupby(self): self._run_test(lambda df: df.groupby(['second', 'A']).sum(), df) - @unittest.skipIf(sys.version_info <= (3, ), 'differing signature') def test_merge(self): # This is from the pandas doctests, but fails due to re-indexing being # order-sensitive. @@ -152,6 +151,83 @@ def test_merge(self): df1, df2) + def test_merge_on_index(self): + # This is from the pandas doctests, but fails due to re-indexing being + # order-sensitive. + df1 = pd.DataFrame({ + 'lkey': ['foo', 'bar', 'baz', 'foo'], 'value': [1, 2, 3, 5] + }).set_index('lkey') + df2 = pd.DataFrame({ + 'rkey': ['foo', 'bar', 'baz', 'foo'], 'value': [5, 6, 7, 8] + }).set_index('rkey') + with beam.dataframe.allow_non_parallel_operations(): + self._run_test( + lambda df1, + df2: df1.merge(df2, left_index=True, right_index=True).sort_values( + ['value_x', 'value_y']), + df1, + df2) + + def test_merge_same_key(self): + df1 = pd.DataFrame({ + 'key': ['foo', 'bar', 'baz', 'foo'], 'value': [1, 2, 3, 5] + }) + df2 = pd.DataFrame({ + 'key': ['foo', 'bar', 'baz', 'foo'], 'value': [5, 6, 7, 8] + }) + with beam.dataframe.allow_non_parallel_operations(): + self._run_test( + lambda df1, + df2: df1.merge(df2, on='key').rename(index=lambda x: '*').sort_values( + ['value_x', 'value_y']), + df1, + df2) + self._run_test( + lambda df1, + df2: df1.merge(df2, on='key', suffixes=('_left', '_right')).rename( + index=lambda x: '*').sort_values(['value_left', 'value_right']), + df1, + df2) + + def test_merge_same_key_doctest(self): + df1 = pd.DataFrame({'a': ['foo', 'bar'], 'b': [1, 2]}) + df2 = pd.DataFrame({'a': ['foo', 'baz'], 'c': [3, 4]}) + + with beam.dataframe.allow_non_parallel_operations(): + self._run_test( + lambda df1, + df2: df1.merge(df2, how='left', on='a').rename(index=lambda x: '*'). + sort_values(['b', 'c']), + df1, + df2) + # Test without specifying 'on' + self._run_test( + lambda df1, + df2: df1.merge(df2, how='left').rename(index=lambda x: '*'). + sort_values(['b', 'c']), + df1, + df2) + + def test_merge_same_key_suffix_collision(self): + df1 = pd.DataFrame({'a': ['foo', 'bar'], 'b': [1, 2], 'a_lsuffix': [5, 6]}) + df2 = pd.DataFrame({'a': ['foo', 'baz'], 'c': [3, 4], 'a_rsuffix': [7, 8]}) + + with beam.dataframe.allow_non_parallel_operations(): + self._run_test( + lambda df1, + df2: df1.merge( + df2, how='left', on='a', suffixes=('_lsuffix', '_rsuffix')). + rename(index=lambda x: '*').sort_values(['b', 'c']), + df1, + df2) + # Test without specifying 'on' + self._run_test( + lambda df1, + df2: df1.merge(df2, how='left', suffixes=('_lsuffix', '_rsuffix')). + rename(index=lambda x: '*').sort_values(['b', 'c']), + df1, + df2) + def test_series_getitem(self): s = pd.Series([x**2 for x in range(10)]) self._run_test(lambda s: s[...], s) diff --git a/sdks/python/apache_beam/dataframe/io.py b/sdks/python/apache_beam/dataframe/io.py index b1af416f4e1c..b51e85e34c12 100644 --- a/sdks/python/apache_beam/dataframe/io.py +++ b/sdks/python/apache_beam/dataframe/io.py @@ -16,6 +16,8 @@ from __future__ import absolute_import +import itertools +import re from io import BytesIO from io import StringIO from io import TextIOWrapper @@ -27,8 +29,11 @@ from apache_beam.dataframe import frame_base from apache_beam.io import fileio +_DEFAULT_LINES_CHUNKSIZE = 10_000 +_DEFAULT_BYTES_CHUNKSIZE = 1 << 20 -def read_csv(path, *args, **kwargs): + +def read_csv(path, *args, splittable=False, **kwargs): """Emulates `pd.read_csv` from Pandas, but as a Beam PTransform. Use this as @@ -36,8 +41,21 @@ def read_csv(path, *args, **kwargs): df = p | beam.dataframe.io.read_csv(...) to get a deferred Beam dataframe representing the contents of the file. + + If your files are large and records do not contain quoted newlines, you may + pass the extra argument splittable=True to enable dynamic splitting for this + read on newlines. Using this option for records that do contain quoted + newlines may result in partial records and data corruption. """ - return _ReadFromPandas(pd.read_csv, path, args, kwargs, incremental=True) + if 'nrows' in kwargs: + raise ValueError('nrows not yet supported') + return _ReadFromPandas( + pd.read_csv, + path, + args, + kwargs, + incremental=True, + splitter=_CsvSplitter(args, kwargs) if splittable else None) def _as_pc(df): @@ -56,12 +74,19 @@ def read_fwf(path, *args, **kwargs): def read_json(path, *args, **kwargs): + if 'nrows' in kwargs: + raise NotImplementedError('nrows not yet supported') + elif kwargs.get('lines', False): + # Work around https://github.com/pandas-dev/pandas/issues/34548. + kwargs = dict(kwargs, nrows=1 << 63) return _ReadFromPandas( pd.read_json, path, args, kwargs, incremental=kwargs.get('lines', False), + splitter=_DelimSplitter(b'\n', _DEFAULT_BYTES_CHUNKSIZE) if kwargs.get( + 'lines', False) else None, binary=False) @@ -143,7 +168,14 @@ def _prefix_range_index_with(prefix, df): class _ReadFromPandas(beam.PTransform): def __init__( - self, reader, path, args, kwargs, incremental=False, binary=True): + self, + reader, + path, + args, + kwargs, + binary=True, + incremental=False, + splitter=False): if 'compression' in kwargs: raise NotImplementedError('compression') if not isinstance(path, str): @@ -152,8 +184,9 @@ def __init__( self.path = path self.args = args self.kwargs = kwargs - self.incremental = incremental self.binary = binary + self.incremental = incremental + self.splitter = splitter def expand(self, root): # TODO(robertwb): Handle streaming (with explicit schema). @@ -180,40 +213,297 @@ def expand(self, root): self.reader, self.args, self.kwargs, + self.binary, self.incremental, - self.binary))) + self.splitter))) from apache_beam.dataframe import convert return convert.to_dataframe( pcoll, proxy=_prefix_range_index_with(':', sample[:0])) -# TODO(robertwb): Actually make an SDF. -class _ReadFromPandasDoFn(beam.DoFn): - def __init__(self, reader, args, kwargs, incremental, binary): +class _Splitter: + def empty_buffer(self): + """Returns an empty buffer of the right type (string or bytes). + """ + raise NotImplementedError(self) + + def read_header(self, handle): + """Reads the header from handle, which points to the start of the file. + + Returns the pair (header, buffer) where buffer contains any part of the + file that was "overread" from handle while seeking the end of header. + """ + raise NotImplementedError(self) + + def read_to_record_boundary(self, buffered, handle): + """Reads the given handle up to the end of the current record. + + The buffer argument represents bytes that were read previously; logically + it's as if these were pushed back into handle for reading. If the + record end is within buffered, it's possible that no more bytes will be read + from handle at all. + + Returns the pair (remaining_record_bytes, buffer) where buffer contains + any part of the file that was "overread" from handle while seeking the end + of the record. + """ + raise NotImplementedError(self) + + +class _DelimSplitter(_Splitter): + """A _Splitter that splits on delimiters between records. + + This delimiter is assumed ot never occur within a record. + """ + def __init__(self, delim, read_chunk_size=_DEFAULT_BYTES_CHUNKSIZE): + # Multi-char delimiters would require more care across chunk boundaries. + assert len(delim) == 1 + self._delim = delim + self._empty = delim[:0] + self._read_chunk_size = read_chunk_size + + def empty_buffer(self): + return self._empty + + def read_header(self, handle): + return self._empty, self._empty + + def read_to_record_boundary(self, buffered, handle): + if self._delim in buffered: + ix = buffered.index(self._delim) + len(self._delim) + return buffered[:ix], buffered[ix:] + else: + while True: + chunk = handle.read(self._read_chunk_size) + if self._delim in chunk: + ix = chunk.index(self._delim) + len(self._delim) + return buffered + chunk[:ix], chunk[ix:] + elif not chunk: + return buffered, self._empty + else: + buffered += chunk + + +def _maybe_encode(str_or_bytes): + if isinstance(str_or_bytes, str): + return str_or_bytes.encode('utf-8') + else: + return str_or_bytes + + +class _CsvSplitter(_DelimSplitter): + """Splitter for dynamically sharding CSV files and newline record boundaries. + + Currently does not handle quoted newlines, so is off by default, but such + support could be added in the future. + """ + def __init__(self, args, kwargs, read_chunk_size=_DEFAULT_BYTES_CHUNKSIZE): + if args: + # TODO(robertwb): Automatically populate kwargs as we do for df methods. + raise ValueError( + 'Non-path arguments must be passed by keyword ' + 'for splittable csv reads.') + if kwargs.get('skipfooter', 0): + raise ValueError('Splittablility incompatible with skipping footers.') + super(_CsvSplitter, self).__init__( + _maybe_encode(kwargs.get('lineterminator', b'\n')), + _DEFAULT_BYTES_CHUNKSIZE) + self._kwargs = kwargs + + def read_header(self, handle): + if self._kwargs.get('header', 'infer') == 'infer': + if 'names' in self._kwargs: + header = None + else: + header = 0 + else: + header = self._kwargs['header'] + + if header is None: + return self._empty, self._empty + + if isinstance(header, int): + max_header = header + else: + max_header = max(header) + + skiprows = self._kwargs.get('skiprows', 0) + if isinstance(skiprows, int): + is_skiprow = lambda ix: ix < skiprows + elif callable(skiprows): + is_skiprow = skiprows + elif skiprows is None: + is_skiprow = lambda ix: False + else: + is_skiprow = lambda ix: ix in skiprows + + comment = _maybe_encode(self._kwargs.get('comment', None)) + if comment: + is_comment = lambda line: line.startswith(comment) + else: + is_comment = lambda line: False + + skip_blank_lines = self._kwargs.get('skip_blank_lines', True) + if skip_blank_lines: + is_blank = lambda line: re.match(rb'^\s*$', line) + else: + is_blank = lambda line: False + + text_header = b'' + rest = b'' + skipped = 0 + for ix in itertools.count(): + line, rest = self.read_to_record_boundary(rest, handle) + text_header += line + if is_skiprow(ix) or is_blank(line) or is_comment(line): + skipped += 1 + continue + if ix - skipped == max_header: + return text_header, rest + + +class _TruncatingFileHandle(object): + """A wrapper of a file-like object representing the restriction of the + underling handle according to the given SDF restriction tracker, breaking + the file only after the given delimiter. + + For example, if the underling restriction is [103, 607) and each line were + exactly 10 characters long (i.e. every 10th charcter was a newline), then this + would give a view of a 500-byte file consisting of bytes bytes 110 to 609 + (inclusive) of the underlying file. + + As with all SDF trackers, the endpoint may change dynamically during reading. + """ + def __init__(self, underlying, tracker, splitter): + self._underlying = underlying + self._tracker = tracker + self._splitter = splitter + + self._empty = self._splitter.empty_buffer() + self._done = False + self._header, self._buffer = self._splitter.read_header(self._underlying) + self._buffer_start_pos = len(self._header) + start = self._tracker.current_restriction().start + # Seek to first delimiter after the start position. + if start > len(self._header): + if start > len(self._header) + len(self._buffer): + self._buffer_start_pos = start + self._buffer = self._empty + self._underlying.seek(start) + else: + self._buffer_start_pos = start + self._buffer = self._buffer[start - len(self._header):] + skip, self._buffer = self._splitter.read_to_record_boundary( + self._buffer, self._underlying) + self._buffer_start_pos += len(skip) + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return False + + @property + def closed(self): + return False + + def __iter__(self): + # For pandas is_file_like. + raise NotImplementedError() + + def read(self, size=-1): + if self._header: + res = self._header + self._header = None + return res + elif self._done: + return self._empty + elif size == -1: + self._buffer += self._underlying.read() + elif not self._buffer: + self._buffer = self._underlying.read(size) + + if not self._buffer: + self._done = True + return self._empty + + if self._tracker.try_claim(self._buffer_start_pos + len(self._buffer)): + res = self._buffer + self._buffer = self._empty + self._buffer_start_pos += len(res) + else: + offset = self._tracker.current_restriction().stop - self._buffer_start_pos + if offset <= 0: + res = self._empty + else: + rest, _ = self._splitter.read_to_record_boundary( + self._buffer[offset:], self._underlying) + res = self._buffer[:offset] + rest + self._done = True + return res + + +class _ReadFromPandasDoFn(beam.DoFn, beam.RestrictionProvider): + def __init__(self, reader, args, kwargs, binary, incremental, splitter): # avoid pickling issues if reader.__module__.startswith('pandas.'): reader = reader.__name__ self.reader = reader self.args = args self.kwargs = kwargs - self.incremental = incremental self.binary = binary + self.incremental = incremental + self.splitter = splitter + + def initial_restriction(self, readable_file): + return beam.io.restriction_trackers.OffsetRange( + 0, readable_file.metadata.size_in_bytes) + + def restriction_size(self, readable_file, restriction): + return restriction.size() - def process(self, readable_file): + def create_tracker(self, restriction): + tracker = beam.io.restriction_trackers.OffsetRestrictionTracker(restriction) + if self.splitter: + return tracker + else: + return beam.io.restriction_trackers.UnsplittableRestrictionTracker( + tracker) + + def process(self, readable_file, tracker=beam.DoFn.RestrictionParam()): reader = self.reader if isinstance(reader, str): reader = getattr(pd, self.reader) with readable_file.open() as handle: + if self.incremental: + # TODO(robertwb): We could consider trying to get progress for + # non-incremental sources that are read linearly, as long as they + # don't try to seek. This could be deceptive as progress would + # advance to 100% the instant the (large) read was done, discounting + # any downstream processing. + handle = _TruncatingFileHandle( + handle, + tracker, + splitter=self.splitter or + _DelimSplitter(b'\n', _DEFAULT_BYTES_CHUNKSIZE)) if not self.binary: handle = TextIOWrapper(handle) if self.incremental: if 'chunksize' not in self.kwargs: - self.kwargs['chunksize'] = 10_000 + self.kwargs['chunksize'] = _DEFAULT_LINES_CHUNKSIZE frames = reader(handle, *self.args, **self.kwargs) else: frames = [reader(handle, *self.args, **self.kwargs)] for df in frames: yield _prefix_range_index_with(readable_file.metadata.path + ':', df) + if not self.incremental: + # Satisfy the SDF contract by claiming the whole range. + # Do this after emitting the frames to avoid advancing progress to 100% + # prior to that. + tracker.try_claim(tracker.current_restriction().stop) class _WriteToPandas(beam.PTransform): diff --git a/sdks/python/apache_beam/dataframe/io_test.py b/sdks/python/apache_beam/dataframe/io_test.py index a86961ad81ed..5b6ec68d1c09 100644 --- a/sdks/python/apache_beam/dataframe/io_test.py +++ b/sdks/python/apache_beam/dataframe/io_test.py @@ -26,14 +26,18 @@ import sys import tempfile import unittest +from io import BytesIO +from io import StringIO import pandas as pd +import pandas.testing from pandas.testing import assert_frame_equal from parameterized import parameterized import apache_beam as beam from apache_beam.dataframe import convert from apache_beam.dataframe import io +from apache_beam.io import restriction_trackers from apache_beam.testing.util import assert_that @@ -75,6 +79,7 @@ def test_read_write_csv(self): @parameterized.expand([ ('csv', dict(index_col=0)), + ('csv', dict(index_col=0, splittable=True)), ('json', dict(orient='index'), dict(orient='index')), ('json', dict(orient='columns'), dict(orient='columns')), ('json', dict(orient='split'), dict(orient='split')), @@ -160,6 +165,128 @@ def check(actual): os.system('head -n 100 ' + dest + '*') raise + def _run_truncating_file_handle_test( + self, s, splits, delim=' ', chunk_size=10): + split_results = [] + next_range = restriction_trackers.OffsetRange(0, len(s)) + for split in list(splits) + [None]: + tracker = restriction_trackers.OffsetRestrictionTracker(next_range) + handle = io._TruncatingFileHandle( + StringIO(s), tracker, splitter=io._DelimSplitter(delim, chunk_size)) + data = '' + chunk = handle.read(1) + if split is not None: + _, next_range = tracker.try_split(split) + while chunk: + data += chunk + chunk = handle.read(7) + split_results.append(data) + return split_results + + def test_truncating_filehandle(self): + self.assertEqual( + self._run_truncating_file_handle_test('a b c d e', [0.5]), + ['a b c ', 'd e']) + self.assertEqual( + self._run_truncating_file_handle_test('aaaaaaaaaaaaaaXaaa b', [0.5]), + ['aaaaaaaaaaaaaaXaaa ', 'b']) + self.assertEqual( + self._run_truncating_file_handle_test( + 'aa bbbbbbbbbbbbbbbbbbbbbbbbbb ccc ', [0.01, 0.5]), + ['aa ', 'bbbbbbbbbbbbbbbbbbbbbbbbbb ', 'ccc ']) + + numbers = 'x'.join(str(k) for k in range(1000)) + splits = self._run_truncating_file_handle_test( + numbers, [0.1] * 20, delim='x') + self.assertEqual(numbers, ''.join(splits)) + self.assertTrue(s.endswith('x') for s in splits[:-1]) + self.assertLess(max(len(s) for s in splits), len(numbers) * 0.9 + 10) + self.assertGreater( + min(len(s) for s in splits), len(numbers) * 0.9**20 * 0.1) + + @parameterized.expand([ + ('defaults', dict()), + ('header', dict(header=1)), + ('multi_header', dict(header=[0, 1])), + ('multi_header', dict(header=[0, 1, 4])), + ('names', dict(names=('m', 'n', 'o'))), + ('names_and_header', dict(names=('m', 'n', 'o'), header=0)), + ('skip_blank_lines', dict(header=4, skip_blank_lines=True)), + ('skip_blank_lines', dict(header=4, skip_blank_lines=False)), + ('comment', dict(comment='X', header=4)), + ('comment', dict(comment='X', header=[0, 3])), + ('skiprows', dict(skiprows=0, header=[0, 1])), + ('skiprows', dict(skiprows=[1], header=[0, 3], skip_blank_lines=False)), + ('skiprows', dict(skiprows=[0, 1], header=[0, 1], comment='X')), + ]) + def test_csv_splitter(self, name, kwargs): + def assert_frame_equal(expected, actual): + try: + pandas.testing.assert_frame_equal(expected, actual) + except AssertionError: + print("Expected:\n", expected) + print("Actual:\n", actual) + raise + + def read_truncated_csv(start, stop): + return pd.read_csv( + io._TruncatingFileHandle( + BytesIO(contents.encode('ascii')), + restriction_trackers.OffsetRestrictionTracker( + restriction_trackers.OffsetRange(start, stop)), + splitter=io._CsvSplitter((), kwargs, read_chunk_size=7)), + index_col=0, + **kwargs) + + contents = ''' + a0, a1, a2 + b0, b1, b2 + +X , c1, c2 + e0, e1, e2 + f0, f1, f2 + w, daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaata, w + x, daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaata, x + y, daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaata, y + z, daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaata, z + '''.strip() + expected = pd.read_csv(StringIO(contents), index_col=0, **kwargs) + + one_shard = read_truncated_csv(0, len(contents)) + assert_frame_equal(expected, one_shard) + + equal_shards = pd.concat([ + read_truncated_csv(0, len(contents) // 2), + read_truncated_csv(len(contents) // 2, len(contents)), + ]) + assert_frame_equal(expected, equal_shards) + + three_shards = pd.concat([ + read_truncated_csv(0, len(contents) // 3), + read_truncated_csv(len(contents) // 3, len(contents) * 2 // 3), + read_truncated_csv(len(contents) * 2 // 3, len(contents)), + ]) + assert_frame_equal(expected, three_shards) + + # https://github.com/pandas-dev/pandas/issues/38292 + if not isinstance(kwargs.get('header'), list): + split_in_header = pd.concat([ + read_truncated_csv(0, 1), + read_truncated_csv(1, len(contents)), + ]) + assert_frame_equal(expected, split_in_header) + + if not kwargs: + # Make sure we're correct as we cross the header boundary. + # We don't need to do this for every permutation. + header_end = contents.index('a2') + 3 + for split in range(header_end - 2, header_end + 2): + split_at_header = pd.concat([ + read_truncated_csv(0, split), + read_truncated_csv(split, len(contents)), + ]) + assert_frame_equal(expected, split_at_header) + if __name__ == '__main__': unittest.main() diff --git a/sdks/python/apache_beam/examples/kafkataxi/README.md b/sdks/python/apache_beam/examples/kafkataxi/README.md index 674dbd8678e6..e8e144d88a8f 100644 --- a/sdks/python/apache_beam/examples/kafkataxi/README.md +++ b/sdks/python/apache_beam/examples/kafkataxi/README.md @@ -185,7 +185,5 @@ python -m apache_beam.examples.kafkataxi.kafka_taxi \ --job_name $JOB_NAME \ --bootstrap_servers $BOOTSTRAP_SERVER \ --sdk_harness_container_image_overrides ".*java.*,${DOCKER_ROOT}/beam_java8_sdk:latest" \ - --experiments=use_runner_v2 \ - --experiments=use_unified_worker \ - --experiments=beam_fn_api + --experiments=use_runner_v2 ``` diff --git a/sdks/python/apache_beam/examples/snippets/snippets.py b/sdks/python/apache_beam/examples/snippets/snippets.py index c4a569df85ac..42e5886ceb64 100644 --- a/sdks/python/apache_beam/examples/snippets/snippets.py +++ b/sdks/python/apache_beam/examples/snippets/snippets.py @@ -697,12 +697,12 @@ def examples_wordcount_streaming(argv): | 'Group' >> beam.GroupByKey() | 'Sum' >> beam.Map(lambda word_ones: (word_ones[0], sum(word_ones[1]))) - | - 'Format' >> beam.Map(lambda word_and_count: '%s: %d' % word_and_count)) + | 'Format' >> + beam.MapTuple(lambda word, count: f'{word}: {count}'.encode('utf-8'))) # [START example_wordcount_streaming_write] # Write to Pub/Sub - output | beam.io.WriteStringsToPubSub(known_args.output_topic) + output | beam.io.WriteToPubSub(known_args.output_topic) # [END example_wordcount_streaming_write] @@ -1658,6 +1658,10 @@ class FileToWordsFn(beam.DoFn): def process( self, file_name, + # Alternatively, we can let FileToWordsFn itself inherit from + # RestrictionProvider, implement the required methods and let + # tracker=beam.DoFn.RestrictionParam() which will use self as + # the provider. tracker=beam.DoFn.RestrictionParam(FileToWordsRestrictionProvider())): with open(file_name) as file_handle: file_handle.seek(tracker.current_restriction.start()) diff --git a/sdks/python/apache_beam/examples/snippets/snippets_test.py b/sdks/python/apache_beam/examples/snippets/snippets_test.py index 238ecc8aef59..35c60e7833fc 100644 --- a/sdks/python/apache_beam/examples/snippets/snippets_test.py +++ b/sdks/python/apache_beam/examples/snippets/snippets_test.py @@ -748,7 +748,7 @@ def test_examples_wordcount_debugging(self): @unittest.skipIf(pubsub is None, 'GCP dependencies are not installed') @mock.patch('apache_beam.io.ReadFromPubSub') - @mock.patch('apache_beam.io.WriteStringsToPubSub') + @mock.patch('apache_beam.io.WriteToPubSub') def test_examples_wordcount_streaming(self, *unused_mocks): def FakeReadFromPubSub(topic=None, subscription=None, values=None): expected_topic = topic @@ -768,7 +768,7 @@ def __init__(self, matcher): def expand(self, pcoll): assert_that(pcoll, self.matcher) - def FakeWriteStringsToPubSub(topic=None, values=None): + def FakeWriteToPubSub(topic=None, values=None): expected_topic = topic def _inner(topic=None, subscription=None): @@ -785,11 +785,11 @@ def _inner(topic=None, subscription=None): TimestampedValue(b'a b c c c', 20) ] output_topic = 'projects/fake-beam-test-project/topic/outtopic' - output_values = ['a: 1', 'a: 2', 'b: 1', 'b: 3', 'c: 3'] + output_values = [b'a: 1', b'a: 2', b'b: 1', b'b: 3', b'c: 3'] beam.io.ReadFromPubSub = ( FakeReadFromPubSub(topic=input_topic, values=input_values)) - beam.io.WriteStringsToPubSub = ( - FakeWriteStringsToPubSub(topic=output_topic, values=output_values)) + beam.io.WriteToPubSub = ( + FakeWriteToPubSub(topic=output_topic, values=output_values)) snippets.examples_wordcount_streaming([ '--input_topic', 'projects/fake-beam-test-project/topic/intopic', diff --git a/sdks/python/apache_beam/examples/sql_taxi.py b/sdks/python/apache_beam/examples/sql_taxi.py index 607dea1d3f82..32fd80aea066 100644 --- a/sdks/python/apache_beam/examples/sql_taxi.py +++ b/sdks/python/apache_beam/examples/sql_taxi.py @@ -80,7 +80,8 @@ def run(output_topic, pipeline_args): "window_end": window.end.to_rfc3339() }) | "Convert to JSON" >> beam.Map(json.dumps) - | beam.io.WriteStringsToPubSub(topic=output_topic)) + | "UTF-8 encode" >> beam.Map(lambda s: s.encode("utf-8")) + | beam.io.WriteToPubSub(topic=output_topic)) if __name__ == '__main__': diff --git a/sdks/python/apache_beam/io/concat_source.py b/sdks/python/apache_beam/io/concat_source.py index 4f799a9f5fb7..e491f86edefd 100644 --- a/sdks/python/apache_beam/io/concat_source.py +++ b/sdks/python/apache_beam/io/concat_source.py @@ -229,9 +229,12 @@ def position_at_fraction(self, fraction): def fraction_consumed(self): with self._lock: - return self.local_to_global( - self._claimed_source_ix, - self.sub_range_tracker(self._claimed_source_ix).fraction_consumed()) + if self._claimed_source_ix == len(self._source_bundles): + return 1.0 + else: + return self.local_to_global( + self._claimed_source_ix, + self.sub_range_tracker(self._claimed_source_ix).fraction_consumed()) def local_to_global(self, source_ix, source_frac): cw = self._cumulative_weights diff --git a/sdks/python/apache_beam/io/concat_source_test.py b/sdks/python/apache_beam/io/concat_source_test.py index b796ff36f0f3..622e8e9a1124 100644 --- a/sdks/python/apache_beam/io/concat_source_test.py +++ b/sdks/python/apache_beam/io/concat_source_test.py @@ -135,6 +135,14 @@ def test_conact_source(self): self.assertEqual(range_tracker.sub_range_tracker(2).try_claim(10), True) self.assertEqual(range_tracker.sub_range_tracker(2).try_claim(11), False) + def test_fraction_consumed_at_end(self): + source = ConcatSource([ + RangeSource(0, 2), + RangeSource(2, 4), + ]) + range_tracker = source.get_range_tracker((2, None), None) + self.assertEqual(range_tracker.fraction_consumed(), 1.0) + def test_estimate_size(self): source = ConcatSource([ RangeSource(0, 10), diff --git a/sdks/python/apache_beam/io/flink/flink_streaming_impulse_source_test.py b/sdks/python/apache_beam/io/flink/flink_streaming_impulse_source_test.py index 2102d8f68746..68bff8804ad3 100644 --- a/sdks/python/apache_beam/io/flink/flink_streaming_impulse_source_test.py +++ b/sdks/python/apache_beam/io/flink/flink_streaming_impulse_source_test.py @@ -33,8 +33,7 @@ def test_serialization(self): # pylint: disable=expression-not-assigned p | FlinkStreamingImpulseSource() # Test that roundtrip through Runner API works - beam.Pipeline.from_runner_api( - p.to_runner_api(), p.runner, p._options, allow_proto_holders=False) + beam.Pipeline.from_runner_api(p.to_runner_api(), p.runner, p._options) if __name__ == '__main__': diff --git a/sdks/python/apache_beam/io/gcp/bigquery.py b/sdks/python/apache_beam/io/gcp/bigquery.py index e0866cf5c544..a5ceb5bc585f 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery.py +++ b/sdks/python/apache_beam/io/gcp/bigquery.py @@ -79,6 +79,44 @@ `ReadFromBigQuery`, you can use the flag `use_json_exports` to export data as JSON, and receive base64-encoded bytes. +ReadAllFromBigQuery +------------------- +Beam 2.27.0 introduces a new transform called `ReadAllFromBigQuery` which +allows you to define table and query reads from BigQuery at pipeline +runtime.::: + + read_requests = p | beam.Create([ + ReadFromBigQueryRequest(query='SELECT * FROM mydataset.mytable'), + ReadFromBigQueryRequest(table='myproject.mydataset.mytable')]) + results = read_requests | ReadAllFromBigQuery() + +A good application for this transform is in streaming pipelines to +refresh a side input coming from BigQuery. This would work like so::: + + side_input = ( + p + | 'PeriodicImpulse' >> PeriodicImpulse( + first_timestamp, last_timestamp, interval, True) + | 'MapToReadRequest' >> beam.Map( + lambda x: ReadFromBigQueryRequest(table='dataset.table')) + | beam.io.ReadAllFromBigQuery()) + main_input = ( + p + | 'MpImpulse' >> beam.Create(sample_main_input_elements) + | + 'MapMpToTimestamped' >> beam.Map(lambda src: TimestampedValue(src, src)) + | 'WindowMpInto' >> beam.WindowInto( + window.FixedWindows(main_input_windowing_interval))) + result = ( + main_input + | 'ApplyCrossJoin' >> beam.FlatMap( + cross_join, rights=beam.pvalue.AsIter(side_input))) + +**Note**: This transform is supported on Portable and Dataflow v2 runners. + +**Note**: This transform does not currently clean up temporary datasets +created for its execution. (BEAM-11359) + Writing Data to BigQuery ======================== @@ -234,7 +272,6 @@ def compute_table_name(row): from __future__ import absolute_import import collections -import decimal import itertools import json import logging @@ -243,6 +280,8 @@ def compute_table_name(row): import uuid from builtins import object from builtins import zip +from typing import Dict +from typing import Union from future.utils import itervalues from past.builtins import unicode @@ -257,12 +296,15 @@ def compute_table_name(row): from apache_beam.io.filesystems import FileSystems from apache_beam.io.gcp import bigquery_tools from apache_beam.io.gcp.bigquery_io_metadata import create_bigquery_io_metadata +from apache_beam.io.gcp.bigquery_read_internal import _BigQueryReadSplit +from apache_beam.io.gcp.bigquery_read_internal import _JsonToDictCoder from apache_beam.io.gcp.bigquery_read_internal import _PassThroughThenCleanup from apache_beam.io.gcp.bigquery_read_internal import bigquery_export_destination_uri from apache_beam.io.gcp.bigquery_tools import RetryStrategy from apache_beam.io.gcp.internal.clients import bigquery from apache_beam.io.iobase import BoundedSource from apache_beam.io.iobase import RangeTracker +from apache_beam.io.iobase import SDFBoundedSourceReader from apache_beam.io.iobase import SourceBundle from apache_beam.io.textio import _TextSource as TextSource from apache_beam.metrics import Metrics @@ -284,6 +326,14 @@ def compute_table_name(row): from apache_beam.transforms.window import GlobalWindows from apache_beam.utils import retry from apache_beam.utils.annotations import deprecated +from apache_beam.utils.annotations import experimental + +try: + from apache_beam.io.gcp.internal.clients.bigquery import DatasetReference + from apache_beam.io.gcp.internal.clients.bigquery import TableReference +except ImportError: + DatasetReference = None + TableReference = None __all__ = [ 'TableRowJsonCoder', @@ -292,6 +342,8 @@ def compute_table_name(row): 'BigQuerySink', 'WriteToBigQuery', 'ReadFromBigQuery', + 'ReadFromBigQueryRequest', + 'ReadAllFromBigQuery', 'SCHEMA_AUTODETECT', ] @@ -591,84 +643,6 @@ def reader(self, test_bigquery_client=None): kms_key=self.kms_key) -FieldSchema = collections.namedtuple('FieldSchema', 'fields mode name type') - - -class _JsonToDictCoder(coders.Coder): - """A coder for a JSON string to a Python dict.""" - def __init__(self, table_schema): - self.fields = self._convert_to_tuple(table_schema.fields) - self._converters = { - 'INTEGER': int, - 'INT64': int, - 'FLOAT': float, - 'FLOAT64': float, - 'NUMERIC': self._to_decimal, - 'BYTES': self._to_bytes, - } - - @staticmethod - def _to_decimal(value): - return decimal.Decimal(value) - - @staticmethod - def _to_bytes(value): - """Converts value from str to bytes on Python 3.x. Does nothing on - Python 2.7.""" - return value.encode('utf-8') - - @classmethod - def _convert_to_tuple(cls, table_field_schemas): - """Recursively converts the list of TableFieldSchema instances to the - list of tuples to prevent errors when pickling and unpickling - TableFieldSchema instances. - """ - if not table_field_schemas: - return [] - - return [ - FieldSchema(cls._convert_to_tuple(x.fields), x.mode, x.name, x.type) - for x in table_field_schemas - ] - - def decode(self, value): - value = json.loads(value.decode('utf-8')) - return self._decode_with_schema(value, self.fields) - - def _decode_with_schema(self, value, schema_fields): - for field in schema_fields: - if field.name not in value: - # The field exists in the schema, but it doesn't exist in this row. - # It probably means its value was null, as the extract to JSON job - # doesn't preserve null fields - value[field.name] = None - continue - - if field.type == 'RECORD': - nested_values = value[field.name] - if field.mode == 'REPEATED': - for i, nested_value in enumerate(nested_values): - nested_values[i] = self._decode_with_schema( - nested_value, field.fields) - else: - value[field.name] = self._decode_with_schema( - nested_values, field.fields) - else: - try: - converter = self._converters[field.type] - value[field.name] = converter(value[field.name]) - except KeyError: - # No need to do any conversion - pass - return value - - def is_deterministic(self): - return True - - def to_type_hint(self): - return dict - - class _CustomBigQuerySource(BoundedSource): def __init__( self, @@ -720,7 +694,7 @@ def __init__( self.bigquery_job_labels = bigquery_job_labels or {} self.use_json_exports = use_json_exports self.temp_dataset = temp_dataset - self._job_name = job_name or 'AUTOMATIC_JOB_NAME' + self._job_name = job_name or 'BQ_EXPORT_JOB' self._step_name = step_name self._source_uuid = unique_id @@ -1153,6 +1127,11 @@ def __init__( self.test_client = test_client self.create_disposition = create_disposition self.write_disposition = write_disposition + if write_disposition in (BigQueryDisposition.WRITE_EMPTY, + BigQueryDisposition.WRITE_TRUNCATE): + raise ValueError( + 'Write disposition %s is not supported for' + ' streaming inserts to BigQuery' % write_disposition) self._rows_buffer = [] self._reset_rows_buffer() @@ -1666,7 +1645,7 @@ def _compute_method(self, experiments, is_streaming_pipeline): def expand(self, pcoll): p = pcoll.pipeline - if (isinstance(self.table_reference, bigquery.TableReference) and + if (isinstance(self.table_reference, TableReference) and self.table_reference.projectId is None): self.table_reference.projectId = pcoll.pipeline.options.view_as( GoogleCloudOptions).project @@ -1878,6 +1857,7 @@ class ReadFromBigQuery(PTransform): https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-avro\ #avro_conversions """ + COUNTER = 0 def __init__(self, gcs_location=None, *args, **kwargs): @@ -1897,7 +1877,7 @@ def __init__(self, gcs_location=None, *args, **kwargs): self._kwargs = kwargs def expand(self, pcoll): - unique_id = str(uuid.uuid4())[0:10] + # TODO(BEAM-11115): Make ReadFromBQ rely on ReadAllFromBQ implementation. temp_location = pcoll.pipeline.options.view_as( GoogleCloudOptions).temp_location job_name = pcoll.pipeline.options.view_as(GoogleCloudOptions).job_name @@ -1931,3 +1911,132 @@ def file_path_to_remove(unused_elm): *self._args, **self._kwargs)) | _PassThroughThenCleanup(files_to_remove_pcoll)) + + +class ReadFromBigQueryRequest: + """ + Class that defines data to read from BQ. + """ + def __init__( + self, + query: str = None, + use_standard_sql: bool = True, + table: Union[str, TableReference] = None, + flatten_results: bool = False): + """ + Only one of query or table should be specified. + + :param query: SQL query to fetch data. + :param use_standard_sql: + Specifies whether to use BigQuery's standard SQL dialect for this query. + The default value is :data:`True`. If set to :data:`False`, + the query will use BigQuery's legacy SQL dialect. + This parameter is ignored for table inputs. + :param table: + The ID of the table to read. The ID must contain only letters + ``a-z``, ``A-Z``, numbers ``0-9``, or underscores ``_``. Table should + define project and dataset (ex.: ``'PROJECT:DATASET.TABLE'``). + :param flatten_results: + Flattens all nested and repeated fields in the query results. + The default value is :data:`False`. + """ + self.flatten_results = flatten_results + self.query = query + self.use_standard_sql = use_standard_sql + self.table = table + self.validate() + + # We use this internal object ID to generate BigQuery export directories. + self.obj_id = random.randint(0, 100000) + + def validate(self): + if self.table is not None and self.query is not None: + raise ValueError( + 'Both a BigQuery table and a query were specified.' + ' Please specify only one of these.') + elif self.table is None and self.query is None: + raise ValueError('A BigQuery table or a query must be specified') + if self.table is not None: + if isinstance(self.table, str): + assert self.table.find('.'), ( + 'Expected a table reference ' + '(PROJECT:DATASET.TABLE or DATASET.TABLE) instead of %s' + % self.table) + + +@experimental() +class ReadAllFromBigQuery(PTransform): + """Read data from BigQuery. + + PTransform:ReadFromBigQueryRequest->Rows + + This PTransform uses a BigQuery export job to take a snapshot of the table + on GCS, and then reads from each produced file. Data is exported into + a new subdirectory for each export using UUIDs generated in + `ReadFromBigQueryRequest` objects. + + It is recommended not to use this PTransform for streaming jobs on + GlobalWindow, since it will not be able to cleanup snapshots. + + Args: + gcs_location (str): The name of the Google Cloud Storage + bucket where the extracted table should be written as a string. If + :data:`None`, then the temp_location parameter is used. + validate (bool): If :data:`True`, various checks will be done when source + gets initialized (e.g., is table present?). + kms_key (str): Experimental. Optional Cloud KMS key name for use when + creating new temporary tables. + """ + COUNTER = 0 + + def __init__( + self, + gcs_location: Union[str, ValueProvider] = None, + validate: bool = False, + kms_key: str = None, + temp_dataset: Union[str, DatasetReference] = None, + bigquery_job_labels: Dict[str, str] = None): + if gcs_location: + if not isinstance(gcs_location, (str, ValueProvider)): + raise TypeError( + '%s: gcs_location must be of type string' + ' or ValueProvider; got %r instead' % + (self.__class__.__name__, type(gcs_location))) + + self.gcs_location = gcs_location + self.validate = validate + self.kms_key = kms_key + self.bigquery_job_labels = bigquery_job_labels + self.temp_dataset = temp_dataset + + def expand(self, pcoll): + job_name = pcoll.pipeline.options.view_as(GoogleCloudOptions).job_name + project = pcoll.pipeline.options.view_as(GoogleCloudOptions).project + unique_id = str(uuid.uuid4())[0:10] + + try: + step_name = self.label + except AttributeError: + step_name = 'ReadAllFromBigQuery_%d' % ReadAllFromBigQuery.COUNTER + ReadAllFromBigQuery.COUNTER += 1 + + sources_to_read, cleanup_locations = ( + pcoll + | beam.ParDo( + _BigQueryReadSplit( + options=pcoll.pipeline.options, + gcs_location=self.gcs_location, + bigquery_job_labels=self.bigquery_job_labels, + job_name=job_name, + step_name=step_name, + unique_id=unique_id, + kms_key=self.kms_key, + project=project, + temp_dataset=self.temp_dataset)).with_outputs( + "location_to_cleanup", main="files_to_read") + ) + + return ( + sources_to_read + | SDFBoundedSourceReader() + | _PassThroughThenCleanup(beam.pvalue.AsIter(cleanup_locations))) diff --git a/sdks/python/apache_beam/io/gcp/bigquery_file_loads.py b/sdks/python/apache_beam/io/gcp/bigquery_file_loads.py index 0342b4c84b70..ae5ebcc03205 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery_file_loads.py +++ b/sdks/python/apache_beam/io/gcp/bigquery_file_loads.py @@ -794,7 +794,7 @@ def _load_data( partitions_direct_to_destination, load_job_name_pcv, copy_job_name_pcv, - singleton_pc, + p, step_name): """Load data to BigQuery @@ -832,7 +832,8 @@ def _load_data( temp_tables_pc = trigger_loads_outputs[TriggerLoadJobs.TEMP_TABLES] destination_copy_job_ids_pc = ( - singleton_pc + p + | "ImpulseMonitorLoadJobs" >> beam.Create([None]) | "WaitForTempTableLoadJobs" >> beam.ParDo( WaitForBQJobs(self.test_client), beam.pvalue.AsList(temp_tables_load_job_ids_pc)) @@ -845,7 +846,8 @@ def _load_data( copy_job_name_pcv)) finished_copy_jobs_pc = ( - singleton_pc + p + | "ImpulseMonitorCopyJobs" >> beam.Create([None]) | "WaitForCopyJobs" >> beam.ParDo( WaitForBQJobs(self.test_client), beam.pvalue.AsList(destination_copy_job_ids_pc))) @@ -879,7 +881,8 @@ def _load_data( *self.schema_side_inputs)) _ = ( - singleton_pc + p + | "ImpulseMonitorDestLoadJobs" >> beam.Create([None]) | "WaitForDestinationLoadJobs" >> beam.ParDo( WaitForBQJobs(self.test_client), beam.pvalue.AsList(destination_load_job_ids_pc))) @@ -964,14 +967,16 @@ def expand(self, pcoll): empty_pc, load_job_name_pcv, copy_job_name_pcv, - singleton_pc, + p, step_name)) else: destination_load_job_ids_pc, destination_copy_job_ids_pc = ( self._load_data(multiple_partitions_per_destination_pc, - single_partition_per_destination_pc, - load_job_name_pcv, copy_job_name_pcv, singleton_pc, - step_name)) + single_partition_per_destination_pc, + load_job_name_pcv, + copy_job_name_pcv, + p, + step_name)) return { self.DESTINATION_JOBID_PAIRS: destination_load_job_ids_pc, diff --git a/sdks/python/apache_beam/io/gcp/bigquery_read_internal.py b/sdks/python/apache_beam/io/gcp/bigquery_read_internal.py index d3a71f1d99a6..256dc64c7f8a 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery_read_internal.py +++ b/sdks/python/apache_beam/io/gcp/bigquery_read_internal.py @@ -20,15 +20,44 @@ NOTHING IN THIS FILE HAS BACKWARDS COMPATIBILITY GUARANTEES. """ +import collections +import decimal +import json import logging +import random import uuid +from typing import TYPE_CHECKING +from typing import Any +from typing import Dict +from typing import Iterable +from typing import List from typing import Optional +from typing import Union import apache_beam as beam +from apache_beam.coders import coders +from apache_beam.io.avroio import _create_avro_source +from apache_beam.io.filesystem import CompressionTypes from apache_beam.io.filesystems import FileSystems +from apache_beam.io.gcp import bigquery_tools +from apache_beam.io.gcp.bigquery_io_metadata import create_bigquery_io_metadata +from apache_beam.io.iobase import BoundedSource +from apache_beam.io.textio import _TextSource +from apache_beam.options.pipeline_options import GoogleCloudOptions +from apache_beam.options.pipeline_options import PipelineOptions from apache_beam.options.value_provider import ValueProvider from apache_beam.transforms import PTransform +if TYPE_CHECKING: + from apache_beam.io.gcp.bigquery import ReadFromBigQueryRequest + +try: + from apache_beam.io.gcp.internal.clients.bigquery import DatasetReference + from apache_beam.io.gcp.internal.clients.bigquery import TableReference +except ImportError: + DatasetReference = None + TableReference = None + _LOGGER = logging.getLogger(__name__) @@ -100,3 +129,263 @@ def process(self, unused_element, unused_signal, gcs_locations): ) return main_output + + +class _BigQueryReadSplit(beam.transforms.DoFn): + """Starts the process of reading from BigQuery. + + This transform will start a BigQuery export job, and output a number of + file sources that are consumed downstream. + """ + def __init__( + self, + options: PipelineOptions, + gcs_location: Union[str, ValueProvider] = None, + use_json_exports: bool = False, + bigquery_job_labels: Dict[str, str] = None, + step_name: str = None, + job_name: str = None, + unique_id: str = None, + kms_key: str = None, + project: str = None, + temp_dataset: Union[str, DatasetReference] = None): + self.options = options + self.use_json_exports = use_json_exports + self.gcs_location = gcs_location + self.bigquery_job_labels = bigquery_job_labels or {} + self._step_name = step_name + self._job_name = job_name or 'BQ_READ_SPLIT' + self._source_uuid = unique_id + self.kms_key = kms_key + self.project = project + self.temp_dataset = temp_dataset or 'bq_read_all_%s' % uuid.uuid4().hex + self.bq_io_metadata = None + + def display_data(self): + return { + 'use_json_exports': str(self.use_json_exports), + 'gcs_location': str(self.gcs_location), + 'bigquery_job_labels': json.dumps(self.bigquery_job_labels), + 'kms_key': str(self.kms_key), + 'project': str(self.project), + 'temp_dataset': str(self.temp_dataset) + } + + def _get_temp_dataset(self): + if isinstance(self.temp_dataset, str): + return DatasetReference( + datasetId=self.temp_dataset, projectId=self._get_project()) + else: + return self.temp_dataset + + def process(self, + element: 'ReadFromBigQueryRequest') -> Iterable[BoundedSource]: + bq = bigquery_tools.BigQueryWrapper( + temp_dataset_id=self._get_temp_dataset().datasetId) + # TODO(BEAM-11359): Clean up temp dataset at pipeline completion. + + if element.query is not None: + self._setup_temporary_dataset(bq, element) + table_reference = self._execute_query(bq, element) + else: + assert element.table + table_reference = bigquery_tools.parse_table_reference( + element.table, project=self._get_project()) + + if not table_reference.projectId: + table_reference.projectId = self._get_project() + + schema, metadata_list = self._export_files(bq, element, table_reference) + + for metadata in metadata_list: + yield self._create_source(metadata.path, schema) + + if element.query is not None: + bq._delete_table( + table_reference.projectId, + table_reference.datasetId, + table_reference.tableId) + + def _get_bq_metadata(self): + if not self.bq_io_metadata: + self.bq_io_metadata = create_bigquery_io_metadata(self._step_name) + return self.bq_io_metadata + + def _create_source(self, path, schema): + if not self.use_json_exports: + return _create_avro_source(path, use_fastavro=True) + else: + return _TextSource( + path, + min_bundle_size=0, + compression_type=CompressionTypes.UNCOMPRESSED, + strip_trailing_newlines=True, + coder=_JsonToDictCoder(schema)) + + def _setup_temporary_dataset( + self, + bq: bigquery_tools.BigQueryWrapper, + element: 'ReadFromBigQueryRequest'): + location = bq.get_query_location( + self._get_project(), element.query, not element.use_standard_sql) + bq.create_temporary_dataset(self._get_project(), location) + + def _execute_query( + self, + bq: bigquery_tools.BigQueryWrapper, + element: 'ReadFromBigQueryRequest'): + query_job_name = bigquery_tools.generate_bq_job_name( + self._job_name, + self._source_uuid, + bigquery_tools.BigQueryJobTypes.QUERY, + random.randint(0, 1000)) + job = bq._start_query_job( + self._get_project(), + element.query, + not element.use_standard_sql, + element.flatten_results, + job_id=query_job_name, + kms_key=self.kms_key, + job_labels=self._get_bq_metadata().add_additional_bq_job_labels( + self.bigquery_job_labels)) + job_ref = job.jobReference + bq.wait_for_bq_job(job_ref, max_retries=0) + return bq._get_temp_table(self._get_project()) + + def _export_files( + self, + bq: bigquery_tools.BigQueryWrapper, + element: 'ReadFromBigQueryRequest', + table_reference: TableReference): + """Runs a BigQuery export job. + + Returns: + bigquery.TableSchema instance, a list of FileMetadata instances + """ + job_labels = self._get_bq_metadata().add_additional_bq_job_labels( + self.bigquery_job_labels) + export_job_name = bigquery_tools.generate_bq_job_name( + self._job_name, + self._source_uuid, + bigquery_tools.BigQueryJobTypes.EXPORT, + element.obj_id) + temp_location = self.options.view_as(GoogleCloudOptions).temp_location + gcs_location = bigquery_export_destination_uri( + self.gcs_location, + temp_location, + '%s%s' % (self._source_uuid, element.obj_id)) + if self.use_json_exports: + job_ref = bq.perform_extract_job([gcs_location], + export_job_name, + table_reference, + bigquery_tools.FileFormat.JSON, + project=self._get_project(), + job_labels=job_labels, + include_header=False) + else: + job_ref = bq.perform_extract_job([gcs_location], + export_job_name, + table_reference, + bigquery_tools.FileFormat.AVRO, + project=self._get_project(), + include_header=False, + job_labels=job_labels, + use_avro_logical_types=True) + bq.wait_for_bq_job(job_ref) + metadata_list = FileSystems.match([gcs_location])[0].metadata_list + + if isinstance(table_reference, ValueProvider): + table_ref = bigquery_tools.parse_table_reference( + element.table, project=self._get_project()) + else: + table_ref = table_reference + table = bq.get_table( + table_ref.projectId, table_ref.datasetId, table_ref.tableId) + + return table.schema, metadata_list + + def _get_project(self): + """Returns the project that queries and exports will be billed to.""" + + project = self.options.view_as(GoogleCloudOptions).project + if isinstance(project, ValueProvider): + project = project.get() + if not project: + project = self.project + return project + + +FieldSchema = collections.namedtuple('FieldSchema', 'fields mode name type') + + +class _JsonToDictCoder(coders.Coder): + """A coder for a JSON string to a Python dict.""" + def __init__(self, table_schema): + self.fields = self._convert_to_tuple(table_schema.fields) + self._converters = { + 'INTEGER': int, + 'INT64': int, + 'FLOAT': float, + 'FLOAT64': float, + 'NUMERIC': self._to_decimal, + 'BYTES': self._to_bytes, + } + + @staticmethod + def _to_decimal(value): + return decimal.Decimal(value) + + @staticmethod + def _to_bytes(value): + """Converts value from str to bytes on Python 3.x. Does nothing on + Python 2.7.""" + return value.encode('utf-8') + + @classmethod + def _convert_to_tuple(cls, table_field_schemas): + """Recursively converts the list of TableFieldSchema instances to the + list of tuples to prevent errors when pickling and unpickling + TableFieldSchema instances. + """ + if not table_field_schemas: + return [] + + return [ + FieldSchema(cls._convert_to_tuple(x.fields), x.mode, x.name, x.type) + for x in table_field_schemas + ] + + def decode(self, value): + value = json.loads(value.decode('utf-8')) + return self._decode_row(value, self.fields) + + def _decode_row(self, row: Dict[str, Any], schema_fields: List[FieldSchema]): + for field in schema_fields: + if field.name not in row: + # The field exists in the schema, but it doesn't exist in this row. + # It probably means its value was null, as the extract to JSON job + # doesn't preserve null fields + row[field.name] = None + continue + + if field.mode == 'REPEATED': + for i, elem in enumerate(row[field.name]): + row[field.name][i] = self._decode_data(elem, field) + else: + row[field.name] = self._decode_data(row[field.name], field) + return row + + def _decode_data(self, obj: Any, field: FieldSchema): + if not field.fields: + try: + return self._converters[field.type](obj) + except KeyError: + # No need to do any conversion + return obj + return self._decode_row(obj, field.fields) + + def is_deterministic(self): + return True + + def to_type_hint(self): + return dict diff --git a/sdks/python/apache_beam/io/gcp/bigquery_read_it_test.py b/sdks/python/apache_beam/io/gcp/bigquery_read_it_test.py index ce82b3174a2b..4586f046f79b 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery_read_it_test.py +++ b/sdks/python/apache_beam/io/gcp/bigquery_read_it_test.py @@ -298,6 +298,109 @@ def test_iobase_source(self): assert_that(result, equal_to(self.get_expected_data(native=False))) +class ReadAllBQTests(BigQueryReadIntegrationTests): + TABLE_DATA_1 = [{ + 'number': 1, 'str': 'abc' + }, { + 'number': 2, 'str': 'def' + }, { + 'number': 3, 'str': u'你好' + }, { + 'number': 4, 'str': u'привет' + }] + + TABLE_DATA_2 = [{ + 'number': 10, 'str': 'abcd' + }, { + 'number': 20, 'str': 'defg' + }, { + 'number': 30, 'str': u'你好' + }, { + 'number': 40, 'str': u'привет' + }] + + TABLE_DATA_3 = [{'number': 10, 'str': 'abcde', 'extra': 3}] + + @classmethod + def setUpClass(cls): + super(ReadAllBQTests, cls).setUpClass() + cls.SCHEMA_BQ = cls.create_bq_schema() + cls.SCHEMA_BQ_WITH_EXTRA = cls.create_bq_schema(True) + + cls.table_name1 = 'python_rd_table_1' + cls.table_schema1 = cls.create_table( + cls.table_name1, cls.TABLE_DATA_1, cls.SCHEMA_BQ) + table_id1 = '{}.{}'.format(cls.dataset_id, cls.table_name1) + cls.query1 = 'SELECT number, str FROM `%s`' % table_id1 + + cls.table_name2 = 'python_rd_table_2' + cls.table_schema2 = cls.create_table( + cls.table_name2, cls.TABLE_DATA_2, cls.SCHEMA_BQ) + table_id2 = '{}.{}'.format(cls.dataset_id, cls.table_name2) + cls.query2 = 'SELECT number, str FROM %s' % table_id2 + + cls.table_name3 = 'python_rd_table_3' + cls.table_schema3 = cls.create_table( + cls.table_name3, cls.TABLE_DATA_3, cls.SCHEMA_BQ_WITH_EXTRA) + table_id3 = '{}.{}'.format(cls.dataset_id, cls.table_name3) + cls.query3 = 'SELECT number, str, extra FROM `%s`' % table_id3 + + @classmethod + def create_table(cls, table_name, data, table_schema): + table = bigquery.Table( + tableReference=bigquery.TableReference( + projectId=cls.project, datasetId=cls.dataset_id, + tableId=table_name), + schema=table_schema) + request = bigquery.BigqueryTablesInsertRequest( + projectId=cls.project, datasetId=cls.dataset_id, table=table) + cls.bigquery_client.client.tables.Insert(request) + cls.bigquery_client.insert_rows( + cls.project, cls.dataset_id, table_name, data) + return table_schema + + @classmethod + def create_bq_schema(cls, with_extra=False): + table_schema = bigquery.TableSchema() + table_field = bigquery.TableFieldSchema() + table_field.name = 'number' + table_field.type = 'INTEGER' + table_field.mode = 'NULLABLE' + table_schema.fields.append(table_field) + table_field = bigquery.TableFieldSchema() + table_field.name = 'str' + table_field.type = 'STRING' + table_field.mode = 'NULLABLE' + table_schema.fields.append(table_field) + if with_extra: + table_field = bigquery.TableFieldSchema() + table_field.name = 'extra' + table_field.type = 'INTEGER' + table_field.mode = 'NULLABLE' + table_schema.fields.append(table_field) + return table_schema + + @skip(['PortableRunner', 'FlinkRunner']) + @attr('IT') + def test_read_queries(self): + # TODO(BEAM-11311): Remove experiment when tests run on r_v2. + args = self.args + ["--experiments=use_runner_v2"] + with beam.Pipeline(argv=args) as p: + result = ( + p + | beam.Create([ + beam.io.ReadFromBigQueryRequest(query=self.query1), + beam.io.ReadFromBigQueryRequest( + query=self.query2, use_standard_sql=False), + beam.io.ReadFromBigQueryRequest( + table='%s.%s' % (self.dataset_id, self.table_name3)) + ]) + | beam.io.ReadAllFromBigQuery()) + assert_that( + result, + equal_to(self.TABLE_DATA_1 + self.TABLE_DATA_2 + self.TABLE_DATA_3)) + + if __name__ == '__main__': logging.getLogger().setLevel(logging.INFO) unittest.main() diff --git a/sdks/python/apache_beam/io/gcp/bigquery_test.py b/sdks/python/apache_beam/io/gcp/bigquery_test.py index da3f34f8c947..fefe461b0467 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery_test.py +++ b/sdks/python/apache_beam/io/gcp/bigquery_test.py @@ -46,9 +46,9 @@ from apache_beam.io.gcp import bigquery_tools from apache_beam.io.gcp.bigquery import TableRowJsonCoder from apache_beam.io.gcp.bigquery import WriteToBigQuery -from apache_beam.io.gcp.bigquery import _JsonToDictCoder from apache_beam.io.gcp.bigquery import _StreamToBigQuery from apache_beam.io.gcp.bigquery_file_loads_test import _ELEMENTS +from apache_beam.io.gcp.bigquery_read_internal import _JsonToDictCoder from apache_beam.io.gcp.bigquery_read_internal import bigquery_export_destination_uri from apache_beam.io.gcp.bigquery_tools import JSON_COMPLIANCE_ERROR from apache_beam.io.gcp.bigquery_tools import BigQueryWrapper @@ -371,6 +371,18 @@ def test_record_and_repeatable_field_is_properly_converted(self): actual = coder.decode(input_row) self.assertEqual(expected_row, actual) + def test_repeatable_field_is_properly_converted(self): + input_row = b'{"repeated": ["55.5", "65.5"], "integer": "10"}' + expected_row = {'repeated': [55.5, 65.5], 'integer': 10} + schema = self._make_schema([ + ('repeated', 'FLOAT', 'REPEATED', []), + ('integer', 'INTEGER', 'NULLABLE', []), + ]) + coder = _JsonToDictCoder(schema) + + actual = coder.decode(input_row) + self.assertEqual(expected_row, actual) + @unittest.skipIf(HttpError is None, 'GCP dependencies are not installed') class TestReadFromBigQuery(unittest.TestCase): @@ -1233,8 +1245,6 @@ def test_streaming_inserts(self): @attr('IT') def test_file_loads(self): - if isinstance(self.test_pipeline.runner, TestDataflowRunner): - self.skipTest('https://issuetracker.google.com/issues/118375066') self._run_pubsub_bq_pipeline( WriteToBigQuery.Method.FILE_LOADS, triggering_frequency=20) diff --git a/sdks/python/apache_beam/io/gcp/bigquery_tools.py b/sdks/python/apache_beam/io/gcp/bigquery_tools.py index da1b7fd42a34..056182992329 100644 --- a/sdks/python/apache_beam/io/gcp/bigquery_tools.py +++ b/sdks/python/apache_beam/io/gcp/bigquery_tools.py @@ -783,7 +783,17 @@ def clean_up_temporary_dataset(self, project_id): return else: raise - self._delete_dataset(temp_table.projectId, temp_table.datasetId, True) + try: + self._delete_dataset(temp_table.projectId, temp_table.datasetId, True) + except HttpError as exn: + if exn.status_code == 403: + _LOGGER.warning( + 'Permission denied to delete temporary dataset %s:%s for clean up', + temp_table.projectId, + temp_table.datasetId) + return + else: + raise @retry.with_exponential_backoff( num_retries=MAX_RETRIES, @@ -914,17 +924,17 @@ def get_or_create_table( # If table exists already then handle the semantics for WRITE_EMPTY and # WRITE_TRUNCATE write dispositions. - if found_table: - table_empty = self._is_table_empty(project_id, dataset_id, table_id) - if (not table_empty and - write_disposition == BigQueryDisposition.WRITE_EMPTY): - raise RuntimeError( - 'Table %s:%s.%s is not empty but write disposition is WRITE_EMPTY.' - % (project_id, dataset_id, table_id)) + if found_table and write_disposition in ( + BigQueryDisposition.WRITE_EMPTY, BigQueryDisposition.WRITE_TRUNCATE): # Delete the table and recreate it (later) if WRITE_TRUNCATE was # specified. if write_disposition == BigQueryDisposition.WRITE_TRUNCATE: self._delete_table(project_id, dataset_id, table_id) + elif (not self._is_table_empty(project_id, dataset_id, table_id) and + write_disposition == BigQueryDisposition.WRITE_EMPTY): + raise RuntimeError( + 'Table %s:%s.%s is not empty but write disposition is WRITE_EMPTY.' + % (project_id, dataset_id, table_id)) # Create a new table potentially reusing the schema from a previously # found table in case the schema was not specified. diff --git a/sdks/python/apache_beam/io/gcp/bigtableio.py b/sdks/python/apache_beam/io/gcp/bigtableio.py index af893e5e8e88..36c886185b5f 100644 --- a/sdks/python/apache_beam/io/gcp/bigtableio.py +++ b/sdks/python/apache_beam/io/gcp/bigtableio.py @@ -39,14 +39,19 @@ from __future__ import absolute_import +import logging + import apache_beam as beam from apache_beam.metrics import Metrics from apache_beam.transforms.display import DisplayDataItem +_LOGGER = logging.getLogger(__name__) + try: from google.cloud.bigtable import Client except ImportError: - pass + _LOGGER.warning( + 'ImportError: from google.cloud.bigtable import Client', exc_info=True) __all__ = ['WriteToBigTable'] diff --git a/sdks/python/apache_beam/io/gcp/pubsub.py b/sdks/python/apache_beam/io/gcp/pubsub.py index 1db7ba9f3346..586f98eb662e 100644 --- a/sdks/python/apache_beam/io/gcp/pubsub.py +++ b/sdks/python/apache_beam/io/gcp/pubsub.py @@ -30,6 +30,8 @@ import re from builtins import object from typing import Any +from typing import List +from typing import NamedTuple from typing import Optional from future.utils import iteritems @@ -39,6 +41,7 @@ from apache_beam.io.iobase import Read from apache_beam.io.iobase import Write from apache_beam.runners.dataflow.native_io import iobase as dataflow_io +from apache_beam.transforms import Flatten from apache_beam.transforms import Map from apache_beam.transforms import PTransform from apache_beam.transforms.display import DisplayDataItem @@ -50,7 +53,9 @@ pubsub = None __all__ = [ + 'MultipleReadFromPubSub', 'PubsubMessage', + 'PubSubSourceDescriptor', 'ReadFromPubSub', 'ReadStringsFromPubSub', 'WriteStringsToPubSub', @@ -247,16 +252,12 @@ def __init__(self, topic): topic: Cloud Pub/Sub topic in the form "/topics//". """ super(_WriteStringsToPubSub, self).__init__() - self.with_attributes = False - self.id_label = None - self.timestamp_attribute = None - self.project, self.topic_name = parse_topic(topic) - self._sink = _PubSubSink(topic, id_label=None, timestamp_attribute=None) + self.topic = topic def expand(self, pcoll): pcoll = pcoll | 'EncodeString' >> Map(lambda s: s.encode('utf-8')) pcoll.element_type = bytes - return pcoll | Write(self._sink) + return pcoll | WriteToPubSub(self.topic) class WriteToPubSub(PTransform): @@ -453,3 +454,112 @@ def format(self): def writer(self): raise NotImplementedError + + +class PubSubSourceDescriptor(NamedTuple): + """A PubSub source descriptor for ``MultipleReadFromPubSub``` + + Attributes: + source: Existing Cloud Pub/Sub topic or subscription to use in the + form "projects//topics/" or + "projects//subscriptions/" + id_label: The attribute on incoming Pub/Sub messages to use as a unique + record identifier. When specified, the value of this attribute (which + can be any string that uniquely identifies the record) will be used for + deduplication of messages. If not provided, we cannot guarantee + that no duplicate data will be delivered on the Pub/Sub stream. In this + case, deduplication of the stream will be strictly best effort. + timestamp_attribute: Message value to use as element timestamp. If None, + uses message publishing time as the timestamp. + + Timestamp values should be in one of two formats: + + - A numerical value representing the number of milliseconds since the + Unix epoch. + - A string in RFC 3339 format, UTC timezone. Example: + ``2015-10-29T23:41:41.123Z``. The sub-second component of the + timestamp is optional, and digits beyond the first three (i.e., time + units smaller than milliseconds) may be ignored. + """ + source: str + id_label: str = None + timestamp_attribute: str = None + + +PUBSUB_DESCRIPTOR_REGEXP = 'projects/([^/]+)/(topics|subscriptions)/(.+)' + + +class MultipleReadFromPubSub(PTransform): + """A ``PTransform`` that expands ``ReadFromPubSub`` to read from multiple + ``PubSubSourceDescriptor``. + + The `MultipleReadFromPubSub` transform allows you to read multiple topics + and/or subscriptions using just one transform. It is the recommended transform + to read multiple Pub/Sub sources when the output `PCollection` are going to be + flattened. The transform takes a list of `PubSubSourceDescriptor` and organize + them by type (topic / subscription) and project::: + + topic_1 = PubSubSourceDescriptor('projects/myproject/topics/a_topic') + topic_2 = PubSubSourceDescriptor( + 'projects/myproject2/topics/b_topic', + 'my_label', + 'my_timestamp_attribute') + subscription_1 = PubSubSourceDescriptor( + 'projects/myproject/subscriptions/a_subscription') + + results = pipeline | MultipleReadFromPubSub( + [topic_1, topic_2, subscription_1]) + """ + def __init__( + self, + pubsub_source_descriptors, # type: List[PubSubSourceDescriptor] + with_attributes=False, # type: bool + ): + """Initializes ``PubSubMultipleReader``. + + Args: + pubsub_source_descriptors: List of Cloud Pub/Sub topics or subscriptions + of type `~PubSubSourceDescriptor`. + with_attributes: + True - input elements will be :class:`~PubsubMessage` objects. + False - input elements will be of type ``bytes`` (message data only). + """ + self.pubsub_source_descriptors = pubsub_source_descriptors + self.with_attributes = with_attributes + + for descriptor in self.pubsub_source_descriptors: + match_descriptor = re.match(PUBSUB_DESCRIPTOR_REGEXP, descriptor.source) + + if not match_descriptor: + raise ValueError( + 'PubSub source descriptor must be in the form "projects/' + '/topics/" or "projects//subscription' + '/" (got %r).' % descriptor.source) + + def expand(self, pcol): + sources_pcol = [] + for descriptor in self.pubsub_source_descriptors: + source_match = re.match(PUBSUB_DESCRIPTOR_REGEXP, descriptor.source) + source_project = source_match.group(1) + source_type = source_match.group(2) + source_name = source_match.group(3) + + read_step_name = 'PubSub %s/project:%s/Read %s' % ( + source_type, source_project, source_name) + + if source_type == 'topics': + current_source = pcol | read_step_name >> ReadFromPubSub( + topic=descriptor.source, + id_label=descriptor.id_label, + with_attributes=self.with_attributes, + timestamp_attribute=descriptor.timestamp_attribute) + else: + current_source = pcol | read_step_name >> ReadFromPubSub( + subscription=descriptor.source, + id_label=descriptor.id_label, + with_attributes=self.with_attributes, + timestamp_attribute=descriptor.timestamp_attribute) + + sources_pcol.append(current_source) + + return tuple(sources_pcol) | Flatten() diff --git a/sdks/python/apache_beam/io/gcp/pubsub_test.py b/sdks/python/apache_beam/io/gcp/pubsub_test.py index 0ffe1058f04e..8207f483a0ab 100644 --- a/sdks/python/apache_beam/io/gcp/pubsub_test.py +++ b/sdks/python/apache_beam/io/gcp/pubsub_test.py @@ -34,7 +34,9 @@ import apache_beam as beam from apache_beam.io import Read from apache_beam.io import Write +from apache_beam.io.gcp.pubsub import MultipleReadFromPubSub from apache_beam.io.gcp.pubsub import PubsubMessage +from apache_beam.io.gcp.pubsub import PubSubSourceDescriptor from apache_beam.io.gcp.pubsub import ReadFromPubSub from apache_beam.io.gcp.pubsub import ReadStringsFromPubSub from apache_beam.io.gcp.pubsub import WriteStringsToPubSub @@ -222,6 +224,127 @@ def test_expand_with_other_options(self): self.assertEqual('time', source.timestamp_attribute) +@unittest.skipIf(pubsub is None, 'GCP dependencies are not installed') +class TestMultiReadFromPubSubOverride(unittest.TestCase): + def test_expand_with_multiple_sources(self): + options = PipelineOptions([]) + options.view_as(StandardOptions).streaming = True + p = TestPipeline(options=options) + topics = [ + 'projects/fakeprj/topics/a_topic', 'projects/fakeprj2/topics/b_topic' + ] + subscriptions = ['projects/fakeprj/subscriptions/a_subscription'] + + pubsub_sources = [ + PubSubSourceDescriptor(descriptor) + for descriptor in topics + subscriptions + ] + pcoll = (p | MultipleReadFromPubSub(pubsub_sources) | beam.Map(lambda x: x)) + + # Apply the necessary PTransformOverrides. + overrides = _get_transform_overrides(options) + p.replace_all(overrides) + + self.assertEqual(bytes, pcoll.element_type) + + # Ensure that the sources are passed through correctly + read_transforms = pcoll.producer.inputs[0].producer.inputs + topics_list = [] + subscription_list = [] + for read_transform in read_transforms: + source = read_transform.producer.transform._source + if source.full_topic: + topics_list.append(source.full_topic) + else: + subscription_list.append(source.full_subscription) + self.assertEqual(topics_list, topics) + self.assertEqual(subscription_list, subscriptions) + + def test_expand_with_multiple_sources_and_attributes(self): + options = PipelineOptions([]) + options.view_as(StandardOptions).streaming = True + p = TestPipeline(options=options) + topics = [ + 'projects/fakeprj/topics/a_topic', 'projects/fakeprj2/topics/b_topic' + ] + subscriptions = ['projects/fakeprj/subscriptions/a_subscription'] + + pubsub_sources = [ + PubSubSourceDescriptor(descriptor) + for descriptor in topics + subscriptions + ] + pcoll = ( + p | MultipleReadFromPubSub(pubsub_sources, with_attributes=True) + | beam.Map(lambda x: x)) + + # Apply the necessary PTransformOverrides. + overrides = _get_transform_overrides(options) + p.replace_all(overrides) + + self.assertEqual(PubsubMessage, pcoll.element_type) + + # Ensure that the sources are passed through correctly + read_transforms = pcoll.producer.inputs[0].producer.inputs + topics_list = [] + subscription_list = [] + for read_transform in read_transforms: + source = read_transform.producer.transform._source + if source.full_topic: + topics_list.append(source.full_topic) + else: + subscription_list.append(source.full_subscription) + self.assertEqual(topics_list, topics) + self.assertEqual(subscription_list, subscriptions) + + def test_expand_with_multiple_sources_and_other_options(self): + options = PipelineOptions([]) + options.view_as(StandardOptions).streaming = True + p = TestPipeline(options=options) + sources = [ + 'projects/fakeprj/topics/a_topic', + 'projects/fakeprj2/topics/b_topic', + 'projects/fakeprj/subscriptions/a_subscription' + ] + id_labels = ['a_label_topic', 'b_label_topic', 'a_label_subscription'] + timestamp_attributes = ['a_ta_topic', 'b_ta_topic', 'a_ta_subscription'] + + pubsub_sources = [ + PubSubSourceDescriptor( + source=source, + id_label=id_label, + timestamp_attribute=timestamp_attribute) for source, + id_label, + timestamp_attribute in zip(sources, id_labels, timestamp_attributes) + ] + + pcoll = (p | MultipleReadFromPubSub(pubsub_sources) | beam.Map(lambda x: x)) + + # Apply the necessary PTransformOverrides. + overrides = _get_transform_overrides(options) + p.replace_all(overrides) + + self.assertEqual(bytes, pcoll.element_type) + + # Ensure that the sources are passed through correctly + read_transforms = pcoll.producer.inputs[0].producer.inputs + for i, read_transform in enumerate(read_transforms): + id_label = id_labels[i] + timestamp_attribute = timestamp_attributes[i] + + source = read_transform.producer.transform._source + self.assertEqual(source.id_label, id_label) + self.assertEqual(source.with_attributes, False) + self.assertEqual(source.timestamp_attribute, timestamp_attribute) + + def test_expand_with_wrong_source(self): + with self.assertRaisesRegex( + ValueError, + r'PubSub source descriptor must be in the form ' + r'"projects//topics/"' + ' or "projects//subscription/".*'): + MultipleReadFromPubSub([PubSubSourceDescriptor('not_a_proper_source')]) + + @unittest.skipIf(pubsub is None, 'GCP dependencies are not installed') class TestWriteStringsToPubSubOverride(unittest.TestCase): def test_expand_deprecated(self): @@ -706,6 +829,7 @@ def test_write_messages_success(self, mock_pubsub): def test_write_messages_deprecated(self, mock_pubsub): data = 'data' + data_bytes = b'data' payloads = [data] options = PipelineOptions([]) @@ -716,7 +840,7 @@ def test_write_messages_deprecated(self, mock_pubsub): | Create(payloads) | WriteStringsToPubSub('projects/fakeprj/topics/a_topic')) mock_pubsub.return_value.publish.assert_has_calls( - [mock.call(mock.ANY, data)]) + [mock.call(mock.ANY, data_bytes)]) def test_write_messages_with_attributes_success(self, mock_pubsub): data = b'data' diff --git a/sdks/python/apache_beam/io/iobase.py b/sdks/python/apache_beam/io/iobase.py index 5501a8e77ecc..28b98a066ca3 100644 --- a/sdks/python/apache_beam/io/iobase.py +++ b/sdks/python/apache_beam/io/iobase.py @@ -1206,8 +1206,6 @@ class RestrictionTracker(object): See following documents for more details. * https://s.apache.org/splittable-do-fn * https://s.apache.org/splittable-do-fn-python-sdk - - Experimental; no backwards-compatibility guarantees. """ def current_restriction(self): """Returns the current restriction. @@ -1373,10 +1371,7 @@ def observe_timestamp(self, timestamp): class RestrictionProgress(object): - """Used to record the progress of a restriction. - - Experimental; no backwards-compatibility guarantees. - """ + """Used to record the progress of a restriction.""" def __init__(self, **kwargs): # Only accept keyword arguments. self._fraction = kwargs.pop('fraction', None) @@ -1498,7 +1493,8 @@ def __init__(self, restriction): if not isinstance(restriction, _SDFBoundedSourceRestriction): raise ValueError( 'Initializing SDFBoundedSourceRestrictionTracker' - ' requires a _SDFBoundedSourceRestriction') + ' requires a _SDFBoundedSourceRestriction. Got %s instead.' % + restriction) self.restriction = restriction def current_progress(self): @@ -1545,13 +1541,12 @@ def _check_source(self, src): 'SDFBoundedSourceRestrictionProvider can only utilize BoundedSource') def initial_restriction(self, element_source: BoundedSource): - src = element_source - self._check_source(src) - range_tracker = src.get_range_tracker(None, None) + self._check_source(element_source) + range_tracker = element_source.get_range_tracker(None, None) return _SDFBoundedSourceRestriction( SourceBundle( None, - src, + element_source, range_tracker.start_position(), range_tracker.stop_position())) @@ -1615,3 +1610,6 @@ def expand(self, pvalue): def get_windowing(self, unused_inputs): return core.Windowing(window.GlobalWindows()) + + def display_data(self): + return self._data_to_display diff --git a/sdks/python/apache_beam/io/mongodbio.py b/sdks/python/apache_beam/io/mongodbio.py index 392c824b376f..61d8521bf708 100644 --- a/sdks/python/apache_beam/io/mongodbio.py +++ b/sdks/python/apache_beam/io/mongodbio.py @@ -74,6 +74,7 @@ import logging import math import struct +import urllib import apache_beam as beam from apache_beam.io import iobase @@ -260,12 +261,12 @@ def read(self, range_tracker): def display_data(self): res = super(_BoundedMongoSource, self).display_data() - res['uri'] = self.uri + res['uri'] = _mask_uri_password(self.uri) res['database'] = self.db res['collection'] = self.coll res['filter'] = json.dumps(self.filter) res['projection'] = str(self.projection) - res['mongo_client_spec'] = json.dumps(self.spec) + res['mongo_client_spec'] = json.dumps(_mask_spec_password(self.spec)) res['bucket_auto'] = self.bucket_auto return res @@ -564,10 +565,10 @@ def _flush(self): def display_data(self): res = super(_WriteMongoFn, self).display_data() - res['uri'] = self.uri + res['uri'] = _mask_uri_password(self.uri) res['database'] = self.db res['collection'] = self.coll - res['mongo_client_params'] = json.dumps(self.spec) + res['mongo_client_params'] = json.dumps(_mask_spec_password(self.spec)) res['batch_size'] = self.batch_size return res @@ -611,3 +612,23 @@ def __enter__(self): def __exit__(self, exc_type, exc_val, exc_tb): if self.client is not None: self.client.close() + + +def _mask_uri_password(uri): + # Masks password in uri if present + if uri: + components = urllib.parse.urlsplit(uri) + if components.password: + replaced = components._replace( + netloc='{}:{}@{}'.format( + components.username, '******', components.hostname)) + uri = replaced.geturl() + return uri + + +def _mask_spec_password(spec): + # Masks password in spec if present + if spec and 'password' in spec: + spec = spec.copy() + spec['password'] = '******' + return spec diff --git a/sdks/python/apache_beam/io/mongodbio_test.py b/sdks/python/apache_beam/io/mongodbio_test.py index dbcd7001c9d4..353fafb84a1b 100644 --- a/sdks/python/apache_beam/io/mongodbio_test.py +++ b/sdks/python/apache_beam/io/mongodbio_test.py @@ -434,6 +434,28 @@ def test_display_data(self): self.assertTrue('database' in data) self.assertTrue('collection' in data) + def test_display_data_mask_password(self): + # Uri without password + data = self.mongo_source.display_data() + self.assertTrue('uri' in data) + self.assertTrue(data['uri'] == 'mongodb://test') + # Password is masked in the uri if present + mongo_source = _BoundedMongoSource( + 'mongodb+srv://user:password@test.mongodb.net/testdb', + 'testdb', + 'testcoll', + extra_client_params={ + 'user': 'user', 'password': 'password' + }) + data = mongo_source.display_data() + self.assertTrue('uri' in data) + self.assertTrue( + data['uri'] == 'mongodb+srv://user:******@test.mongodb.net/testdb') + # Password is masked in the client spec if present + self.assertTrue('mongo_client_spec' in data) + self.assertTrue( + data['mongo_client_spec'] == '{"user": "user", "password": "******"}') + @parameterized_class(('bucket_auto', ), [(False, ), (True, )]) class ReadFromMongoDBTest(unittest.TestCase): @@ -491,6 +513,25 @@ def test_display_data(self): data = _WriteMongoFn(batch_size=10).display_data() self.assertEqual(10, data['batch_size']) + def test_display_data_mask_password(self): + # Uri without password + data = _WriteMongoFn(uri='mongodb://test').display_data() + self.assertTrue('uri' in data) + self.assertTrue(data['uri'] == 'mongodb://test') + # Password is masked in the uri if present + data = _WriteMongoFn( + uri='mongodb+srv://user:password@test.mongodb.net/testdb', + extra_params={ + 'user': 'user', 'password': 'password' + }).display_data() + self.assertTrue('uri' in data) + self.assertTrue( + data['uri'] == 'mongodb+srv://user:******@test.mongodb.net/testdb') + # Password is masked in the client spec if present + self.assertTrue('mongo_client_params' in data) + self.assertTrue( + data['mongo_client_params'] == '{"user": "user", "password": "******"}') + class MongoSinkTest(unittest.TestCase): @mock.patch('apache_beam.io.mongodbio.MongoClient') diff --git a/sdks/python/apache_beam/io/restriction_trackers.py b/sdks/python/apache_beam/io/restriction_trackers.py index 2420c0b40656..ff7345f08070 100644 --- a/sdks/python/apache_beam/io/restriction_trackers.py +++ b/sdks/python/apache_beam/io/restriction_trackers.py @@ -88,7 +88,7 @@ class OffsetRestrictionTracker(RestrictionTracker): """ def __init__(self, offset_range): # type: (OffsetRange) -> None - assert isinstance(offset_range, OffsetRange) + assert isinstance(offset_range, OffsetRange), offset_range self._range = offset_range self._current_position = None self._last_claim_attempt = None @@ -164,3 +164,20 @@ def try_split(self, fraction_of_remainder): def is_bounded(self): return True + + +class UnsplittableRestrictionTracker(RestrictionTracker): + """An `iobase.RestrictionTracker` that wraps another but does not split.""" + def __init__(self, underling_tracker): + self._underling_tracker = underling_tracker + + def try_split(self, fraction_of_remainder): + return False + + # __getattribute__ is used rather than __getattr__ to override the + # stubs in the baseclass. + def __getattribute__(self, name): + if name.startswith('_') or name in ('try_split', ): + return super(UnsplittableRestrictionTracker, self).__getattribute__(name) + else: + return getattr(self._underling_tracker, name) diff --git a/sdks/python/apache_beam/metrics/cells.pxd b/sdks/python/apache_beam/metrics/cells.pxd index 0204da81e692..0eaa890c02ac 100644 --- a/sdks/python/apache_beam/metrics/cells.pxd +++ b/sdks/python/apache_beam/metrics/cells.pxd @@ -17,11 +17,13 @@ cimport cython cimport libc.stdint +from cpython.datetime cimport datetime cdef class MetricCell(object): cdef object _lock cpdef bint update(self, value) except -1 + cdef datetime _start_time cdef class CounterCell(MetricCell): diff --git a/sdks/python/apache_beam/metrics/cells.py b/sdks/python/apache_beam/metrics/cells.py index a7b793879368..34ce2a45b0ff 100644 --- a/sdks/python/apache_beam/metrics/cells.py +++ b/sdks/python/apache_beam/metrics/cells.py @@ -29,6 +29,7 @@ import threading import time from builtins import object +from datetime import datetime from typing import Any from typing import Optional from typing import SupportsInt @@ -63,6 +64,7 @@ class MetricCell(object): """ def __init__(self): self._lock = threading.Lock() + self._start_time = None def update(self, value): raise NotImplementedError @@ -71,6 +73,13 @@ def get_cumulative(self): raise NotImplementedError def to_runner_api_monitoring_info(self, name, transform_id): + if not self._start_time: + self._start_time = datetime.utcnow() + mi = self.to_runner_api_monitoring_info_impl(name, transform_id) + mi.start_time.FromDatetime(self._start_time) + return mi + + def to_runner_api_monitoring_info_impl(self, name, transform_id): raise NotImplementedError def reset(self): @@ -136,7 +145,7 @@ def get_cumulative(self): with self._lock: return self.value - def to_runner_api_monitoring_info(self, name, transform_id): + def to_runner_api_monitoring_info_impl(self, name, transform_id): from apache_beam.metrics import monitoring_infos if not name.urn: # User counter case. @@ -201,7 +210,7 @@ def get_cumulative(self): with self._lock: return self.data.get_cumulative() - def to_runner_api_monitoring_info(self, name, transform_id): + def to_runner_api_monitoring_info_impl(self, name, transform_id): from apache_beam.metrics import monitoring_infos return monitoring_infos.int64_user_distribution( name.namespace, @@ -251,7 +260,7 @@ def get_cumulative(self): with self._lock: return self.data.get_cumulative() - def to_runner_api_monitoring_info(self, name, transform_id): + def to_runner_api_monitoring_info_impl(self, name, transform_id): from apache_beam.metrics import monitoring_infos return monitoring_infos.int64_user_gauge( name.namespace, diff --git a/sdks/python/apache_beam/metrics/cells_test.py b/sdks/python/apache_beam/metrics/cells_test.py index e9aae5c16fd1..a120d15f7166 100644 --- a/sdks/python/apache_beam/metrics/cells_test.py +++ b/sdks/python/apache_beam/metrics/cells_test.py @@ -28,6 +28,7 @@ from apache_beam.metrics.cells import DistributionData from apache_beam.metrics.cells import GaugeCell from apache_beam.metrics.cells import GaugeData +from apache_beam.metrics.metricbase import MetricName class TestCounterCell(unittest.TestCase): @@ -69,6 +70,14 @@ def test_basic_operations(self): c.inc() self.assertEqual(c.get_cumulative(), -8) + def test_start_time_set(self): + c = CounterCell() + c.inc(2) + + name = MetricName('namespace', 'name1') + mi = c.to_runner_api_monitoring_info(name, 'transform_id') + self.assertGreater(mi.start_time.seconds, 0) + class TestDistributionCell(unittest.TestCase): @classmethod @@ -119,6 +128,14 @@ def test_integer_only(self): d.update(3.3) self.assertEqual(d.get_cumulative(), DistributionData(9, 3, 3, 3)) + def test_start_time_set(self): + d = DistributionCell() + d.update(3.1) + + name = MetricName('namespace', 'name1') + mi = d.to_runner_api_monitoring_info(name, 'transform_id') + self.assertGreater(mi.start_time.seconds, 0) + class TestGaugeCell(unittest.TestCase): def test_basic_operations(self): @@ -146,6 +163,14 @@ def test_combine_appropriately(self): result = g2.combine(g1) self.assertEqual(result.data.value, 1) + def test_start_time_set(self): + g1 = GaugeCell() + g1.set(3) + + name = MetricName('namespace', 'name1') + mi = g1.to_runner_api_monitoring_info(name, 'transform_id') + self.assertGreater(mi.start_time.seconds, 0) + if __name__ == '__main__': unittest.main() diff --git a/sdks/python/apache_beam/metrics/execution.pxd b/sdks/python/apache_beam/metrics/execution.pxd index 3605d82dae4c..6311158ea1a3 100644 --- a/sdks/python/apache_beam/metrics/execution.pxd +++ b/sdks/python/apache_beam/metrics/execution.pxd @@ -41,5 +41,6 @@ cdef class MetricUpdater(object): cdef class MetricsContainer(object): cdef object step_name + cdef object lock cdef public dict metrics cpdef MetricCell get_metric_cell(self, metric_key) diff --git a/sdks/python/apache_beam/metrics/execution.py b/sdks/python/apache_beam/metrics/execution.py index 453be6b6ecb8..e2663d2596b9 100644 --- a/sdks/python/apache_beam/metrics/execution.py +++ b/sdks/python/apache_beam/metrics/execution.py @@ -34,6 +34,7 @@ from __future__ import absolute_import +import threading from builtins import object from typing import TYPE_CHECKING from typing import Any @@ -249,6 +250,7 @@ class MetricsContainer(object): """ def __init__(self, step_name): self.step_name = step_name + self.lock = threading.Lock() self.metrics = dict() # type: Dict[_TypedMetricName, MetricCell] def get_counter(self, metric_name): @@ -273,7 +275,8 @@ def get_metric_cell(self, typed_metric_name): # type: (_TypedMetricName) -> MetricCell cell = self.metrics.get(typed_metric_name, None) if cell is None: - cell = self.metrics[typed_metric_name] = typed_metric_name.cell_type() + with self.lock: + cell = self.metrics[typed_metric_name] = typed_metric_name.cell_type() return cell def get_cumulative(self): @@ -313,10 +316,12 @@ def to_runner_api_monitoring_infos(self, transform_id): # type: (str) -> Dict[FrozenSet, metrics_pb2.MonitoringInfo] """Returns a list of MonitoringInfos for the metrics in this container.""" + with self.lock: + items = list(self.metrics.items()) all_metrics = [ cell.to_runner_api_monitoring_info(key.metric_name, transform_id) for key, - cell in self.metrics.items() + cell in items ] return { monitoring_infos.to_key(mi): mi diff --git a/sdks/python/apache_beam/options/pipeline_options.py b/sdks/python/apache_beam/options/pipeline_options.py index 50060168f81a..5d7ba945b4ca 100644 --- a/sdks/python/apache_beam/options/pipeline_options.py +++ b/sdks/python/apache_beam/options/pipeline_options.py @@ -414,13 +414,30 @@ class StandardOptions(PipelineOptions): DEFAULT_RUNNER = 'DirectRunner' + ALL_KNOWN_RUNNERS = ( + 'apache_beam.runners.dataflow.dataflow_runner.DataflowRunner', + 'apache_beam.runners.direct.direct_runner.BundleBasedDirectRunner', + 'apache_beam.runners.direct.direct_runner.DirectRunner', + 'apache_beam.runners.direct.direct_runner.SwitchingDirectRunner', + 'apache_beam.runners.interactive.interactive_runner.InteractiveRunner', + 'apache_beam.runners.portability.flink_runner.FlinkRunner', + 'apache_beam.runners.portability.portable_runner.PortableRunner', + 'apache_beam.runners.portability.spark_runner.SparkRunner', + 'apache_beam.runners.test.TestDirectRunner', + 'apache_beam.runners.test.TestDataflowRunner', + ) + + KNOWN_RUNNER_NAMES = [path.split('.')[-1] for path in ALL_KNOWN_RUNNERS] + @classmethod def _add_argparse_args(cls, parser): parser.add_argument( '--runner', help=( 'Pipeline runner used to execute the workflow. Valid values are ' - 'DirectRunner, DataflowRunner.')) + 'one of %s, or the fully qualified name of a PipelineRunner ' + 'subclass. If unspecified, defaults to %s.' % + (', '.join(cls.KNOWN_RUNNER_NAMES), cls.DEFAULT_RUNNER))) # Whether to enable streaming mode. parser.add_argument( '--streaming', @@ -1164,18 +1181,34 @@ def _add_argparse_args(cls, parser): parser.add_argument( '--job_port', default=0, + type=int, help='Port to use for the job service. 0 to use a ' 'dynamic port.') parser.add_argument( '--artifact_port', default=0, + type=int, help='Port to use for artifact staging. 0 to use a ' 'dynamic port.') parser.add_argument( '--expansion_port', default=0, + type=int, help='Port to use for artifact staging. 0 to use a ' 'dynamic port.') + parser.add_argument( + '--job_server_java_launcher', + default='java', + help='The Java Application Launcher executable file to use for ' + 'starting a Java job server. If unset, `java` from the ' + 'environment\'s $PATH is used.') + parser.add_argument( + '--job_server_jvm_properties', + '--job_server_jvm_property', + dest='job_server_jvm_properties', + action='append', + default=[], + help='JVM properties to pass to a Java job server.') class FlinkRunnerOptions(PipelineOptions): diff --git a/sdks/python/apache_beam/options/value_provider.py b/sdks/python/apache_beam/options/value_provider.py index fde61c85db77..0fa5f2b5f157 100644 --- a/sdks/python/apache_beam/options/value_provider.py +++ b/sdks/python/apache_beam/options/value_provider.py @@ -15,8 +15,11 @@ # limitations under the License. # -"""A ValueProvider class to implement templates with both statically -and dynamically provided values. +"""A ValueProvider abstracts the notion of fetching a value that may or +may not be currently available. + +This can be used to parameterize transforms that only read values in at +runtime, for example. """ # pytype: skip-file @@ -33,22 +36,38 @@ 'ValueProvider', 'StaticValueProvider', 'RuntimeValueProvider', + 'NestedValueProvider', 'check_accessible', ] class ValueProvider(object): + """Base class that all other ValueProviders must implement. + """ def is_accessible(self): + """Whether the contents of this ValueProvider is available to routines + that run at graph construction time. + """ raise NotImplementedError( 'ValueProvider.is_accessible implemented in derived classes') def get(self): + """Return the value wrapped by this ValueProvider. + """ raise NotImplementedError( 'ValueProvider.get implemented in derived classes') class StaticValueProvider(ValueProvider): + """StaticValueProvider is an implementation of ValueProvider that allows + for a static value to be provided. + """ def __init__(self, value_type, value): + """ + Args: + value_type: Type of the static value + value: Static value + """ self.value_type = value_type self.value = value_type(value) @@ -78,6 +97,10 @@ def __hash__(self): class RuntimeValueProvider(ValueProvider): + """RuntimeValueProvider is an implementation of ValueProvider that + allows for a value to be provided at execution time rather than + at graph construction time. + """ runtime_options = None experiments = set() # type: Set[str] @@ -122,8 +145,50 @@ def __str__(self): repr(self.default_value)) +class NestedValueProvider(ValueProvider): + """NestedValueProvider is an implementation of ValueProvider that allows + for wrapping another ValueProvider object. + """ + def __init__(self, value, translator): + """Creates a NestedValueProvider that wraps the provided ValueProvider. + + Args: + value: ValueProvider object to wrap + translator: function that is applied to the ValueProvider + Raises: + ``RuntimeValueProviderError``: if any of the provided objects are not + accessible. + """ + self.value = value + self.translator = translator + + def is_accessible(self): + return self.value.is_accessible() + + def get(self): + try: + return self.cached_value + except AttributeError: + self.cached_value = self.translator(self.value.get()) + return self.cached_value + + def __str__(self): + return "%s(value: %s, translator: %s)" % ( + self.__class__.__name__, + self.value, + self.translator.__name__, + ) + + def check_accessible(value_provider_list): - """Check accessibility of a list of ValueProvider objects.""" + """A decorator that checks accessibility of a list of ValueProvider objects. + + Args: + value_provider_list: list of ValueProvider objects + Raises: + ``RuntimeValueProviderError``: if any of the provided objects are not + accessible. + """ assert isinstance(value_provider_list, list) def _check_accessible(fnc): diff --git a/sdks/python/apache_beam/options/value_provider_test.py b/sdks/python/apache_beam/options/value_provider_test.py index 52525607cb8e..189501bb9eed 100644 --- a/sdks/python/apache_beam/options/value_provider_test.py +++ b/sdks/python/apache_beam/options/value_provider_test.py @@ -24,8 +24,11 @@ import logging import unittest +from mock import Mock + from apache_beam.options.pipeline_options import DebugOptions from apache_beam.options.pipeline_options import PipelineOptions +from apache_beam.options.value_provider import NestedValueProvider from apache_beam.options.value_provider import RuntimeValueProvider from apache_beam.options.value_provider import StaticValueProvider @@ -218,6 +221,43 @@ def test_experiments_options_setup(self): self.assertIn('b,c', options.experiments) self.assertNotIn('c', options.experiments) + def test_nested_value_provider_wrap_static(self): + vp = NestedValueProvider(StaticValueProvider(int, 1), lambda x: x + 1) + + self.assertTrue(vp.is_accessible()) + self.assertEqual(vp.get(), 2) + + def test_nested_value_provider_caches_value(self): + mock_fn = Mock() + + def translator(x): + mock_fn() + return x + + vp = NestedValueProvider(StaticValueProvider(int, 1), translator) + + vp.get() + self.assertEqual(mock_fn.call_count, 1) + vp.get() + self.assertEqual(mock_fn.call_count, 1) + + def test_nested_value_provider_wrap_runtime(self): + class UserDefinedOptions(PipelineOptions): + @classmethod + def _add_argparse_args(cls, parser): + parser.add_value_provider_argument( + '--vpt_vp_arg15', + help='This keyword argument is a value provider') # set at runtime + + options = UserDefinedOptions([]) + vp = NestedValueProvider(options.vpt_vp_arg15, lambda x: x + x) + self.assertFalse(vp.is_accessible()) + + RuntimeValueProvider.set_runtime_options({'vpt_vp_arg15': 'abc'}) + + self.assertTrue(vp.is_accessible()) + self.assertEqual(vp.get(), 'abcabc') + if __name__ == '__main__': logging.getLogger().setLevel(logging.INFO) diff --git a/sdks/python/apache_beam/pipeline.py b/sdks/python/apache_beam/pipeline.py index 0b70d0803732..7f3162fc000f 100644 --- a/sdks/python/apache_beam/pipeline.py +++ b/sdks/python/apache_beam/pipeline.py @@ -52,7 +52,6 @@ import abc import logging import os -import re import shutil import sys import tempfile @@ -72,7 +71,6 @@ from typing import Union from future.utils import with_metaclass -from past.builtins import unicode from apache_beam import pvalue from apache_beam.internal import pickler @@ -89,9 +87,6 @@ from apache_beam.runners import create_runner from apache_beam.transforms import ParDo from apache_beam.transforms import ptransform -from apache_beam.transforms.core import RunnerAPIPTransformHolder -from apache_beam.transforms.sideinputs import SIDE_INPUT_PREFIX -from apache_beam.transforms.sideinputs import SIDE_INPUT_REGEX from apache_beam.transforms.sideinputs import get_sideinput_index from apache_beam.typehints import TypeCheckError from apache_beam.typehints import typehints @@ -228,6 +223,9 @@ def __init__(self, runner=None, options=None, argv=None): # full pipeline proto. self.component_id_map = ComponentIdMap() + # Records whether this pipeline contains any external transforms. + self.contains_external_transforms = False + @property # type: ignore[misc] # decorated property not supported @deprecated( @@ -500,6 +498,10 @@ def run(self, test_runner_api='AUTO'): """Runs the pipeline. Returns whatever our runner returns after running.""" + # Records whether this pipeline contains any cross-language transforms. + self.contains_external_transforms = ( + ExternalTransformFinder.contains_external_transforms(self)) + try: if test_runner_api == 'AUTO': # Don't pay the cost of a round-trip if we're going to be going through @@ -509,10 +511,15 @@ def run(self, test_runner_api='AUTO'): self.runner.__class__.__name__ == 'SwitchingDirectRunner' and not self._options.view_as(StandardOptions).streaming) + # Multi-language pipelines that contain external pipeline segments may + # not be able to create a Python pipeline object graph. Hence following + # runner API check should be skipped for such pipelines. + # The InteractiveRunner relies on a constant pipeline reference, skip # it. test_runner_api = ( not is_fnapi_compatible and + not self.contains_external_transforms and self.runner.__class__.__name__ != 'InteractiveRunner') # When possible, invoke a round trip through the runner API. @@ -520,8 +527,7 @@ def run(self, test_runner_api='AUTO'): return Pipeline.from_runner_api( self.to_runner_api(use_fake_coders=True), self.runner, - self._options, - allow_proto_holders=True).run(False) + self._options).run(False) if (self._options.view_as(TypeOptions).runtime_type_check and self._options.view_as(TypeOptions).performance_runtime_type_check): @@ -883,7 +889,6 @@ def from_runner_api( runner, # type: PipelineRunner options, # type: PipelineOptions return_context=False, # type: bool - allow_proto_holders=False # type: bool ): # type: (...) -> Pipeline @@ -891,9 +896,7 @@ def from_runner_api( p = Pipeline(runner=runner, options=options) from apache_beam.runners import pipeline_context context = pipeline_context.PipelineContext( - proto.components, - allow_proto_holders=allow_proto_holders, - requirements=proto.requirements) + proto.components, requirements=proto.requirements) if proto.root_transform_ids: root_transform_id, = proto.root_transform_ids p.transforms_stack = [context.transforms.get_by_id(root_transform_id)] @@ -962,6 +965,26 @@ def leave_composite_transform(self, transform_node): pass +class ExternalTransformFinder(PipelineVisitor): + """Looks for any external transforms in the pipeline and if found records + it. + """ + def __init__(self): + self._contains_external_transforms = False + + @staticmethod + def contains_external_transforms(pipeline): + visitor = ExternalTransformFinder() + pipeline.visit(visitor) + return visitor._contains_external_transforms + + def visit_transform(self, transform_node): + # type: (AppliedPTransform) -> None + from apache_beam.transforms import ExternalTransform + if isinstance(transform_node.transform, ExternalTransform): + self._contains_external_transforms = True + + class AppliedPTransform(object): """For internal use only; no backwards-compatibility guarantees. @@ -975,7 +998,6 @@ def __init__( full_label, # type: str inputs, # type: Optional[Sequence[Union[pvalue.PBegin, pvalue.PCollection]]] environment_id=None, # type: Optional[str] - input_tags_to_preserve=None, # type: Dict[pvalue.PCollection, str] ): # type: (...) -> None self.parent = parent @@ -992,7 +1014,6 @@ def __init__( self.outputs = {} # type: Dict[Union[str, int, None], pvalue.PValue] self.parts = [] # type: List[AppliedPTransform] self.environment_id = environment_id if environment_id else None # type: Optional[str] - self.input_tags_to_preserve = input_tags_to_preserve or {} def __repr__(self): # type: () -> str @@ -1112,24 +1133,19 @@ def visit( def named_inputs(self): # type: () -> Dict[str, pvalue.PValue] # TODO(BEAM-1833): Push names up into the sdk construction. - main_inputs = { - str(ix): input - for ix, - input in enumerate(self.inputs) - if isinstance(input, pvalue.PCollection) - } - side_inputs = {(SIDE_INPUT_PREFIX + '%s') % ix: si.pvalue - for (ix, si) in enumerate(self.side_inputs)} - return dict(main_inputs, **side_inputs) + if self.transform is None: + assert not self.inputs and not self.side_inputs + return {} + else: + return self.transform._named_inputs(self.inputs, self.side_inputs) def named_outputs(self): # type: () -> Dict[str, pvalue.PCollection] - return { - try_unicode(tag): output - for tag, - output in self.outputs.items() - if isinstance(output, pvalue.PCollection) - } + if self.transform is None: + assert not self.outputs + return {} + else: + return self.transform._named_outputs(self.outputs) def to_runner_api(self, context): # type: (PipelineContext) -> beam_runner_api_pb2.PTransform @@ -1166,12 +1182,6 @@ def transform_to_runner_api( (transform_urn not in Pipeline.runner_implemented_transforms())): environment_id = context.default_environment_id() - def _maybe_preserve_tag(new_tag, pc, input_tags_to_preserve): - # TODO(BEAM-1833): remove this after we update Python SDK and - # DataflowRunner to construct pipelines using runner API. - return input_tags_to_preserve[ - pc] if pc in input_tags_to_preserve else new_tag - return beam_runner_api_pb2.PTransform( unique_name=self.full_label, spec=transform_spec, @@ -1180,9 +1190,9 @@ def _maybe_preserve_tag(new_tag, pc, input_tags_to_preserve): for part in self.parts ], inputs={ - _maybe_preserve_tag(tag, pc, self.input_tags_to_preserve): - context.pcollections.get_id(pc) - for (tag, pc) in sorted(self.named_inputs().items()) + tag: context.pcollections.get_id(pc) + for tag, + pc in sorted(self.named_inputs().items()) }, outputs={ tag: context.pcollections.get_id(out) @@ -1216,68 +1226,22 @@ def from_runner_api( id in proto.inputs.items() if tag not in side_input_tags ] - def is_python_side_input(tag): - # type: (str) -> bool - # As per named_inputs() above. - return re.match(SIDE_INPUT_REGEX, tag) - - uses_python_sideinput_tags = ( - is_python_side_input(side_input_tags[0]) if side_input_tags else False) - transform = ptransform.PTransform.from_runner_api(proto, context) - if uses_python_sideinput_tags: - # Ordering is important here. - # TODO(BEAM-9635): use key, value pairs instead of depending on tags with - # index as a suffix. - indexed_side_inputs = [ - (get_sideinput_index(tag), context.pcollections.get_by_id(id)) - for tag, - id in proto.inputs.items() if tag in side_input_tags - ] - side_inputs = [si for _, si in sorted(indexed_side_inputs)] - else: - # These must be set in the same order for subsequent zip to work. - side_inputs = [] - transform_side_inputs = [] - - for tag, id in proto.inputs.items(): - if tag in side_input_tags: - pc = context.pcollections.get_by_id(id) - side_inputs.append(pc) - assert pardo_payload # This must be a ParDo with side inputs. - side_input_from_pardo = pardo_payload.side_inputs[tag] - - # TODO(BEAM-1833): use 'pvalue.SideInputData.from_runner_api' here - # when that is updated to better represent runner API. - if (common_urns.side_inputs.MULTIMAP.urn == - side_input_from_pardo.access_pattern.urn): - transform_side_inputs.append(pvalue.AsMultiMap(pc)) - elif (common_urns.side_inputs.ITERABLE.urn == - side_input_from_pardo.access_pattern.urn): - transform_side_inputs.append(pvalue.AsIter(pc)) - else: - raise ValueError( - 'Unsupported side input access pattern %r' % - side_input_from_pardo.access_pattern.urn) - if transform: - transform.side_inputs = transform_side_inputs - - if isinstance(transform, RunnerAPIPTransformHolder): - # For external transforms that are ParDos, we have to preserve input tags. - input_tags_to_preserve = { - context.pcollections.get_by_id(id): tag - for (tag, id) in proto.inputs.items() - } - else: - input_tags_to_preserve = {} + # Ordering is important here. + # TODO(BEAM-9635): use key, value pairs instead of depending on tags with + # index as a suffix. + indexed_side_inputs = [ + (get_sideinput_index(tag), context.pcollections.get_by_id(id)) for tag, + id in proto.inputs.items() if tag in side_input_tags + ] + side_inputs = [si for _, si in sorted(indexed_side_inputs)] result = AppliedPTransform( parent=None, transform=transform, full_label=proto.unique_name, inputs=main_inputs, - environment_id=proto.environment_id, - input_tags_to_preserve=input_tags_to_preserve) + environment_id=proto.environment_id) if result.transform and result.transform.side_inputs: for si, pcoll in zip(result.transform.side_inputs, side_inputs): @@ -1295,9 +1259,6 @@ def is_python_side_input(tag): } # This annotation is expected by some runners. if proto.spec.urn == common_urns.primitives.PAR_DO.urn: - # TODO(BEAM-9168): Figure out what to do for RunnerAPIPTransformHolder. - assert isinstance(result.transform, (ParDo, RunnerAPIPTransformHolder)),\ - type(result.transform) result.transform.output_tags = set(proto.outputs.keys()).difference( {'None'}) if not result.parts: @@ -1414,15 +1375,3 @@ def _unique_ref(self, obj=None, obj_type=None, label=None): obj_type.__name__, label or type(obj).__name__, self._counters[obj_type]) - - -if sys.version_info >= (3, ): - try_unicode = str - -else: - - def try_unicode(s): - try: - return unicode(s) - except UnicodeDecodeError: - return str(s).decode('ascii', 'replace') diff --git a/sdks/python/apache_beam/portability/common_urns.py b/sdks/python/apache_beam/portability/common_urns.py index 819264d2096f..e3563197c649 100644 --- a/sdks/python/apache_beam/portability/common_urns.py +++ b/sdks/python/apache_beam/portability/common_urns.py @@ -42,6 +42,7 @@ composites = StandardPTransforms.Composites combine_components = StandardPTransforms.CombineComponents sdf_components = StandardPTransforms.SplittableParDoComponents +group_into_batches_components = StandardPTransforms.GroupIntoBatchesComponents side_inputs = StandardSideInputTypes.Enum coders = StandardCoders.Enum diff --git a/sdks/python/apache_beam/runners/common.pxd b/sdks/python/apache_beam/runners/common.pxd index 05f7a99ad153..08de4b9c332f 100644 --- a/sdks/python/apache_beam/runners/common.pxd +++ b/sdks/python/apache_beam/runners/common.pxd @@ -44,6 +44,7 @@ cdef class MethodWrapper(object): cdef object restriction_provider_arg_name cdef object watermark_estimator_provider cdef object watermark_estimator_provider_arg_name + cdef object dynamic_timer_tag_arg_name cdef bint unbounded_per_element diff --git a/sdks/python/apache_beam/runners/common.py b/sdks/python/apache_beam/runners/common.py index f4c57cef845f..745cbc15051a 100644 --- a/sdks/python/apache_beam/runners/common.py +++ b/sdks/python/apache_beam/runners/common.py @@ -198,6 +198,7 @@ def __init__(self, obj_to_invoke, method_name): self.restriction_provider_arg_name = None self.watermark_estimator_provider = None self.watermark_estimator_provider_arg_name = None + self.dynamic_timer_tag_arg_name = None if hasattr(self.method_value, 'unbounded_per_element'): self.unbounded_per_element = True @@ -218,11 +219,14 @@ def __init__(self, obj_to_invoke, method_name): elif core.DoFn.KeyParam == v: self.key_arg_name = kw elif isinstance(v, core.DoFn.RestrictionParam): - self.restriction_provider = v.restriction_provider + self.restriction_provider = v.restriction_provider or obj_to_invoke self.restriction_provider_arg_name = kw elif isinstance(v, core.DoFn.WatermarkEstimatorParam): - self.watermark_estimator_provider = v.watermark_estimator_provider + self.watermark_estimator_provider = ( + v.watermark_estimator_provider or obj_to_invoke) self.watermark_estimator_provider_arg_name = kw + elif core.DoFn.DynamicTimerTagParam == v: + self.dynamic_timer_tag_arg_name = kw # Create NoOpWatermarkEstimatorProvider if there is no # WatermarkEstimatorParam provided. @@ -230,7 +234,13 @@ def __init__(self, obj_to_invoke, method_name): self.watermark_estimator_provider = NoOpWatermarkEstimatorProvider() def invoke_timer_callback( - self, user_state_context, key, window, timestamp, pane_info): + self, + user_state_context, + key, + window, + timestamp, + pane_info, + dynamic_timer_tag): # TODO(ccy): support side inputs. kwargs = {} if self.has_userstate_arguments: @@ -246,6 +256,8 @@ def invoke_timer_callback( kwargs[self.window_arg_name] = window if self.key_arg_name: kwargs[self.key_arg_name] = key + if self.dynamic_timer_tag_arg_name: + kwargs[self.dynamic_timer_tag_arg_name] = dynamic_timer_tag if kwargs: return self.method_value(**kwargs) @@ -526,12 +538,18 @@ def invoke_teardown(self): """ self.signature.teardown_lifecycle_method.method_value() - def invoke_user_timer(self, timer_spec, key, window, timestamp, pane_info): + def invoke_user_timer( + self, timer_spec, key, window, timestamp, pane_info, dynamic_timer_tag): # self.output_processor is Optional, but in practice it won't be None here self.output_processor.process_outputs( WindowedValue(None, timestamp, (window, )), self.signature.timer_methods[timer_spec].invoke_timer_callback( - self.user_state_context, key, window, timestamp, pane_info)) + self.user_state_context, + key, + window, + timestamp, + pane_info, + dynamic_timer_tag)) def invoke_create_watermark_estimator(self, estimator_state): return self.signature.create_watermark_estimator_method.method_value( @@ -699,6 +717,14 @@ def invoke_process(self, residuals = [] if self.is_splittable: + if restriction is None: + # This may be a SDF invoked as an ordinary DoFn on runners that don't + # understand SDF. See, e.g. BEAM-11472. + # In this case, processing the element is simply processing it against + # the entire initial restriction. + restriction = self.signature.initial_restriction_method.method_value( + windowed_value.value) + with self.splitting_lock: self.current_windowed_value = windowed_value self.restriction = restriction @@ -1233,10 +1259,11 @@ def current_element_progress(self): assert isinstance(self.do_fn_invoker, PerWindowInvoker) return self.do_fn_invoker.current_element_progress() - def process_user_timer(self, timer_spec, key, window, timestamp, pane_info): + def process_user_timer( + self, timer_spec, key, window, timestamp, pane_info, dynamic_timer_tag): try: self.do_fn_invoker.invoke_user_timer( - timer_spec, key, window, timestamp, pane_info) + timer_spec, key, window, timestamp, pane_info, dynamic_timer_tag) except BaseException as exn: self._reraise_augmented(exn) diff --git a/sdks/python/apache_beam/runners/dataflow/dataflow_runner.py b/sdks/python/apache_beam/runners/dataflow/dataflow_runner.py index 06853f47202d..1edcee067b13 100644 --- a/sdks/python/apache_beam/runners/dataflow/dataflow_runner.py +++ b/sdks/python/apache_beam/runners/dataflow/dataflow_runner.py @@ -44,7 +44,6 @@ import apache_beam as beam from apache_beam import coders from apache_beam import error -from apache_beam import pvalue from apache_beam.internal import pickler from apache_beam.internal.gcp import json_value from apache_beam.options.pipeline_options import DebugOptions @@ -66,7 +65,6 @@ from apache_beam.runners.runner import PipelineState from apache_beam.runners.runner import PValueCache from apache_beam.transforms import window -from apache_beam.transforms.core import RunnerAPIPTransformHolder from apache_beam.transforms.display import DisplayData from apache_beam.transforms.sideinputs import SIDE_INPUT_PREFIX from apache_beam.typehints import typehints @@ -302,30 +300,6 @@ def visit_transform(self, transform_node): return GroupByKeyInputVisitor() - @staticmethod - def _set_pdone_visitor(pipeline): - # Imported here to avoid circular dependencies. - from apache_beam.pipeline import PipelineVisitor - - class SetPDoneVisitor(PipelineVisitor): - def __init__(self, pipeline): - self._pipeline = pipeline - - @staticmethod - def _maybe_fix_output(transform_node, pipeline): - if not transform_node.outputs: - pval = pvalue.PDone(pipeline) - pval.producer = transform_node - transform_node.outputs = {None: pval} - - def enter_composite_transform(self, transform_node): - SetPDoneVisitor._maybe_fix_output(transform_node, self._pipeline) - - def visit_transform(self, transform_node): - SetPDoneVisitor._maybe_fix_output(transform_node, self._pipeline) - - return SetPDoneVisitor(pipeline) - @staticmethod def side_input_visitor(use_unified_worker=False, use_fn_api=False): # Imported here to avoid circular dependencies. @@ -505,7 +479,11 @@ def run_pipeline(self, pipeline, options): pipeline.replace_all(DataflowRunner._PTRANSFORM_OVERRIDES) from apache_beam.runners.dataflow.ptransform_overrides import WriteToBigQueryPTransformOverride - pipeline.replace_all([WriteToBigQueryPTransformOverride(pipeline, options)]) + from apache_beam.runners.dataflow.ptransform_overrides import GroupIntoBatchesWithShardedKeyPTransformOverride + pipeline.replace_all([ + WriteToBigQueryPTransformOverride(pipeline, options), + GroupIntoBatchesWithShardedKeyPTransformOverride(self, options) + ]) if use_fnapi and not apiclient._use_unified_worker(options): pipeline.replace_all(DataflowRunner._JRH_PTRANSFORM_OVERRIDES) @@ -533,29 +511,24 @@ def run_pipeline(self, pipeline, options): self.proto_pipeline, self.proto_context = pipeline.to_runner_api( return_context=True, default_environment=self._default_environment) - if use_fnapi: - self._check_for_unsupported_fnapi_features(self.proto_pipeline) - - # Cross language transform require using a pipeline object constructed - # from the full pipeline proto to make sure that expanded version of - # external transforms are reflected in the Pipeline job graph. - # TODO(chamikara): remove following pipeline and pipeline proto recreation - # after portable job submission path is fully in place. - from apache_beam import Pipeline - pipeline = Pipeline.from_runner_api( + # Optimize the pipeline if it not streaming and the + # disable_optimize_pipeline_for_dataflow experiment has not been set. + if (not options.view_as(StandardOptions).streaming and + not options.view_as(DebugOptions).lookup_experiment( + "disable_optimize_pipeline_for_dataflow")): + from apache_beam.runners.portability.fn_api_runner import translations + self.proto_pipeline = translations.optimize_pipeline( self.proto_pipeline, - pipeline.runner, - options, - allow_proto_holders=True) - - # Pipelines generated from proto do not have output set to PDone set for - # leaf elements. - pipeline.visit(self._set_pdone_visitor(pipeline)) - - # We need to generate a new context that maps to the new pipeline object. - self.proto_pipeline, self.proto_context = pipeline.to_runner_api( - return_context=True, default_environment=self._default_environment) + phases=[ + translations.eliminate_common_key_with_none, + translations.pack_combiners, + translations.sort_stages, + ], + known_runner_urns=frozenset(), + partial=True) + if use_fnapi: + self._check_for_unsupported_fnapi_features(self.proto_pipeline) else: # Performing configured PTransform overrides which should not be reflected # in the proto representation of the graph. @@ -576,6 +549,12 @@ def run_pipeline(self, pipeline, options): debug_options.add_experiment( 'min_cpu_platform=' + worker_options.min_cpu_platform) + if (apiclient._use_unified_worker(options) and + pipeline.contains_external_transforms): + # All Dataflow multi-language pipelines (supported by Runner v2 only) use + # portable job submission by default. + debug_options.add_experiment("use_portable_job_submission") + # Elevate "enable_streaming_engine" to pipeline option, but using the # existing experiment. google_cloud_options = options.view_as(GoogleCloudOptions) @@ -698,8 +677,6 @@ def _get_side_input_encoding(self, input_encoding): def _get_encoded_output_coder( self, transform_node, window_value=True, output_tag=None): """Returns the cloud encoding of the coder for the output of a transform.""" - is_external_transform = isinstance( - transform_node.transform, RunnerAPIPTransformHolder) if output_tag in transform_node.outputs: element_type = transform_node.outputs[output_tag].element_type @@ -707,10 +684,7 @@ def _get_encoded_output_coder( output_tag = DataflowRunner._only_element(transform_node.outputs.keys()) # TODO(robertwb): Handle type hints for multi-output transforms. element_type = transform_node.outputs[output_tag].element_type - elif is_external_transform: - raise ValueError( - 'For external transforms, output_tag must be specified ' - 'since we cannot fallback to a Python only coder.') + else: # TODO(silviuc): Remove this branch (and assert) when typehints are # propagated everywhere. Returning an 'Any' as type hint will trigger @@ -727,6 +701,18 @@ def _get_encoded_output_coder( window_coder = None return self._get_typehint_based_encoding(element_type, window_coder) + def get_pcoll_with_auto_sharding(self): + if not hasattr(self, '_pcoll_with_auto_sharding'): + return set() + return self._pcoll_with_auto_sharding + + def add_pcoll_with_auto_sharding(self, applied_ptransform): + if not hasattr(self, '_pcoll_with_auto_sharding'): + self.__setattr__('_pcoll_with_auto_sharding', set()) + output = DataflowRunner._only_element(applied_ptransform.outputs.keys()) + self._pcoll_with_auto_sharding.add( + applied_ptransform.outputs[output]._unique_name()) + def _add_step(self, step_kind, step_label, transform_node, side_tags=()): """Creates a Step object and adds it to the cache.""" # Import here to avoid adding the dependency for local running scenarios. @@ -737,19 +723,15 @@ def _add_step(self, step_kind, step_label, transform_node, side_tags=()): step.add_property(PropertyNames.USER_NAME, step_label) # Cache the node/step association for the main output of the transform node. - # Main output key of external transforms can be ambiguous, so we only tag if - # there's only one tag instead of None. - output_tag = ( - DataflowRunner._only_element(transform_node.outputs.keys()) if len( - transform_node.outputs.keys()) == 1 else None) + # External transforms may not use 'None' as an output tag. + output_tags = ([None] + + list(side_tags) if None in transform_node.outputs.keys() else + list(transform_node.outputs.keys())) - self._cache.cache_output(transform_node, output_tag, step) - # If side_tags is not () then this is a multi-output transform node and we - # need to cache the (node, tag, step) for each of the tags used to access - # the outputs. This is essential because the keys used to search in the - # cache always contain the tag. - for tag in side_tags: - self._cache.cache_output(transform_node, tag, step) + # We have to cache output for all tags since some transforms may produce + # multiple outputs. + for output_tag in output_tags: + self._cache.cache_output(transform_node, output_tag, step) # Finally, we add the display data items to the pipeline step. # If the transform contains no display data then an empty list is added. @@ -876,12 +858,6 @@ def _verify_gbk_coders(self, transform, pcoll): parent = pcoll.producer if parent: - # Skip the check because we can assume that any x-lang transform is - # properly formed (the onus is on the expansion service to construct - # transforms correctly). - if isinstance(parent.transform, RunnerAPIPTransformHolder): - return - coder = parent.transform._infer_output_coder() # pylint: disable=protected-access if not coder: coder = self._get_coder(pcoll.element_type or typehints.Any, None) @@ -923,35 +899,32 @@ def run_GroupByKey(self, transform_node, options): PropertyNames.SERIALIZED_FN, self.serialize_windowing_strategy(windowing, self._default_environment)) - def run_RunnerAPIPTransformHolder(self, transform_node, options): - """Adding Dataflow runner job description for transform holder objects. + def run_ExternalTransform(self, transform_node, options): + # Adds a dummy step to the Dataflow job description so that inputs and + # outputs are mapped correctly in the presence of external transforms. + # + # Note that Dataflow Python multi-language pipelines use Portable Job + # Submission by default, hence this step and rest of the Dataflow step + # definitions defined here are not used at Dataflow service but we have to + # maintain the mapping correctly till we can fully drop the Dataflow step + # definitions from the SDK. + + # AppliedTransform node outputs have to be updated to correctly map the + # outputs for external transforms. + transform_node.outputs = ({ + output.tag: output + for output in transform_node.outputs.values() + }) - These holder transform objects are generated for some of the transforms that - become available after a cross-language transform expansion, usually if the - corresponding transform object cannot be generated in Python SDK (for - example, a python `ParDo` transform cannot be generated without a serialized - Python `DoFn` object). - """ - urn = transform_node.transform.proto().urn - assert urn - # TODO(chamikara): support other transforms that requires holder objects in - # Python SDk. - if common_urns.primitives.PAR_DO.urn == urn: - self.run_ParDo(transform_node, options) - else: - raise NotImplementedError( - '%s uses unsupported URN: %s' % (transform_node.full_label, urn)) + self.run_Impulse(transform_node, options) def run_ParDo(self, transform_node, options): transform = transform_node.transform input_tag = transform_node.inputs[0].tag input_step = self._cache.get_pvalue(transform_node.inputs[0]) - is_external_transform = isinstance(transform, RunnerAPIPTransformHolder) - # Attach side inputs. si_dict = {} - all_input_labels = transform_node.input_tags_to_preserve si_labels = {} full_label_counts = defaultdict(int) lookup_label = lambda side_pval: si_labels[side_pval] @@ -961,13 +934,10 @@ def run_ParDo(self, transform_node, options): assert isinstance(side_pval, AsSideInput) step_name = 'SideInput-' + self._get_unique_step_name() si_label = ((SIDE_INPUT_PREFIX + '%d-%s') % - (ix, transform_node.full_label) - if side_pval.pvalue not in all_input_labels else - all_input_labels[side_pval.pvalue]) + (ix, transform_node.full_label)) old_label = (SIDE_INPUT_PREFIX + '%d') % ix - if not is_external_transform: - label_renames[old_label] = si_label + label_renames[old_label] = si_label assert old_label in named_inputs pcollection_label = '%s.%s' % ( @@ -1068,7 +1038,7 @@ def run_ParDo(self, transform_node, options): # external transforms, we leave tags unmodified. # # Python SDK uses 'None' as the tag of the main output. - main_output_tag = (all_output_tags[0] if is_external_transform else 'None') + main_output_tag = 'None' step.encoding = self._get_encoded_output_coder( transform_node, output_tag=main_output_tag) @@ -1106,12 +1076,24 @@ def run_ParDo(self, transform_node, options): self._get_cloud_encoding(restriction_coder)) if options.view_as(StandardOptions).streaming: - is_stateful_dofn = ( - transform.is_pardo_with_stateful_dofn if is_external_transform else - DoFnSignature(transform.dofn).is_stateful_dofn()) + is_stateful_dofn = (DoFnSignature(transform.dofn).is_stateful_dofn()) if is_stateful_dofn: step.add_property(PropertyNames.USES_KEYED_STATE, 'true') + # Also checks whether the step allows shardable keyed states. + # TODO(BEAM-11360): remove this when migrated to portable job + # submission since we only consider supporting the property in runner + # v2. + for pcoll in transform_node.outputs.values(): + if pcoll._unique_name() in self.get_pcoll_with_auto_sharding(): + step.add_property(PropertyNames.ALLOWS_SHARDABLE_STATE, 'true') + # Currently we only allow auto-sharding to be enabled through the + # GroupIntoBatches transform. So we also add the following property + # which GroupIntoBatchesDoFn has, to allow the backend to perform + # graph optimization. + step.add_property(PropertyNames.PRESERVES_KEYS, 'true') + break + @staticmethod def _pardo_fn_data(transform_node, get_label): transform = transform_node.transform diff --git a/sdks/python/apache_beam/runners/dataflow/dataflow_runner_test.py b/sdks/python/apache_beam/runners/dataflow/dataflow_runner_test.py index 8d645403ee19..655429077adc 100644 --- a/sdks/python/apache_beam/runners/dataflow/dataflow_runner_test.py +++ b/sdks/python/apache_beam/runners/dataflow/dataflow_runner_test.py @@ -48,6 +48,7 @@ from apache_beam.runners import create_runner from apache_beam.runners.dataflow.dataflow_runner import DataflowPipelineResult from apache_beam.runners.dataflow.dataflow_runner import DataflowRuntimeException +from apache_beam.runners.dataflow.dataflow_runner import PropertyNames from apache_beam.runners.dataflow.internal.clients import dataflow as dataflow_api from apache_beam.runners.runner import PipelineState from apache_beam.testing.extra_assertions import ExtraAssertionsMixin @@ -787,6 +788,67 @@ def teardown(self, *args, **kwargs): except ValueError: self.fail('ValueError raised unexpectedly') + def _run_group_into_batches_and_get_step_properties( + self, with_sharded_key, additional_properties): + self.default_properties.append('--streaming') + self.default_properties.append( + '--experiment=enable_streaming_auto_sharding') + for property in additional_properties: + self.default_properties.append(property) + + runner = DataflowRunner() + with beam.Pipeline(runner=runner, + options=PipelineOptions(self.default_properties)) as p: + # pylint: disable=expression-not-assigned + input = p | beam.Create([('a', 1), ('a', 1), ('b', 3), ('b', 4)]) + if with_sharded_key: + ( + input | beam.GroupIntoBatches.WithShardedKey(2) + | beam.Map(lambda key_values: (key_values[0].key, key_values[1]))) + step_name = ( + u'WithShardedKey/GroupIntoBatches/ParDo(_GroupIntoBatchesDoFn)') + else: + input | beam.GroupIntoBatches(2) + step_name = u'GroupIntoBatches/ParDo(_GroupIntoBatchesDoFn)' + + return self._find_step(runner.job, step_name)['properties'] + + def test_group_into_batches_translation(self): + properties = self._run_group_into_batches_and_get_step_properties( + True, ['--enable_streaming_engine', '--experiment=use_runner_v2']) + self.assertEqual(properties[PropertyNames.USES_KEYED_STATE], u'true') + self.assertEqual(properties[PropertyNames.ALLOWS_SHARDABLE_STATE], u'true') + self.assertEqual(properties[PropertyNames.PRESERVES_KEYS], u'true') + + def test_group_into_batches_translation_non_se(self): + properties = self._run_group_into_batches_and_get_step_properties( + True, ['--experiment=use_runner_v2']) + self.assertEqual(properties[PropertyNames.USES_KEYED_STATE], u'true') + self.assertNotIn(PropertyNames.ALLOWS_SHARDABLE_STATE, properties) + self.assertNotIn(PropertyNames.PRESERVES_KEYS, properties) + + def test_group_into_batches_translation_non_sharded(self): + properties = self._run_group_into_batches_and_get_step_properties( + False, ['--enable_streaming_engine', '--experiment=use_runner_v2']) + self.assertEqual(properties[PropertyNames.USES_KEYED_STATE], u'true') + self.assertNotIn(PropertyNames.ALLOWS_SHARDABLE_STATE, properties) + self.assertNotIn(PropertyNames.PRESERVES_KEYS, properties) + + def test_group_into_batches_translation_non_unified_worker(self): + # non-portable + properties = self._run_group_into_batches_and_get_step_properties( + True, ['--enable_streaming_engine']) + self.assertEqual(properties[PropertyNames.USES_KEYED_STATE], u'true') + self.assertNotIn(PropertyNames.ALLOWS_SHARDABLE_STATE, properties) + self.assertNotIn(PropertyNames.PRESERVES_KEYS, properties) + + # JRH + properties = self._run_group_into_batches_and_get_step_properties( + True, ['--enable_streaming_engine', '--experiment=beam_fn_api']) + self.assertEqual(properties[PropertyNames.USES_KEYED_STATE], u'true') + self.assertNotIn(PropertyNames.ALLOWS_SHARDABLE_STATE, properties) + self.assertNotIn(PropertyNames.PRESERVES_KEYS, properties) + class CustomMergingWindowFn(window.WindowFn): def assign(self, assign_context): diff --git a/sdks/python/apache_beam/runners/dataflow/internal/names.py b/sdks/python/apache_beam/runners/dataflow/internal/names.py index 79ef7c16a49e..47698c365478 100644 --- a/sdks/python/apache_beam/runners/dataflow/internal/names.py +++ b/sdks/python/apache_beam/runners/dataflow/internal/names.py @@ -41,10 +41,10 @@ # Update this version to the next version whenever there is a change that will # require changes to legacy Dataflow worker execution environment. -BEAM_CONTAINER_VERSION = 'beam-master-20201116' +BEAM_CONTAINER_VERSION = 'beam-master-20201214' # Update this version to the next version whenever there is a change that # requires changes to SDK harness container or SDK harness launcher. -BEAM_FNAPI_CONTAINER_VERSION = 'beam-master-20201116' +BEAM_FNAPI_CONTAINER_VERSION = 'beam-master-20201214' DATAFLOW_CONTAINER_IMAGE_REPOSITORY = 'gcr.io/cloud-dataflow/v1beta3' @@ -69,6 +69,8 @@ class PropertyNames(object): Property strings as they are expected in the CloudWorkflow protos. """ + # If uses_keyed_state, whether the state can be sharded. + ALLOWS_SHARDABLE_STATE = 'allows_shardable_state' BIGQUERY_CREATE_DISPOSITION = 'create_disposition' BIGQUERY_DATASET = 'dataset' BIGQUERY_EXPORT_FORMAT = 'bigquery_export_format' @@ -98,6 +100,9 @@ class PropertyNames(object): OUTPUT_NAME = 'output_name' PARALLEL_INPUT = 'parallel_input' PIPELINE_PROTO_TRANSFORM_ID = 'pipeline_proto_transform_id' + # If the input element is a key/value pair, then the output element(s) all + # have the same key as the input. + PRESERVES_KEYS = 'preserves_keys' PUBSUB_ID_LABEL = 'pubsub_id_label' PUBSUB_SERIALIZED_ATTRIBUTES_FN = 'pubsub_serialized_attributes_fn' PUBSUB_SUBSCRIPTION = 'pubsub_subscription' diff --git a/sdks/python/apache_beam/runners/dataflow/ptransform_overrides.py b/sdks/python/apache_beam/runners/dataflow/ptransform_overrides.py index f91c016a82ff..402a4ed4e32a 100644 --- a/sdks/python/apache_beam/runners/dataflow/ptransform_overrides.py +++ b/sdks/python/apache_beam/runners/dataflow/ptransform_overrides.py @@ -22,6 +22,7 @@ from __future__ import absolute_import from apache_beam.options.pipeline_options import DebugOptions +from apache_beam.options.pipeline_options import GoogleCloudOptions from apache_beam.options.pipeline_options import StandardOptions from apache_beam.pipeline import PTransformOverride @@ -329,3 +330,47 @@ def expand(self, pcoll): return {key: out for key in self.outputs} return WriteToBigQuery(ptransform, self.outputs) + + +class GroupIntoBatchesWithShardedKeyPTransformOverride(PTransformOverride): + """A ``PTransformOverride`` for ``GroupIntoBatches.WithShardedKey``. + + This override simply returns the original transform but additionally records + the output PCollection in order to append required step properties during + graph translation. + """ + def __init__(self, dataflow_runner, options): + self.dataflow_runner = dataflow_runner + self.options = options + + def matches(self, applied_ptransform): + # Imported here to avoid circular dependencies. + # pylint: disable=wrong-import-order, wrong-import-position + from apache_beam import util + + transform = applied_ptransform.transform + + if not isinstance(transform, util.GroupIntoBatches.WithShardedKey): + return False + + # The replacement is only valid for portable Streaming Engine jobs with + # runner v2. + standard_options = self.options.view_as(StandardOptions) + if not standard_options.streaming: + return False + google_cloud_options = self.options.view_as(GoogleCloudOptions) + if not google_cloud_options.enable_streaming_engine: + return False + + from apache_beam.runners.dataflow.internal import apiclient + if not apiclient._use_unified_worker(self.options): + return False + experiments = self.options.view_as(DebugOptions).experiments or [] + if 'enable_streaming_auto_sharding' not in experiments: + return False + + self.dataflow_runner.add_pcoll_with_auto_sharding(applied_ptransform) + return True + + def get_replacement_transform_for_applied_ptransform(self, ptransform): + return ptransform.transform diff --git a/sdks/python/apache_beam/runners/direct/direct_runner.py b/sdks/python/apache_beam/runners/direct/direct_runner.py index f57166073c67..d71cc9e85ba9 100644 --- a/sdks/python/apache_beam/runners/direct/direct_runner.py +++ b/sdks/python/apache_beam/runners/direct/direct_runner.py @@ -472,9 +472,7 @@ def get_replacement_transform_for_applied_ptransform( class WriteToPubSubOverride(PTransformOverride): def matches(self, applied_ptransform): - return isinstance( - applied_ptransform.transform, - (beam_pubsub.WriteToPubSub, beam_pubsub._WriteStringsToPubSub)) + return isinstance(applied_ptransform.transform, beam_pubsub.WriteToPubSub) def get_replacement_transform_for_applied_ptransform( self, applied_ptransform): diff --git a/sdks/python/apache_beam/runners/direct/direct_userstate.py b/sdks/python/apache_beam/runners/direct/direct_userstate.py index a6fcccea651a..689ebcf92e5d 100644 --- a/sdks/python/apache_beam/runners/direct/direct_userstate.py +++ b/sdks/python/apache_beam/runners/direct/direct_userstate.py @@ -206,8 +206,7 @@ def __init__(self, step_context, dofn, key_coder): self.dofn = dofn self.key_coder = key_coder - self.all_state_specs, self.all_timer_specs = ( - userstate.get_dofn_specs(dofn)) + self.all_state_specs, self.all_timer_specs = userstate.get_dofn_specs(dofn) self.state_tags = {} for state_spec in self.all_state_specs: state_key = 'user/%s' % state_spec.name @@ -226,12 +225,14 @@ def __init__(self, step_context, dofn, key_coder): self.cached_states = {} self.cached_timers = {} - def get_timer(self, timer_spec, key, window, timestamp, pane): + def get_timer( + self, timer_spec: userstate.TimerSpec, key, window, timestamp, + pane) -> userstate.RuntimeTimer: assert timer_spec in self.all_timer_specs encoded_key = self.key_coder.encode(key) cache_key = (encoded_key, window, timer_spec) if cache_key not in self.cached_timers: - self.cached_timers[cache_key] = userstate.RuntimeTimer(timer_spec) + self.cached_timers[cache_key] = userstate.RuntimeTimer() return self.cached_timers[cache_key] def get_state(self, state_spec, key, window): @@ -291,16 +292,22 @@ def commit(self): encoded_key, window, timer_spec = cache_key state = self.step_context.get_keyed_state(encoded_key) timer_name = 'user/%s' % timer_spec.name - if runtime_timer._cleared: - state.clear_timer(window, timer_name, timer_spec.time_domain) - if runtime_timer._new_timestamp is not None: - # TODO(ccy): add corresponding watermark holds after the DirectRunner - # allows for keyed watermark holds. - state.set_timer( - window, - timer_name, - timer_spec.time_domain, - runtime_timer._new_timestamp) + for dynamic_timer_tag, timer in runtime_timer._timer_recordings.items(): + if timer.cleared: + state.clear_timer( + window, + timer_name, + timer_spec.time_domain, + dynamic_timer_tag=dynamic_timer_tag) + if timer.timestamp: + # TODO(ccy): add corresponding watermark holds after the DirectRunner + # allows for keyed watermark holds. + state.set_timer( + window, + timer_name, + timer_spec.time_domain, + timer.timestamp, + dynamic_timer_tag=dynamic_timer_tag) def reset(self): for state in self.cached_states.values(): diff --git a/sdks/python/apache_beam/runners/direct/transform_evaluator.py b/sdks/python/apache_beam/runners/direct/transform_evaluator.py index 8a695183489e..cfc6831e538e 100644 --- a/sdks/python/apache_beam/runners/direct/transform_evaluator.py +++ b/sdks/python/apache_beam/runners/direct/transform_evaluator.py @@ -311,7 +311,10 @@ def process_timer_wrapper(self, timer_firing): """ state = self._step_context.get_keyed_state(timer_firing.encoded_key) state.clear_timer( - timer_firing.window, timer_firing.name, timer_firing.time_domain) + timer_firing.window, + timer_firing.name, + timer_firing.time_domain, + dynamic_timer_tag=timer_firing.dynamic_timer_tag) self.process_timer(timer_firing) def process_timer(self, timer_firing): @@ -875,7 +878,8 @@ def process_timer(self, timer_firing): timer_firing.window, timer_firing.timestamp, # TODO Add paneinfo to timer_firing in DirectRunner - None) + None, + timer_firing.dynamic_timer_tag) def process_element(self, element): self.runner.process(element) diff --git a/sdks/python/apache_beam/runners/direct/util.py b/sdks/python/apache_beam/runners/direct/util.py index 045a2ce55f24..77d2fbb79ddb 100644 --- a/sdks/python/apache_beam/runners/direct/util.py +++ b/sdks/python/apache_beam/runners/direct/util.py @@ -61,16 +61,28 @@ def __init__( class TimerFiring(object): """A single instance of a fired timer.""" - def __init__(self, encoded_key, window, name, time_domain, timestamp): + def __init__( + self, + encoded_key, + window, + name, + time_domain, + timestamp, + dynamic_timer_tag=''): self.encoded_key = encoded_key self.window = window self.name = name self.time_domain = time_domain self.timestamp = timestamp + self.dynamic_timer_tag = dynamic_timer_tag def __repr__(self): - return 'TimerFiring({!r}, {!r}, {}, {})'.format( - self.encoded_key, self.name, self.time_domain, self.timestamp) + return 'TimerFiring({!r}, {!r}, {}, {}, {})'.format( + self.encoded_key, + self.name, + self.time_domain, + self.timestamp, + self.dynamic_timer_tag) class KeyedWorkItem(object): diff --git a/sdks/python/apache_beam/runners/direct/watermark_manager.py b/sdks/python/apache_beam/runners/direct/watermark_manager.py index 7c4590c3bd48..4d66123f37fa 100644 --- a/sdks/python/apache_beam/runners/direct/watermark_manager.py +++ b/sdks/python/apache_beam/runners/direct/watermark_manager.py @@ -325,8 +325,14 @@ def extract_transform_timers(self): if had_realtime_timer: has_realtime_timer = True for expired in timers: - window, (name, time_domain, timestamp) = expired + window, (name, time_domain, timestamp, dynamic_timer_tag) = expired fired_timers.append( - TimerFiring(encoded_key, window, name, time_domain, timestamp)) + TimerFiring( + encoded_key, + window, + name, + time_domain, + timestamp, + dynamic_timer_tag=dynamic_timer_tag)) self._fired_timers.update(fired_timers) return fired_timers, has_realtime_timer diff --git a/sdks/python/apache_beam/runners/interactive/testing/integration/goldens/Linux/7a35f487b2a5f3a9b9852a8659eeb4bd.png b/sdks/python/apache_beam/runners/interactive/testing/integration/goldens/Linux/7a35f487b2a5f3a9b9852a8659eeb4bd.png index 412d3cdd3790f78f6c9a3a0ac780dd896d157501..6f3f325aef6aeb99366d3a970503726dc172e3aa 100644 GIT binary patch literal 703677 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 z≶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 ?8{AFNqdecP#g_oa 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 z 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 z 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 literal 700548 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

    @NbY^4=haujIc+NRosLuik~lH0 zt7zCC{Dy7`t*zLTr52dV89?Z2t7{x?pYLaP<&BJXIFF1B4lJMsC{`KCRe4#>uZx;1aUZYz!)~6Wkk?n5zVlDn{_Y4r)je!QJhk?Z zeW=Pw=TvgEey`aP5$cc}HwnH|EZnN2^NW>FW~p)pHn7r@bW0Pb@9W7sOF+0w&qe8s zs*Tg=WJYzF|EQ^za$Zhnp6>R&yiRVrBhfGPlMgd^B$ldN@#9WC*GknYIKBmr8 z!+>U?a3DI%{Px2W)k!y+@KlcY_;@X)7(*PcR_Dz(Mxx%eeU_7+Ke#Fy*=A2M@v7wD zjiPLg^!E0CBF=eI!LZD|sBg5Wt_d1rrD1brMt^AevafL1V|eny^rySZvk|cS*)52C zmn|c1hgqW}W2s5ht*`i$J|&<&Oc4TV(fJ929Lj;5V`;#)KT&s!{_oAusF=4>6I&Hc z%qHpr^)3AUo|-{+4DVow;ghqmJ&f-gDVW&`w)l`c!m)uXGLVD?fQ z^%9Qh&OuO2=6uT2FiHq!(N|J0zTq3s=?kQ#r^&2f@9Fj;cc{2x8MF85cArxCaAkub zs@>1FgQmPe8wB+(PXk591uG4-`7O&Roi-lyQkZiV&_~^51?q4!0tUru_G*5)tVq=* zBJ>vU*cvkEC34E<2VT3p*s=x2?qAnJnrg}Q@Qq^X%w`1v{AY_tiT_dE6)&$b-t&q@ z9>&c9Ko_2#27ZPyed`DvF?k-~yFAh)V}3ql=jj;``4RFLIr;B!nOC3EzW@Hb>(e+A zVe|V9s&K#1RNP} z6VWM14xRp2IXnV!nS|&%uN#JWj~R3JNiK&*gj|LCTYUz~>5b#CJcoWLGq*4{Hn+vs z%iyzj{nAx~v~efye*C7B>xdn>Yi1qbFH*A}VOH&EN{{mLFFkcBjhB6^qIy3m$wFnI zHZg-)yR&;{w|x3Q1NBaA)y1VYd3LnCJXa!D$avvpF6HMl+2Q}DeFqn3Ih6cd#)pOn zAMA%->j>+zaRDYsh)ZNgRr~t;y99eoBNq4K8h7=pq&tLxHT>~Y3j~r=9NS2>v6JC# zN%kBW%~`2V9`kRtTVBGb_G__}ugy3^e%k)A5rMPFW=Oh|UJ-f@qviB` zZ!iJ)j_51_V-zVqUiC?%Dz|hsshUk;L6w|BR6mMFN73HQk1Dksp0Ln}?vfY_%MJP# z!Ku~#c?~+7r{FsVjGij2#1!|}s`ENe`Sw2x%;+%J1avJJd+11?w^do8f>N1i&L<-y ziv2nBUB`0T_QS+3HxWbO@siQ>#W$5p6vX)^>Tx0rh>us}y zTA#W|*h77{YRUhnVi|O$nV|8pFXiPM@}JkDg~m9CIdZGXCLB%`1PpDy=(kl}(FKKi zs05UFy7KDUN9>1>WcF8NO5anYVSH$iOJML(6eE<6nc2J8<7g^nMj%$dAVr32Q%{=O7-0_bZUQ$Cs87INNLRp-xlIj>a4?7KGNT%&^bWKr%Hif34w zAmQTJcdNdZ#TR-mj?`djXmQNA z=)SH$COKC^LddSHKR|Q6>e7-?E}k2v`AqY>uZ@d?|M$w&sIJ-Ns?}~@Qg7&{xnT~2 zu`vfur{(8|Oc`n{I2Nva-AvQmD!aQ;d{>RUI@FGakh!64BhXwGgB zmQ%SC^q8yn#dXEf;xd<&<&{id;gTR>MGFCGP)rQHunew7$^10~+gGR5%$O&<(& zK)f|ZIf)Ty5YkyBuG>)8H`8YdpPaTb&sET0ncw2r^AN^K`Kwpo1eg0hdJy4>~93VI?y$YJckQqs~z|r1GLx@(mgf zHj0~mvG{eM%Enu$nc-xn;j&D+QEz|ijalg9#||9!df&bkeJfHN%mha=_j24yjXG$gQ0&6j0g=Kqm9`HN(_$(vcDk(1xYZ1!N-|i z*YfochaajElbd`!(Txa@%g{<7Q0EK#c*&8SkC*Z)$(8w)xAvHe1$!XVd4}`9?Jmm? z-H3qK{~S>xIbH+eONKhvIrpW%QUN^D*43`I8nhE0c-!t)(L+ucb7=gme~nPTy(fI| zp0g&PYm?b$o)3-kaL8QRibxA6v_DiUhiAdFr2lOC=|jk(|IPa1WNa@1pV0vVGLRtY zmCRf&BWmIAEw>{lg@q2kdzs0GMFS@N@Fw#QWkXecc?zaNhnBfHZAH#NOXI(v%gkIR z5fix66i|b_2Keu+B-a^0pzFzgx=!IZ`eqlOX-6qnuW)nl_SXE!>UF3_b$vQgQyEEc zmWRPia*^k5R4V`qJM+^(D98i3jDk#Q9ZMMWBp)vV&z}X4ps07@~d)1!d{CK2h3THXj8Tb5A^L$Y@oCzlutL7gn?Ld~X zhDvU+N03J+>incS!tSyQ`$)Y1Xmzbs8|?ESlC}(&95;qbbu(^ z|M5&cMk$07cQyn6*d3MeZL;hauTr7kXBrY&QHi+Vnl-!M_h zWhp)JcT3x=Ed%K~K;JmFyWV7bV0CnYR_=Z1vHETDNNH3U9sc{pvvgnWvnJ1N8{K|@ z{{vPNWN=JdyzziGJ6Br@jeTIK=iZc?CtStJh$cMY^&6SR$>~5u@Q-0E!ai!%0tV62 zMrpC|%i86dElW?$S#+9B&^bi|es2$0$kk6%EdolzRiFcdBL@e-b3WQK(nhMP|NWAo zLUC2n|LVnX#IsAdqksJFY2u_pf^UfrC?gCt|*>`SD8o)5!Xo*77n(1y)H#`vzG2gZ9*$DD(3IuRqw!i|?Nb zt~KpjtTrmODQRj^%_WT@kE}KVh#Cjbk6wp zo>X9L@RVucm8&ZP+q<+ho>40g+QPMBc(1Nm&u9z_G4m`)TN$p)2U}v5;e5PJzbma1 zH~qoiA6cH9k%ax0$qH&PEUdI()4kD-#dk06h5@WEq9s%s9_!;-zL^xnh$}bxZO7a+ z4vmKOIr1ayDB$$zCOeLO^RuPsV~7r_f@trJ^d^C&hxT?5!Vf#k;t zbR8iCjIRn@XvCAlB}pxL)AhFxF?h;f56tx6>Y1;`F6+C<8n3wg=RZ@TZ*-2%zfv|8 zSUT?#%*NBB9DG*5?G>GoI`zDuthRi&mr<>X;J&HZGMgGZT~`+fyEHoy7S?++;0h-U zxR=YE*}b-PsSoGPm37`ehG!e+Dx`_QW9LTTlU-rfnV0YVEiSP2CCD!xQd)1JmqOVJ z`p-qk(&%}T2nU?!6P0VJ*6Vc*r*xhYsVFkj62Pauz6sE`1iahwkt38}qv}!r>fE)| zWglrOo-?%=%CZop6EKZD5*cqXXUq(~U$9elxaZw(>olp1J}*2~D3`LvCj(w8&7j;6^RV@?>5UZA0~EtB7kIskvm0LB8W9 z2O3a_cFGmT?FFaqYYIr^;o@2ibm3~_SD`nC&kFV>KJCQy{~B38AHLxT^af8=1a^p_ zq5Eake!12E5+d$2SZY4vXmK~q{`z#f$GM#rFOaIIUZ`A3smMXlDy<4B6wgefMfs%Y zY!(mK-+Z_h!-WV0oMhnYx~e7p71zJGd|l5d9%$hy+%u_#9`iC2ZwttM?0(BdcwCp{ zgJMT$GP(|)SoMMUbb0wx6cs>$!XxegrQ@;KNH509a<9^|!U8X1*zPm@uE~~b$1PUg zeD~GP@{uk<-c@?n?zcQNGxwx~$pe3%;JYuEX0E)ioi^cW=(IKarJk)LMOzM@ZF@)4 zAS=LLjVzuml;b5oX^G|l(aQg3jSNb3k64uxo_U9$EwR#dxHYI=5Tl^nYd&C-luQ2T zlXiVZZ^ThCgwng$5xDYq)W1Sf7Mts52{_}sgYa@uKi{-`?n@u`L1x9`4Uer{(o)I#9=RQJ) zbW{!xyLk9-$K_;bb|ro@$|NqQwWT9&?%jhMjgAGRv`3H?iO?+E><}j*N@Es_3 zYLgz35$swTN%Q?>U(5H^`-R({*g3) z?l-6$$yvYi0W&puZ)DL}$$53EoG`Q!46_Ae$wrKY>GDtcrTTvQ{9%qx3OrWH$<=Mn zD01({$vfs`myNU!)gFOXBPrlxXpR3AaK~54cJzEPUCwW{H24%I*PZLRV=inHv)VfW zwUZ}4DELP2FWmm=eJ84vn8LT&c9^leS}9(Zb`PaW&RGt>X3$%*)2-Gep3A;rP!p+h>n>SZ=D`4^V=3=FMe(WQ(ffLsnI1i zo1*TU*9@5xqSHRec)gmG!?|S&nAdjEFos-b&;cVi9J>lu86|GoqWhut4wXV-d80Uc z%2awP(C^T0ABSO!WNvAH?@EQ>W|Uax2I^GcDIhzsPF~LroG{+6-7B*^f^2C*(IbC; zIF1{0IA^WoUm(TQn>dgS5pakE$$F!RleeJImJ}5~I{K1PYFd%dCV=R-f-Y_Pl`)5g zTPZ)TQ2DAMqdvPkThc~c{Ew-0fhcM#p6Dv?>;hq z`i1nf@!`r*=WY%r(CkQEoh#<%xMp+F^Y39Va%qbs4Ew&S+GAud=9$`o6I(OjeHvp_#)yTeJkD{*!m9 zcQ_KMCrpv)tGWbYxr{eLZpw{rT+tA!-CD1gkZLDOQYlma;(f7yq+gKVtoo|4OtM<4 zN3p&b5Wb#1HY_B1Au&~Tup8)sT>G>@ppQ3O(x3xc)#@VFm<7Bcue;!Bt>qSnzXiL? z-!~I-W@)ycqTBka7nUtEiM7DRZsFZ0i6xV*BRdA$bD?t2PXhf4_5x!5+ei>_ z&xfxRH5VI}?Mpw{ZadrYqeO=K45CoKK9xd>-=UzY%`MInMNF?c-11}Wn<#QkoYq~} zpw3B-q9ybD%@6-*Qu?--=Vy$9@kUPu4&>gP-3%D#2=SYc^BZCF$Nt{4-s@`*WnN@v z1R3jD;=H0`BkoSpMZr&6#H^5mKTn@Ik=rckVEKWC0bm9a8Z`{j97t5eBrA~FN1a-o)Mnv zs;N0DtvQPKalL!qKkXtS0?`b+Pl_UR&WGKcBFG_y{g^G0wuUcp;K|A2XsRulLNQ4Z z!1p!}T&g*<_`$#AhTFAnQ`p;C!(#-XU8*Yn`h)QEb%QxeoBQ4oFCTNoeYk0QG+T}9 zwNjWEtSK}>#t|@Z9$2$-CM6%6BR;Y`YbBbD=~jOIUM2(YMoas*cBTM$eA;!NW^TfT zz@u{SHl$OiU^AoXvBQ7oEMQR;wN+pN%K7H<#8{>B+A12+hE zaRJyyU}V#aSU{=y>$eypLssDHN6mw64X`lIb#5)aH^PD;U;XdmRtPa->MC|AE7Lic zR7Iy|^$S=f_UPC<5sJHqa@K?sbEMPk6E8-#$h;qexa3g!Dt@L*wwfc~Tl<*%UK4Aq z=};ff?d9(83sN8*G8ee@O*J0Aa5adq$H#l2l5IPQOEMFZKeK*U++&G41%d&omK68- zJX2V5-;z-E@b=K8;l>W=TeTc7I}q~x3j4Z~FdZFZs}({6i<46(?Ut~|)OP%8Cv+W* z4(HBN7e*x-qNc6V+17%ylJ3;zq6Lm{Rm*|1 zAprkPex$4IB1TQF<^OCB0;itbg3=k2)<1|(GZOQ#7t;{%@95ec0T@+G7*0y74tzh~^x2WRK)nx^ZkdyBbyJxlxWVS?zAbDO8;NXG$&IZ6>LY#X#!CC^EB}c_OuR5= zXV1gSC3-LsL@mMC|GfW-`pqNx`=cwmyu5#!S~Lre@Uk;iRtEvNR^gK@W2i4JG2l9T zY0KX~qieIiLyP&DCLPZL`)rO_gsJyAPbbqF%gYya&4^D6%l35&Y9Sf^{R<3BCt+?MhdTX(_Mi5kF zSx{@pWoBcrDf6bO{%}fhV`cPHldU(zLqv)f)g-dKG2)=plS>Hm99Gbt`yEleuQrs{y^vdMO8 zpMWX-4zOO9QfiKG`*^Ip1gAzrEkDmp@NGdXv1)L29Uc-s*3Iq#nJlZrODw^F+jDZ) z)*dFBiaMm-=>xReaxBv(HO5ncN}KcjuVnNaq#b*%pxW;$9bLtKh#drObuaI61Y$n3 zHdP%$8@#rP{z;HXE*^psV?NA%NlLX1E)ijx%#%q&G&y$bvQUz=z|vGPQX4o*h%ZI@ z2KFL+Q6bog!YyR>GV9`vRuaN*?};n9UHTUD-SKBHGoGCXj2$#iAZfpx`mz}D^->tp zeeY3`8WlD^t99oy9jaFK824b`nw~#WAw_DIu*02$o`Y^fCvmbZU?O0zloss2&F>8= zoz#qy(XkVulmX;R&j026Fei3(Ujrzl+mg(dh2J*L%1{3K@^niA9nS2s|54$$X{tLpf5C zdaa+Ke)oQAoOY*@PIBL^2L@QqHlArhuYIzFaS)p9HT9JpQY^X1?JJzaBjn@SY(m8I zvV{*b{t}+vXblVOk@w39e@&*q@c1tIOG8lj1$D_2F92`0#DmQ>NLWtW1(n+%A9Kzo zJ))qL6cDt{meKQs;yzMhp12{B^m)(uhZ{=|)hcml)jC%q+U_(^j!7L`wO-ykx?>|^ z)An$sUKU<`_0O_4zkmSf4YU3Je>rfRp*pL`I6ZKj16Hd%OEz1}4t@FrnTy&% zoToSU>?;GKV()q-*_yF2ZI_k>>AlU7Bt7k}89WH0nKyUTk6CV zp%(>*=-BOIYQOoeJ!h;pQkkV1z`|H53r8eu-2V>&gJ2bvAW{nb4m=;Rh+^GWFddQg zS%Z0ID&ywn55<%Zw4)Hd+jal8MpK@`BkZ}Geivfy+a*n>4NGJkE&*jJ(;dJZCK3+N zQnoso`Vi5ozE=`gq5)6Z!Y@k$NV^#Mra8Iue1`?`T(0AqnzPq^G`oPGJLnQW73)9N z6m+?A2mX7U(f~Y2HOtWYH0>+82{B=nPRnCb$GLre1>?>Xjtc-2x}{kszK_}F8!iY` zglT6x+RR1{4_g?)kuU*^HER`q_qhAr9-8gk6xrgI>ojE|1(BBXbGEibl%y;V!c}i| zjdTTUlz$ixp5u695+f&^<0hpU&WR>qG;tHq2o(&a-@?RadT(UnAZFjbg0UdsvgERI zo`i?LGjW2+Q8N<3=dXf*8b$ax&Sj9!uM`;dbTB&P0tv6A>ajavIDG`DLN8!t&^>f0 z2XSsl_rT!DuZz(1D+WW<1vlX)|EQU$MdxYtU4=E13%-orntCk!GmERK_a1>YHywhw z_jW^;^pj`oC{(8IEr$EFWhREyTNUtB4q_PPH;UVbt=qf{xZqMi{)CHz{ycY za=G=dl6z4|WO=db9~{tU+AACw$?g1!0~)M@=UGusJ)r>A=gor@mqkVA9$o@WHcW^FV zj`}E&7nqH3`VwqzIeLEEQrQERvLztsd89hQ69eJ#ouUT)D8wz{{7dgTYPeWcdf{Lvb(p13&h z#y&^nwU3!uaY@BGa1*0AMe0JL(bqyMm#=-);NPVvK4#Jf{uW0> zQ5Q^O&)gd4Bk0t_Xw;YQXE$X#%F?|r=euZrG_$-$%;a3#dqMukjla%>OKkzZq8*1YYJ;tBnHU9dB_jnW; zA(6G?wWjfQhDPf>ZFGKjKYkEa7ASB*bN(haq^vwj5a;29l#8R2jW+2M_XMUj{6NB~ zr%I>Y)HE=D#>DPMnK!-6*=xM2yf#=`yfsa{c(Ct}H=xDJHAy|k3AD|iHL^4J`Wzcu&kb!pQMJ%wf?-LrSHE}I1g zIcRH(byvuvk_UG+*P)R_Y1TFWUdE?N|RU9M+6+gKr&Qpm%j7$PXYC zMe7;T%j9BIuB3oCsRbc!W$v4eu?6i&Z&glzswv&>YiES6d})>whN~`y%Jiu?;qaNF zJSPD^z_Do`$4!cRxmUZ%BP@u;J^=0j&x?z1ihtiNV-ZHk7 zUnidDQZCdZM6JF?sSzarjTp_2^K|#&-+x>Kx`F4^&h zHkg>I1uSf~#0d%Dyt@K2&lfNAvhqIHv4VsX5OA@(8_hN8HzO?e!Dlb+t_G>JopW*` z^*B23qnwao3Wh}`I?0W4!1uwVCnewWIn35lMl1Y!;@f++~UCKT#Behl$5snV8N!*MD1y!-Zo@enlO8xHK!cvcyhTlZt%a(o+7! zkjr6&{ox(p!(KN4znA1RPQA_uVgg1GLF#bAdtAUc6}+?Si~UOL;MVtk`Qjtr(HE!* z{sSC(z|`#c`!-=7?;W)ifWqqIE^@V1Qz%0OP41z7;c-08>v95?aNmSCw_}18MEbd% zxVq+t24qSFxQV+cs4}3-GAT{Y@V7EaDODF_S4LCtRwj_y4~g@_e+n=(VO3|xWdeqK z@N9c0nQwe0xaZcs{K&o#U+M|5zsDXL{$l|PSVTPc=XoO#P(N|DtUWpNx}?B4$Z*WR zcqm9L0_Na^(`r7pc;I9-^$!{`hYwQ!30?tlejPZsa{%wr{MKh3_t={0#1DHb>WMpX ze%#?Q8fqOxH~t;1X9Wd1Yij6ld|siEF)~T1gR#FGDR1z(7QP=fpWnoHsTo9dW(uFe<$_`w7Mp-* zjr?B*l#s}s+Auy^^O1iB-CLCh;XYI#i zAp-TZv@M1LB*p4~T`|#mEHG?=IcvDO2@+tE);4DE(7+OB>YrtI*(&ct2D zjp(tn0_N{^T0C4<9hmoB9*DNWXchbQ`^s2cd;}h5>%j`FA1r}$JUT%0?c^)Vnze<^ z-SM5}D`$8A+5EWxv;BIhG^y2XNf_IwBm-j+k+dRF5}a6FY1xV1Z-9Ec8xXZ6fS<(C zKJ&<*yvrhjI~#a_qbg4k%xg^!_ERC-iU4Yq0~fzVF14!BMoh)MQZ z`R7De8d!-@3Q(r5H~x3#YnWF@Hsk>7`$@kg*4Kl+SA%wsj7I`il>(g{sMRa8J7Mx$4&32|vd3~c_pvOO1d6>!oB6xn(u;aNy-2!mK3tMXmI z?l&|0-Z3_cllT44L#^GovMr%}j&%flSIk02=Txfq(3(X5?Clg6Nslx!wSz0VxqoZ- zx(H7*F0!Ht)e@a5AT`QQ0egA=?}+{KzlU3+6K<@~!)ujghU!(xnRY0A z_{jdzpH13j7{n=7Y(sFQ-uy>2JLs+KL!PsjXyr{j7rImS07D&`1x;0pB2Y5dnRYKg zGc7sq8IpS|xEjxen-e|bGWZx{0uaDDBR6h_5d*p=yi7DkCBI58$@1zwF?!Y2^9_-+ zss*)bM?()Vx@IFn5p|ENd?)|Z?Ya7UpGwgA3@1|L}h`6;VfuZRzQu;evD_I-@N+}E7#JV#zgxl zJ(?^lVC{Q2;D5AgC6I%CMLaR?yE71}2X>=Efmt!~qc6WCASRf>mpabHU{I}cC1>9H zOXAXK2faFz^@jaijfV})N5f-drf>;TyPfLcJ_{A+mvV*azuCOvz7~@nY$J9r2>izF zVtDG_!1@|F*kxp)IxyFtP6Hf7_*j&K1CChLdUzST9ZLCeN{iw?SGCS3b~z&G8_SkK9N)N)%4P}F{Jx;u{ULuHG>AkZDKEn z+hJp3>e(xya959=YM}Gny4#|zQYR~6aQ;cl0jFiXub7oWqB!uN0*04qWV=cS?U_$6 zT2*>qA=}~292%7-Hf6VXxNi=AGT|n;r-5N_&$)0}xQ!#kE7!}J6x3$5KkDu+1!TBk zzy+F9q9cS$>NxwMXGq1Sq_kRKg4->DU!nSj*1dz* zoU$>u9~hi@qQm$BeE!d8ij33ij?hf4Ic6e~(>W^2%JKS+=B@PqU?n$q!&FlwM7@Px~?x*-aoIH*r%=_pu zK@5!Fou<4^i=Uo+fu$z#r0hXH0P_>jiYo(kV{V%YJU2&@4wnGK<=KW51I7>fDcG)w z$%%hZpl|Jbp5JR6U6GNq2Xu#O(C=UIIoPh^m3&Wr+}Y_AA*=>nU6BDyG|IrstnAio zFKm{R!tO3WsuyRH$A-(cNO;=kn|Azv0WR2%tV28?C+!dW>y8aaiv-OFpzSm=a59Ra zLg%oYG!vHpm51Qt^6(kw#g+CKW6JsB4A0DRp4;0$Q_Hz}e^=*;U835ea zuoOxN4ugOOF6BEv%m^;V;H33^Uh|+IKJnV2;+}*Rx+QauIp*KG9jJCbI`2thM$)jV z#jm2TMw#C9j!H2)_?&w5C8tb_Hy6?M`#J6!K9r&2UM&9m z=;#BTDqouH;{gzoWCSl3E7Ku|r&;rLJ+UM(eVz3`tUt(YZB13#`0Pe6kRNU73N4Z( zsVxJ;{b28A_YMEZJz91w1p$uc{TIoH92XG}L^szGw@&3Lz~N+1q`S7!5^6RE{cAiYU4=&rr_FCkH8(>`p{(DWMGsgAe^MoX=3qdV< zoM?C;hoMSj1K5Ban0K}9!{5)%ZJ}o`p=%~)r7|}z5LJrBo7}KoE7+WW@es-pa+N(G zKg-f%PZQmA0i>x10+)#w_i6NoB;55Hxv^Auh9XvnzZkN%afRs^;%xw?rW`NSab=kz z??bpMyDTMch5G<^m=^4JdAlQQ)i(KDEGlKjT$T!qJUVNc`$^B?Z$gxY{@I&h6uJAL z9(q;!8=h#`ILAbH)foU1;Ms(_C>k5bYhKo+>zXM8avks0adswC6i>MR(E)Jsq31%s z3}%I+_{LLzso?G!Jm$J0e6N`}eG;4c@(F+}ajIxEFuuE~WsmO)B;Tyr`X%so=}+om z_wdbs&3`0!+iW!C7KK5s3wMAfYEt2I+9ysO8EW^)Nn!~kMjoYVcoqHIM-c<&r?%16 z4tpAT&Qftek5&0kcD(`ZoUdxaLrVEGHixyuy_+pg*Mb@VVClsW8w~fZo-|x7)h$}8 zAYfvm(ZahYCkAs{z{#s}yS3;sJoVk6rf?6v0qT71BHZfKxPKUz|=M=w5G}iyeomu>r{{j4Fp82kzD%^R;sYK@??Eax)i`w zfGy!*tN&J&KDS?iLji>?g{0dc+=;rldKXHaMnj%ZQdRu>G5 zh7{T1N=nuK8-dN}3MM6$gRWe2 zhcS)=zd8SNLrELJmA}-gszoMpJziY*Jo&6G4hWfKy z`u&yqEZ-sf6Bk01GgF!tqDZ9aXx*me!(i9NnOfj>%cUsJoF9SR!0Nc=npy1{Y5^Owiz zBIA<=7eUe)r}t|rY07@eZqlGYK z303);xp*D)73mVzi^IzYdi&4`O=7FTnQ3`1Zz3bDAkK))mOt&j_cJMNM6* zRKw3Tpo$BhbDO~wFI;@W_X~aIL^Sd0`823Gw8AtI1NfNv8tS}E;%#1R15-ix#h}zg_+Lr{~^as*Fo;b}SIqbs%YtPc4vl#BUn4VDlqr zFvB#uR@+{2_1&;V974>gjf(@grJf}Kf7sY1*1M(rryF_jInR4V7G*ODP)!qn87Rfa z4#|?j$FF#^E8EZ=%km=BG*68NHvx+E9(zTj`m8OQ?tNm4WZPsES)`2gXaoup6AgR1 z-5-wsi$3{d0Z~*09J&U75@{@@@E)QdfgKyX zRZ$IdxFuwqdIdn_@mc_vI~9H*$@C6GeZjz`o1RdpZ%@XHy9Dv<3kNfdKkQ<{&EKgD zmCaPQ7W6VP6IRa}>SdR7!ZjdU;xbh;* zz9C^+FntzyR+a%; z@CBlaUg|Y=;RD-qzum#2lN=Xe3zYkI7j-qo@(0uX~5X}Wu<&iQqLFJx3R>1V2 zwcZD}&?AqqJhK2spDsh?1z;70+m~B-YzX0&-->zyc2PE8FA0p>rfG6o`1=Rjc)!{h zYzCwu|6u1JPDf6uxnd0I9OdU z*5n;!pms^Ax$IuAkm4k&oFElEtLEq#;vh6VThN^=)EKSYz4U>SQpw;Zx!A(@?q&|B|*_j!CWX+f-^=n=mxC9;9v2t`z6xre9ol z#2*QL0&9%)JxVa*D(-_rI4b7*Xz0>;5v<1H-hqQuN3}08 zaJKHx%yMXu<`X!C+%(RPM^K+}G0hsG`twUH%E!!??nOJvse#|MFB_TzYMNhF04@Uh zc#Irev}!BA^X&)rY@~w`-YcT^PyiN(_l^HJ%H}os$!+8+<^fdA@g(-_R=`LC+Mz$> z8c9zby!8+Xb+`cgNw>rQi;FyHS$yR@Ur5sIHP*}pL^KQD5|FUZ_RJvedp#Vd&#|4` z@kg+t`M@TFv>ljt^Oy80rf-|-%7t|+$q?1{e5IpSx9lZJ_9E}JTtrsUHvaMC(7at}1~ z^kn<;RjG8&y=1kA0jcejG>I#wvmL#|?LX-6hmDPpdtZ!!hKuifQIS}>nzrs^U=?u3 z2jL!%2tK~2%rg0=f*sfA6-I4dY+M&M)|D=3T8<@7{R6$`tUoQI&rS0s`x@wFUY6bK zT(N=4ST)mSwmUC9?KJcrZ*~c!NVZm8jO%)mYaA+*q1C*2>u;DO3(xH8O3Mr2=1Y!j z$h!3^gCdR6w|T0&rY@*s8C$ZjsnC%t@Fdj(?`&L`B%Bsu_6VW7a2xgmpe3!gf&Ym&Gv8?l`6jVi0nfF zw!RV2qsG2nw#$w?YU`t3Xv6PE=0?QHIDeqe*5$QaM*2Ct)<#}0Rik=WWGILm>+2Y*+Ylgx*vVfsXqB<>j1Zj>sgx9bOh~;khXb`sH;-|k4d{*k4<$wPgD;%u*)$P zxJtTVvpSM=`>_PmG8<$}OeCi1Xc7YmF}DJ>-}|& znxq)kAktgNla*PMivT2{@NZ{hh-Ze^R|j8jZW+Pp<^C+nNfyZg1Ipcm)<>x_X50Dq z&-{#buHEjnhDk?9%)NL5Mioq#oOk?_pz|Ym;BH2A&Tr;_$>~W7IZZ8V<>wp|fQ&3= z$;h-Kc8BT&{3&%sjLqAnfLay8S+8`^+{!PM)alzetHIS7$4Yw~>kHh7|CwI+-p*|- zC9Dz|YigCk4`ZpU5DeffPf^+b5Ywoi?$6s`p&a|HL8r^tn&SDJvP%Ej;UPm&dz4~96k zB@x$kRzIHEkxI)Zljyc7q~xLD&98@lfLgUm@OvH9Jtk&6;VZSx9W0b>G`wIh`)6FS zK1s(_Jv$LJpp3c|J7_O^;-X0%LlH}12NDBl>oyySv`zNpWWakD*q<$wuIaoH<_MElLSBMyw{+*=u8PQVs`q@Ng5NWQ&D@=SAy9P)CpG+ANS7jjF z?AwE4hbji>7#Sf%ux_b^dy7S}%Oq`O%u?dBRq-r`1V?ip3CQM)E_AeHQ3I*$VeoMO2t$wNm z4R$O{8VZ4nSJukyf=rS^{8dAVU2Po)5t4mHMW3o5)fz!8IijvA5b&tmffXymD?9_B zg@Y&EzI>TO@o2HW;$dI*#lmk5r)HJ$Y?phVie8oK=~BN#(QB>#HD0zWQJ$FGmj*ZX zYaoTQx=ZGv^mLiZjJzi`|Z?^QC$chD3b@s_FoG+)31 z8Vd+ISjk?DgY||mIhn`pnYpP`0Tn*jaj}kT-4dp|b=FW^x4yemM%$siE2o3Q2(YCL5@ zbGOGh3}6%>DY>*BES(8SW};`d9*@&k=+w4|&;uQ!CRH7|s@l5L*u{FJN!{0^M$=ab z7vDCgmbLEXQu7GuQ|@7HaV~VACG9SH?j|)`b4xyipQzTWuF<-q@3QUG^|9oEGWU!%@`$+h!dSdCS(!?v%jLzwTd?4E zoX*lSjywEh9R=Pzv{!hd_Gim;sF8h^I3;|RyqN`55AwbGFi@l}@U8E%Vy1)C;d(%; zDbc!L@MADX)z5+!j944^I?6-jrTN;Ik&Y)UZvmf8okH%94>HW*cIL_7BgJA2pG5f& zBQ_8eZ~AXdIv0HtLo1{&9*k?A9LrGJu}6af%QNHw!jZJlFB1J{?vJpwbu4w7u7s&> z-F4KQAdt#nq2~a0EOi)p7{3Ciok7xM0#vf;y9J0nVB-oGbSzOI3{RMtfzk&B=y_`` zf4N2)tLa!uW(&K}emQalc8?KcFAVTC5-)ej;fnLyK%-DKqn9~G%Ais4cgrM4?`3ypMav4#5y;z#p=ELc_FDe78=>sb)i1u)^(QqZKk zHT&k65xz^1n^mo?VUm3|5{?2_{?i-<=e2N=wN#lcI60-^@e=Y;ayjmb?s_kYV;vz< z_rR`B-zc}T{m0U)9%`GLb-l=Cbf{@0g!0EjS|`C=_{4u|!?SU3u_fdzQ$v%S;)RF% zjHC8qfh1xC;J#pPr6&$Nr@lihKRxKAnl6b!tmo1bvBXCD&)~oxf!pnIyxz1W`ncv1 zFn?va^vzb@xVOj^V``KESGjOx3n{dP9*-aq1dwAg;k0T+ua<*+B$W_HIHC6t0Djof zG3I}>+Da$W3?e_7t<(2&DX%-DL?ZtNQBtrpR>UGu>d_Q$_A;((Uxu zj)`2ulGGUFF~*pLYw?*=CDUbS6xdZH+id_{`zN~N=;8)Ch4iN9iCC2%>fbo zz^?9Sv>C5{QhCzQl%@XpwzuIB@w`}*59c}o$!W>p0FOJM|8+;9E%eV7>KEP?>PG9h zyk#rDBT#1NccIU>^zcUR0-PV;Gzo=58@j$*6lFjk%Q}{fHT)jNAP#j|)dk6AMTUL1 z%Zv2I!%zOPqz5P#8#XSqkozVOlXqO-Y{#m(zF%`$s%CV=4(?BzocP2cNB?@Io4yiJYp0EDQjx$~uM~Z3e zh<$~*`PzGyJzK~N6kt`eAghX~0Nz+Krjz}7mY%~UC26BtcUWoRzHkovZr7>L;F_Uu z;h(NUP(R>xGI4al<{d=*^*NC=ptFV$_kykrKHC!aSCx7PxZ_a)1pNb(yQE*t!0hBn zV%Q*9Vl#4QR?*%ju6TM{fF*iR(Slkup1IV@p)H+!641JkIY-rd{vcOZ+}~hms+yiz*YA_=GyDwVrgva#|mY6U1~636^uO&58+eH zQpIj~GC5ekvnd?Pq38%YmdHKSi*TNZ4juyMWkqXEd|XU+CWeJQC6+rX@LcLzZfmeC zKWioZ_3v=0AUOcYH?iqn@8^2-7a4^1k;kv;>%BO40`+LIy$TOcK6)$C{ZfICF7lBb zLj-mjHIYPnY{>ukiXgaMk{;q`G%Su<<(fQjmw^GwAtp^)%R_+2&ImxLJ$qpQw82P) zTM~9oT6hngxdE+ltW{FQSW^)?V&FFE=zlx-H!V{p74{DaYtqR!>9Y<@Vm8Y*+!P-Ez7=h8zkgxRNqqkK9hRvJ3Jge zkS!4RmN%0XQ<|d-{+Iaqm<2|KLl2V2QAu45eW_)!npM@+qaOTLU)(k+$1%C&8H}}i z_ahQwjhL%iXbE7yqO5?j)hfx1N5`SsX~6cS(bq9<(~mKUn2;APKx-peOs4fmX`9Xq zeWnR&Ti1OCl=1y5LqkJ-Nj#+nrOEe~_8!jn*vDSlrG6c*uc+AZtFGtJHlBqJ5P#rz zJEK-c`_evn*@1=7=s=a`*O;;|Vj83inxwgSo0c$7AbzQ~5`!pI`nLBS-cm~#+|wn9 z>`j?qmHs0`8>O#wBSz~GnfPPmk}h&5p8i?$4mS&O)0@82m>H%)E%dGrJixW?!>Gra zyWOqcuD-|a-UwVYa+!VzBtL;8W7-ln=nn|dQBLotufyp3SW2b9Nhx;MmY0{6c0k`7 z79~9cR83!jOleTtw)P~O2wfvF>HH`g!H!aav* zeEZ|uj;$iYxY2<&m7j?nkwda>(lX7pfwV;QRJ*+9-(LN0R(JjB?B=|&v3@t+zmtHv zcekLG5Z_F?j$9zqhk__8^!ZTQL~fx7y7eFk@f8rQ)~R3*i;?{TwENfyHa8%m9|I%s zzbY*pIWM0o10%Czsd(Ck07a&|GeZo8+=`}+#nVe$54mU8G`;ppL@iX|+ zq$k>Tn;!eEl*z^I%&Jxy-3alI+aA|rL$}~a1d28Y8-!Cc_1GAVkxOvHcSS{2{r%;$ zEmT5akaw((DrDIQf2^kz8Kzk_&c(%P*Alojo~25&mRD}oV}UUd1o#I zZ@@+Mw}j_!9ml&W1*ie2V~rg_@HtA7G2)uLxz$DVuB3BfHzCcy$mV0tEXMp z+z-N9Z?FR@mghjY+V{a+$nZB4M{eEHy&D?b7zy%`T!aq}K`R2Iq)U(eFHkxjsbH@# zT2u$qo3Fzg}tZZw&Ubls|5c*t1 z*(HTtf~Oi0igLC|F$=0q=P5i^W8b#gTj)c zxiY?eXZ7!oqh+`6OnEqrO4))juo$<4_nO-IgTl)hY$}gJ2i6vRrjyt}a~NWKh-2Ys z!;D*VQ-u%EhV&_OsHIEU0$j4MO2OTW;7p!b{11&a2EitFUfLys^^j|1X{(KyF2haA1my)mQg68 z1D0FgP`hI;x1p8I5?LX32qo@zrt+4DWsO*io_NG{@!R@pj(iX|qW%Y!p5<~0l+@au3*0l|Pzt?c(0F-oB^P@X#OU+wb?Kr|q zJ7Z=_;!L`}b9HVxFU_>KOI#qz^kZ^GmnVzMHQtA)7mhBLd=F_(GOG&uv{L`6_a|Wa z1XQhn;l&@uE^c;6$Bp{E445~IH{wnssh0003NSr-As-=*k5fiEDA%719xVpU*$E~I zhgC%_$aR4~D{b2}>`MXH0v*wv^(jv4DzTpH=5AO%+ySvL>W|mZPz?IWrvGhU=fC>E=Gmf4Z+feK{M-#fF${dkF7;*$ndmR|>|aVum}3fopGC z{ajT@G^~3Q3)|aL6e^y5sA$xS`6P&yW&5K}qs+tHdEI72zO&1=Sv9u_n_4m21K2O|&p-w=x`{@y?=8JW zxXR%Yse|qHKE8L{Y6>*h!m$4>Dy3&O8oI8+ee)}SR8yVHNq?Ubo636ZBjrT;S9}dG>_&S{078%0M3B( zKM0Z6Th|+UQgpeBL)g5^XP_Rx8ut^Z(bZ-4s8crhy{Tj4{(f86yQxb`=?8z=fZ$d> zx`Dp&KC}N1sktg?tf7g`Ox;`kv@;JH2tnEa4L3_VlC6B~Q{;njP0qX1Yt41lWW~6W zk}!l({xe7+KGgrhfkF8ZUV1Q!*fhG^?lZP@!kB{}ce@r@f&M=DbY?EZ5lJsI8zsJ! z1ZYlanwm&>z`^zYv1E%4eLf64M{~nBJVNaJ3Sb^e=7;|+oUN~`Lw-767zg(fennK$ z1ycbqW28hE;G)Q!2fTJ(3Ps*Hc>BmLN1&n8Ddy83otwswK0{F@DPSQN%-o|F{~AS@ zLeh2LeCk5`;GXRbbuXg(6kH=s)izGG2mr^*te7u1KDw8#G|B1o7KueeVq-13+=48E zTpS|h^0RJllhLvslF}_A&rf3 zFAc1$F#|3VY4W|wao1Ue_R}$8&Oo;ZOkOUfCpYVW4e0j(;2XnW$3N{49ruR9*ljegqdq*WeOdJ&Vxht!=%rglPt3ku_Mr}N62kvCz0e{!8 zwU-(0=o=F-_v49TH4+BrQ10%uPwQ&RcukD=95z(f9b&bHLr(v(W% zv)&hM_A>h`srf|9C4b8Vv;o5ZqlwOH&tWR{lNidBBidoaO)3e8o}C43UhA&1mfSac z4p|v{;fSt2R1g5<41$s3PDy^-fG!=^#0NcoSVSlyuEyEr9baeWVU+_stu2up(^W_t~@J)HKi{;Nt7FjK8NfLm+aD z%z06fpgfTzHonJi)^6A@eULJ!@+j>stF2qB!`9`VkeABFibuCS2LEKI&k{QYd`ZoO znb7Sf;y@NY3E##&&-u_S1#boxPd;rOa`)bKAOT0(Lq2VoVe+bnQM0NWs(3fdHHA~J z9JsrV(m+2ah6EuXwkKuxUo}4)#iDbAEVb*B(W%6N55F(}JWh!_#dh;|m22Vph-j%> zqD4l<)3aLVlHLDaWV`A3orty*e2^3p)m}1YmnSPP?@zF=P~wxmcoIWxOW^R3AY26K zg6m1Wk8yj3d9qfLMpJ?P#PujhvKec;r~ef;2Z4^L|@2Bp8&qNAB{s!jpK4tfB+qR}o z+RlwgH=3LV$K{o5p1fgu7AqHc&82KI%Uu6^{)88(!?nLK0$I0#QIPl7Icg!(0oeb$_rJtysex)pPHigY^pn=$zQ;u5%U&Z7Rv70zKS2FtW+KjwK4fKhjd)kw_V>$$sxwZ&he`got7bO#;0fhW_B!(XO$LzPm21(`lwf$ns_SeBNlWc~i2w2Bf zFH*3J?UGr^U%y$;f#Apf6&ki_v+Nu(8?^1r3xK`b=nEsojA0N+=oe+Oqhse~WB8X@ zjXMtvAU=S7nCsZ;>oKVJpD1qIGr?X-SGB;GgwvjC{T1UBbw9{PPnA7$z;Di!M$VYD zZVN`ToyPd9VbarcKp^Jmg|+IfWQ(eb5o;*FFmsX_C~I0gUpH0D6{NVR@&YXQ3Zw-d zT)lno&F783Zk_HU7ZTY~Yww3fo>w?}`ORXdWtlsESSXIb9xORKa(zh87_4Q|XE)-! zV#T=kROGWEg#RL3fx}m<`hg$gn5w_nFNVh#LeCbP+(3M0ILnjt4tBXV(Shmcl$gbf z%IA~T(xuA{_rX^_Tzm)CxiUVP?<_2yuO@Jtv%pp65u@IaarG&e^rVd@hciICR8-26 ziU>xc(W}R|uLTyEefyO(2$5&P@0T;jsipll$M#MuXf+g+L)mALtcmtlhnN2`w~-i0Ol! zk2EPAD;dqmN1ks>PKan5vagsRNbR2xXSbWS0d3L1Gt`YAtCwS2HfM0$amKlgZ21Ib z5MICYV@tuwn*z4>kv&fdF-zy-(Mf%Hty#Kws>=tIc;t?S(MJ6xkLjEYH={>@!gLG@ zPM05ai{3J7s#1CCdJzah$>zz|L9h7wKgW5U-=Uau&kEYV+|lM*q-=qNe#{R6MVQcU zG_ZS(6+W={KdUy)dcnaP2dQ7Z&b<4GE&S?R2M-y=ae;?RjEq8WxKDR8p&E2*4|^L_ z&NxRaJkr0_k>#3WkRm>C1rL>#`mt>2`|YeI2_~dd9w8PL33=wAe+kWo27Q~TVne-y zewv!7eeBWw+f?fmhryK0E661V?N>d4utoZi);qS-wYKL^gB@N&6LacX&9>b?-Ae<1 zzVP{c&bhY8c{4d7zqWKXL;af~>~G@UFht4aKi%j&;8IkfYw_vb0{#g)Rnsf^Sbf zhnb)BRrV|iAqK7w{>lKQ*h*ErGye~jQzTLlz^i|Mi8S-D`t{}2vxSE5Y)4UVtR;b8 zTN4aI6?UXEeZ*F3j3yl)j|lcf*!kFbE5L|v6_mo! zt3!+jl|S|eR$r|mJBVBH-5?KZoyp4!oqK2dVyka(n!-9S#WUW1|C}@C#xVss{NQWl zL&s#1S2z&p9h;xp;>qvB?|6st?lN6lfyPt5>d!-KOulOAHJ&XGdn_qgZ^7*d@&P*8 za~5;)vvweINW(8b-Jq(m64eH(#4sIdF;`=%)q06y7~!sGLdu|5_HI@!OAI6D`MT>$ ze+Gt4ODh@KPv>}Y+0<>qou;L^&g1%zzgtg;!PvTfmnFNSF#?wQ2V~Qv9kGG89g_XQ z3403tiAgANgUcyj)gD@h6syMkVMvX2Ag?fQ>fp(6p3m};BuJ+<|Q!1?K@pXb7$ zl1e#srV?R8H;#7&j^>thSJ$F;W#rq)myt@T?kXF7Z;CBv7yV=wtBhEd&D)=D!IN8d3|bh303AFYaqNN& zf%`6ykQ=Sx^!S$0YTg&zZ!7zOgz>`x7why!Dmt5eD+*Vk`umHlfmse-&G@W=a-Vk2 zo*GV)OA@Edd!TyiW#N`dpHRwu&(tZF%4_=SeU{p?-*-y&1OVEYq`1LSglrT}hQQQY~e<|+E$|(SKTvqFs&aa_goFk0CEPgqU z+#Jc95Uw@Y`pI(3&Z*WWgW*?KilgTt)9g^qnBIV}&_~^c-MRl#S0dDm>wj|?e>Rl- z?3k{i=Af2%8z+24-}NG>qQd8#&%3?vFU2c;w@nv?H+|M2P?N8Jvc*F4K;L%Z55K{~ zB7vSNhLKLnkKcOlh0!}@ek+qT>Ev($@?WOuVu><5mROaFoK-~j?Qimd=IOLi80D~> z)=On=UU4dK0xsbQt;mCM>PC4Oew<&G@=w@Ciod3w)wR34|0gwU(z5Ab3s&EfI|!uk zKmQgHkRu@^9Y8CV$pfc<7+=d)T4(u{d`sL|h1EVkRb11Kh@mL_UFt7rp|* za30zW>Z9lP2OKS?%kb=ttkyewL$*q>fXdK`0E4?eclPY__!w}IyiF$D>8^KwGfAY( zv5X7pzGE?8jJSioeCO>9fAyB9Cb22;Tl$mqdC09Yj?@GRk*}O5$KCq=C>`qve!!9U|0lHj{NBd z<7^E_v&h|oIpWdv+*=$5sjNmewk%BF%fjny_ipOC-apV*JpDuV zIy=K_?Sj)t-NFjvb#)LSzt+i`?Nur_Xg_pzFrw=L(GO2K$fdi61_Zb{AGQL}J2Yj~ zwXS7rqxEp7%|(DbQotX!wIQuW{OOV#O!;gq6p2_Er%mr~X0a_sw-Bd|_%#nxk%yw# z6I-l$(WAh_{k7bqdRW+TF+boywL4L;q|`vn32ntkBN;$DDKhllc*KstdR$-aFJS1c zWlz1Tj5}bW1}eQ^ZOnG?{+al?Hxxec=xz3kzmKA+3Ll>KN*7(EEM9(ivgpWl@K`3y zhxP>gdhEYkZL^Ih&m~Mrzt<--V0``OMlPVBl~9Q!_s**D{M6GX`Ufi1=bxAxJG2xT z#6ef}$yT=?4ry_chSUbMrE3~~P)1O+LRj$fB7uH(d?Ad)@dA~IxK+O>&T2ilUir~F z@Kye+3;LswLW@0pyLxEDLXZa@KF80jsyD^6uj;D;3jQxZ!bsJ1Om8?a;i7+v!SNfh z3$F~Ymt~H+@pO1w+)g_a&pnVZqeWtp_-Nm8&)m*W{o-eXm!DjT zn9X{a^kn|F*6eFhpv+d=$ry*GoCSR!<*l2AkINe)wvRq{$eaghoB>T#(^CdB1R%d7 z%EM=SmbyP)Lu^x&JI!22fTp~E{tRe=bHmqv0*gNgOX?*P8b~ew;$YZr$r~W$9X>k^ za^&6U>`3gu0XGZRiwp4NVhK~lD~7J6NoFB6Z{TP2F{eQ}gu@4Lo@$Rfo5J8r?cnwd z%PeL$GEa3~(Y4STunplYE2w77SLP#U!eJp|#nOw*ckP`&!sZ zVT7^fSx{P9#>oPSvJXTcn++y8=8g#!Aewu~NBAficA$(x3#(NG&|FqXk?qpAvj`p* z;)93E16{EV=J=wbkB4mc#a=sS1P!(6xzPTuIm#z@J@Nd)lcbMWczcfVYto>s{##cU z)Ueg|ZrQx;RrFFt;!9)pNixbXQ=_{DWXLGzQ13v{&;li`RK)& z|F~yl-D~{1P8>$wFLinawP^Yo&B&!Hz}7;u)c5WcB%buK?l+aiK`V zwTIu2wT}3-{Y8z8$BP~(`}G7EM9sU|1>(2W5p2Iq_dg>kNWzICHjsAoK3^9J>{>z` zY`+tGOjfDvxzfYzTyLF{ABttqfTaOlG!ic-q zby+mR=N;+$ZS1=7v^@-E-W=l;X`X%N#2_Yh!WI-QEvd(!>0)j_Mv^1i*6Q44S$YCW8 zes47k`O{428oq}&9bo4S5{~@**l(ulj8}B6-vNV9IO**9+>=jNbgDPa0~<#koX(j`N*G7lhLh5AD`|fL;|d1A=PraIz(BQh-|CdQz?F zYGi~MoNn2-;rW|;Tqwqz%E>9)RUSOwb{%sqWb<(@rNR4z69R01O&LAnR@dC;XO*Kl&ccdbZ_BD}wARnxRw1)rkWC2UqVWlpNR>ZX3ga;Pc?BNbq z(^}@-t_)N{LS~Kp45;WP|E;()z8N>*wG(z$9_5lZvYj;4W^Fa(pI&qJZI?&gZN(yU z#-MIeuTKMoLwy2Uo=wc-;tP)h;SDyqMUS4m`9cWJ@9dp^mvq~pN@|#~|rC71z6ub~o4Lhey|+ zpckhte{jw19uQRgcIIDWGd5@NgrT^5H3Baq9G>)dm!%uQGck{92S(#S)YoM0T)$siS zEpMe>gZcN=4GisLu=ExrrLh%$bYbrK6uq0tc-RrvoO)s&jyh1ZAg zyN%SVIRY&g?Ygd}LO!OXdz&k}KzhZDjYuhdMzRZ*-nkRI=SvQsJ(QgcJoPH!R$SGO zWOUA!6hG7`L~pDQ^$8gG+HG^-X2Aw5O;qyE-VDCdUEa87G4H^o^+NUV@B)Z|;I#QP zO`~c`ePUg@+e!wLo|ONZ-tRT*q*wZ^i+!Nc>SWW+WvJTa00RJjdWV~jgBK`Rp|$cP0NI6VCy=+v96~-_qYx{(>2l1@}C7%s!UoY0P6B( z?Ae(5Scc}5it3+4EgsLtTD>nln7hJ8+{ceak9v{>e9k(fWkx8tS<^71Pp3PYNH^`DOe! z=#{9&Clk=%!nClKl+C>4*i56y@;rw(B3Qx_h0PHn~6lD>}|Hvc3Jo;}M{n_1eb>?Bhi_)kRNKX=;2Ne0~L5BO}`NrWW=%|d<2#<)ujBt`!*6s~`a$f{( zu_C-_T6I>S>_Ly-1Hu_Mvc@4ISn!>FoiEaTNa z++FKkr1o*(bO-QEm9zh*@Kz*ScCb%K#YxX&V@<^2U%{BSR+1xe@D&vw>dAK#$Ce98|v;) zGITAJYs=&ZJ#bYK=rXP)=PES@e-St&s$GG2VM@9F0T?O&s<}jQ6gR%q&ZT}_MeeD} zr7}LZY?W!)CH=XH@N1=aQX$W8JEi{}`eu>f5^69zyZf^FiPV+z;4hV1de=nKdlE{< z*A6Th7s75U@dg+lbc~wlp=twDFsTnEq>>FgB;)-7e)rn=^XBGXAS-wZ{M=oR75)KGmjD1NQ_sD$#t0r*(zpXm(*5FscoJua zq=VV3{<52@(onI{_e{B&nrc{UE04|f_p5dx?toUvg!`kb+=>ci1{w&zTje)g z)8q>Q?wZFepZ33D3j8-r{$i*fY#$IG%2&p>wQt1AXs{57IrJ}8_=Cw|!0abda)@e#M~@DcjJ8gOEaZs-n)819gLhVgEeZANwg zyDIx1?#~ApXgW!l5{6xJ!WTFF`%HuGtc!$^ucSbA)9qbC`lt$a{DHMk;RLA;L zAl_@BipYzp?Zd`7p4SLbrDD9!l(*A_&_{bpgsd%;!(AH|-cSjD(g53=*Q|FHK)>tX zDQixwAs7EFR?_U{VwsfteqC&2a#lN;-Og>Lhhz6_vEc`>z0Jo=KejE35p@}4=OU#EPsZsxh4X|IGG-ymFXV=w^kA+9FUn^T-}m$=B6h83`sZ#x=kB`e z^lyZhW2FwEx}g`Mp#{0_+2@Ei9Hv#vj}1hVKkO;6OR`&a5sP4AN^>@O3(CAliW=_| z7W_uk)nDYU24VL1(#{1|7d*dYb6)yvqT~Vy)XFFL=6vF7&uL!Lw`MVw#IH<^)Pm{R zC|RBr!#ZW(k>f&h%38^GxA>L%ROO*KZA1uVV{DolO5*VPY9>sK>}6v_PU zyyW4h*HunA^Ca?;0v7~rRBDIRRk+KTtHoMhR|8frBF{N-5y@@6rkQIVQ`wT12Efbu zn&(_BLNS3M626yLW;RK-ifo9(-EJ0*fP3NxdzR`x1TlKn|-=ojlt+r^c5-C?x8Va|GF>7Y)JRDXjXOAki(;8>_*#s&K40*Y- z+@six^MoA_l#5&5V#-CVQy$AS(#=Pq)CHN~VUbWe2o(8u@^L}SkwGhEi*S@-R=)?p zN2ft*Cq2f%I$M}-S(3mWqvO^0dJfmu*Vsi_G^it%EkyU0L*7=`K>PqJy_Md0=&}~n zh;s|rpI|*5`PWD3$4A0@2X5f}5$kJEwSTlukFpVvJ0ZmJA4YFI-fAoK@d;G2Ip@6>Ku_&3yK8fi$>l9IvE#7tutL*@RQGg^ zH3zz-!TU`&G-6Z<=X}}O*0q#?nCv?Rid%Vrf?8WaXOJ77eK9c$K46d%VtGfZZq~QH ze6})_^n%F<1-+JyJUHCMYECIs`D5l#QD*@gHg?hNA7p-To&W=k-j9X4D*%X1ExmSH zccI&sG*{PD^Lqknj#0*QZG(lA&U<-TcgU7Sr>iJ*>FTFDPr9}GfAwEUKP)`1P=7d% zv?q7{m-K;X=+i+;-f0^2O5u^) z!O8KkV5C)*#e%%yh=avlR|Av11f7?lg)r@(%0!C_qvqCP<~w@ z3-eDyckRg|yK{?+|6Lf$Ji2jkv%m!eYCPPG`?A`DQA6}?)xofR!jU>lC#n8>N4si$ zAdoK0wXF2aGoa0>M#AJ7rlcf2KKd~ktH{R^xHTKJUw_{!1;CVOGcGPGE5C_}SGb_i zr%&ym44}Y-yaD@o;=2#!6Mw%=myeV;cyV+^?BPfI@~+x7Z_#=HDupM%P348m(| zLVx1ay)&M-cx^BC-_WcHyVWD#Y<;IU`3){vdeqREwWp6PVVj7Y!Z;52dXzm z%aI*AO-CZ`!B;aEjp_Tw;~TmgpLO}+t2k0gpTX6xZ}Re>E~WiwDkfWlGC4NbspT>p zLT7sx^R(=~ls-V=F@Z=y&UJCHe>nH{p=)W)W&QKw^&G%oqCP>+x7E+X2Nn(8FLq74 zj`4s|ms75JW2V6!J=5i?pw*HW}8ap=o z))7h{ht=L!U7UIPB{>1)?9lS^W%3!h_Zu=Iprai(x=CHCk96|f&pAyHn}e#DQVt%z z?NM3b>-{qC)2UaYaM!NpgoOYFnBPh7oGj` z2Or5IVXly-FR>kMl_i&Aon&$g^~C0(kO-H(W2jedK~nEoYwnU;;`q&V+4G)mwvQd4 zUEFT@yD#B+?FU&I;zkYmB8DyFChF-vX3}p`REbl zBqGRjH8h))hdM0R@TbI@Nn-u_{_vAWL|N5|`)A7Gvj$kL(B;2v7!BHlHd74hvdDP- zLkv(JtNlZ7N^TgWhLpp!z%S#VR#}VM$&c z{i4d`0dpuR5&WVeEzmfClNSN+&G~U66W^iap$)gL5b9f!vfbsnzG*UEISXm7SjsEx z-ClIATRr>LWKtI8nS_Q1RdS6)_~Cd?K4&}p;1DI+1Xcm3%BSZMT9Kck-W&J7H3cL< zqs1^{k!7p1t=)RcG~oyCurK8jK!Ta5`rnsS(i>p5FlMn-nUr-{(kGu0dcbBK`E=xP z<|oNTg57%tPT&oinSR-Kwy$}U>)Cmb*ktPOUj?tXolIroX*=nx*Pd#$d{DXPK9Kf1 zEyayFe+{~kgf}aW`WjkN_evqF2xb71H9R49lq6TbBZh5!qrL{2J%fM5|1ct^Obv`b zI#Yu_?7CIB7dd$9k!AIQS)@nsqf~S~g%};NRTcO4BL5hLc;R*Ag4+95A{r5rP z>-O*FDwcA3{ySOjtvuE$mf!5|_=Gon9;UXjmTW>m1-O&Kp(=*_RZ zk9fw{^rCA)VVyKftVOoxj|~&)?yixp{WyQp|6}Q^!=n1WuZIu@sXNTWfIMKQ+dcL}N3ENf0{xJNhUs$qu-h`tZc}dB zAT)38x&*bKdHvDiSi5}71<1y%h26R^LBKo40t_xe-B=?!AGDp!>%4@mTu+!*O?olW z(Q-P^sen$uCLps|y#Cz5>bXX#x(;iO-%GK5c(LzuGI!pz-6MW}li>&oATiEsoYMIM z<0@V^o|G6hcmqN4PU-mP)+l!H!lJb`!_}XP7f1u5YJ9WyMv~^v)WIak;%2)SE?nj!*`|_ z$(^FBs!!SJfL0D%BHXc{b+V!zNPlUjb`)ela|E8&*$Xt&*dH?B7xIPgTd@6TN($qf)V#4Pg7VGwo zF4O#68E0CbsI%iZHOLQa^U|Qlg&=>wJR`NEWs{S1nkPz)+V)?WEj@Tr>M!T&RyzH; zmsCRp?_}*G0Cdl{FiIGc^X$8wOW$CEq)drR3>&>!)Gqig_R9w5^)q#E;O0S;nB^;^ zuO&hu8;(D_x;YMqDc3UafyQtxu{s~)?vj1Wp(a5P#cAk~^{fFE!RCA0er5JInX;06lEHuTNXU%pJ(~Ht86f-`zB~3S+C<3QMfF0n*b~xp8 z)%Lm)n&FC~1DD-o7GkkFfWuxyHb{8zxW^}0C(#YW?cbhU12{cfI? z2xWc(*aHD0gXs4>h7~&O$r?IY=A^DvyU^Yj+-@ftEPTqc4fCa^S8~ST_X!b52x6@l z+@*qvhp>7f#m`o{7>y*hGoRz7bg=bxX;9yPfEWea^>a+gHR|)I%^5&V(_J3WhIMcm zDw$|F!ZLaE%#!q}KuqxD>kf;sULT4NCNJ;9K*rHr3}C*D{?N{dxXcWRhFNcGc$L0c z1YA9ud#Em6_Y@nr!dK1BfsK1dukD3w1V}!Go~jGL4+xDRpE7aZen0K7FGWPohP}qi z=jzXc&}{@zisp)VZUO}}2di#IdP;$TE~Hgn8Qm}YWBrWceEx?u&h9NcF#?E%;Cj{7 zcMjhwsPwH#FW(PKUW_guo!^phY|FW_t{RP}9lX!fieMK$Cj@;iS`}*9^jfbsc6FHH zuy6hPQ}$mGvHM1&#>un)c6D~#D5&@F8npQ*Yb5e?rh$0?f4+B(Cy(A9()yLo9T0|D zXSy-kAl{J2JNI_;Vm=;5nAqdu$=guFd!hcWR?~_-YS-lGU^==>WcU2zHQnR`ieu&e zvx+LE@^-sgqopb^8pw6|O8y@6gwk6PjGIt4`=ArqOW7FdfEXz4zEhkITm1>cMf*qJ zvAP!`a=SI+w{%hx@cu~ht^7^Ym!gC}hz2|ibW4@Fi(4ptYEz?rE20T7S9_`Yrzn9I zJNf)c-ob4MIn-()BG+WWPk>sJe)ohnI2cf!wVbYGf18M=#$7e~-rZa}(6jg_Ww&?i z8Pww-rUv~$qvUS&;HtPs;^g@pvh|;W!R4yNH4PJ=ZZ3XDohQI*Ybim&9MX7N**$l> zYt~d%4}fq8r`xo>MBa<^g~55@_2-M-2a&5Zr7TZ|$UIR+`bMY%456N7D*5I0UX{P| z?Z}+9^9A2IY=3P5-m6~z0YycnyQPDW$|%&?3G6dYMhCOYemLL=A%Xp%f&(HkC%)3$ zswvFZP;N)NT4e%;18du(rfeH!)peOH0`P!J)<&wKwF)3c{fg_@yplg6sG*@ud>q&e=1wzvK`6H*4Qe*tKQ#PaY0agxlbKem=m6P|14O z^@)V1f5sb$(*yrCO~11#|9{vm4nB5#04y^`4(jNd=t5)}L}LU0o#bb~mxtwqHFH3^ zr*nh<7XRSi()`uWxF^J|b-z10a$cU@DZ?LKmP-18H8V_RoI2R?_VV~!UULYa;-Y5O z{fZu^JKKv_nBAXR`TNE+#tB_tMzN7+8`#hVlcZrj9|~iOotb32mxdsV?B>o-n-gkV zeNptP{`LtZZ*{gr&9CCNNRHLRaW{0GIE>+;keZb@eLapMO^|nBlW6v)$+GL0t9!gt zx^4-V@ORHIYg^M{(|`=b=Q#ZK{sKM{wZRobBXRW4B=+Id+t2u7U(bEPv**GO<^FJ# zeLq95IS5E`=idNG^jD#v44F3|byDne!sn%s`#_N;=N!bOW0Q#iGUVH;T}3mw;xl6y zk;H8SxLwauXSc6oTu`zC3c7HjPLoJ9T1?7+Qk0qd9PS;9S5M|gXt&w%SNwi;3T{7x z(M+B9g*fG?GNGPy(m`7P>K5d0r2Q>cevzSS5m|vWgdDL*bLSK_&Gjk*c!Bnt<&?GcW3x zEoDV#lEI3$j-qqfXIf{K4UechoEGqs1^05Z7X?59{3tWGIYc4{)ET+EK>=^%vE+#~0y)vQp~jl0@T zxh@>r7W>J~aOk}{Q94*VJY^)KPjMzxRA_GEzJIUJO7A+abR&nMDn?$)1Q%9u$t6Fp zQkc^g(LrA;6~cfxX5r-2qVRqv6qa#)xmdIETpH^4TZ`hi2H^L6@c->E1#)1283_=Z z;DJ)(M6*Wu0C!j3FLzNQ=??T{^C|bB$EU5Ljz&29|a&0{xkrIxOQMF z(K*1s*uVXAHGLtHwX_4zvY6S{xhweEm` ze`~V#x5iqX84>af3UrdkJ7ttGx3g(eR{xhK3lu!!S^p@{D^?jH6E z`l{9XUS+N9(r>f&ux|D7>;Zz3{>qH?8AIn#R9TV+?F(~9#*z9-9XWibCs>pm!AAu^ zYdbA4{qLy@0z^x!DqEa1|57Feh|o=54`wC-oDDZCgpJ-)Lz)t&e`9Z_l`=$KuYU&? z-jDg;C%OCHwa)&&Lk;GF#Ao{%!&@KiXvWe>?xUQ zmQC?*4`LP;1fMb;iY&~IvuYtQiQsK7Ty?7EuhnZ$B#lR)!C}8hq(yv&R5s;y*3_TrG zL-}_wL>6%ErVEDzK_o$Fdu65Xo8`;*D&zjL zNP%$ZYX#gE_0x4%tAU&oz!7E{%*EXq?!dgBC}|{#8@23?oYW{PaXOM!n5v&SIf}S; zqU1(aBT&DZNNs~mymDI85t)$dAu*zWazq1FM`GFO{AfxlE&Mv-;V52oq2+nXcl>q$JbouGKj+NY}~Q zsc&gq&Dl!Rg?6sO%KYxR-?5xYriRW@MAi0tBJREZ*#^eopI@Q{rs1mHNum=#;nJw_i5?jgoQNW~9Sxiv>_C zUyXdcJ!&n#@a3$H z$)J~;Yr|2c&XEi6RiK(&c9sFU&ZaD|TL2c5buP=__$xcJnH2|ee)NP~5<>S*Y>pK( z`7DTA1^m0dK?bZH?2+72Y`wKcV z7AN#?f9lrK>&{M%v-YlH4zBI*lC7;Q&_p=3%IWIk(_p>@Rj0ew&*+6v@Y(LUkJVW5 za#=@-uXAdqtA+6(#-g$tYRIA*b2DLdy0$6phL~6Cm2n>qgG~riE#Wgb028KT(^Wsa zMyd?#_ip(AHarfhetuLgfHpYXc+S zbeP#EZtbToEF#g2!YB)u9yu%;ZPOTHoWrkKyvOOuhrJx7=5LNM zDaHrJUZ$m7^YKo+)A{l&a`P3@N2V?TD=ZK+94r;A94#8H-?ZfAON8kgzQmHg&InJ*7q}T zDUnFyxjUfDE!y04!2tZ`2IiqI{d30v{iju9S)nS*ry?@G#R@kD znTqQW)w*Io0WgKVBEa%bDzsO@$`PU%8XuSCVe3|6eCRix-nzxzTwT@v z=uN;r!7eF{A_|~cgtDq`mS-XwZ8Vmj)mzSndCOsIen|7LThX=HX+ImG{8;MIOUTrkE{*+rvnljm(!R@!=>2e8o#BWTs=1kJUgzmKY18p~$x}%X1JzE=;Pw`m_CLZR z1Bf=uiCycje&Fb1nLJ*R`O)j~#q8zBrmL3t;a4ms>|PNKT%SN<+yC=)zuCj+lvtXqyu z?=^sCJTMP9z1%-V#tIUgG^w)!?-l?peE+x5JPh>>Ia4=K&`-sRtt2v-fow0^cePhe z9B+|ZMghuiNuOiJS;!wNWTAa#N7d*}IT!BR@!OZ_CtiKPp|98RMK*pm6pBcQHiIoP zHABv#p80kVN1~Iec=Th z(#!3wxr~6?Z*6I@}6svC^b#>T{V?YjhH@6Cs(6B(3 zKaw=^p7lT^>tyOR!LKlhd)!!v*EbM+{_XUfKX2xQMh(0wCk&_xw7+iv*AI_Q10Bch z#*T`Bm$M~%NFuZ{fZ3`9FSR^O zT<~7_{5@n;tVw}V;V_(ToS6~5!!-E;T)p=C&uF8xkn4h_RX48AXS)5T(#`&$-`hNy zRoQxxtAZxaQv^B}mo}|Hw3rYnJUYpb*0g8l2X@1TybWc7o8bSVfm$OS_**>Gu{5}@ zPmZ>d_uI2qm!>5GJB|FM1{@$TxW1WWm;E}sokHcOpw<$|a6M(wTjjt%m|CLYSneS6 zy4axU-=)a?x+Y?^5lAm>-5*ch*Z=G|LguRnHZ`Se5G0$s!+pi>cMF_)r*DEGu}=eu z`U@31SQW5qbXlt0$K8~JalG1C+@c{^|Mss-8+RH*J#QUvPw8CadAi47Tm<|kFF~(O ziE+_C+P(@1HlF`Rfe8Wqoy|J93DMy?J8sZ)AHkIyC|F>#H$&t#TT;NS`rfsy<9>hv z6{T0H)6+Rx7_><%=?_=c8k8XVb-AyKNf24^M#CP{{i&>lLtASe3G7%t(r~bVxKshm zfP6jK$TS_o>R)=#{3s9Xd<4&q#TZ6eM?O_AoV0=_E)MUMZoPmn{7?MW&9ilG+c-QCLFO9}Ie}fhUtEYb(?rtBa;|~g-B~y;x^trVO zpnX@m!*9N$=FYeK8~ShMnR-Wv$64A?Icc{e6+FkIS8tRZ8y(7B!yfwz&X>YMDllu2 zm{DluRVg9*T;IsI^+UNdQ;i)xCTPoxk5=rklT_*Rfp3>rb0)BxzVrxyRR{!2 z7pYkYm<*W1%u^_%gCRzk-0eU=_1o?-(SyQ~;`=^UhKp7^)ZI%*QLhM>C#bs=2Cr?jWC)`*7hmO5K^Ch|&MeWF1@q`@>OlutelAB+5Tu`4uVR^}@b2 zr{c;B#)Hi$$>^g0V3A20UwnK*JbK>awpFQnEXFy)`GQiKH>smxk=)&udbrOF9Dx~A z55U&`^}j62u{a$!X6lUdP7COOo>aBL0mT6}Lg@B9_H+H!cZFdR_kU0As%{Lt>&se7 zT1xhl#636CS|(CpA33_4hy!R>v^j#pg%h=|1TnaQ=>?sR8LBl}OSK0qcZZ#!*>TB*p1X|C!ur)O_k~EA+ z9EVbp0Zwc1Jx01G4giic{`dABW|#{A(somh7ftr14YkpK=)JsCY5$EhJEWfM z=)Zj1wLaVEPZ!$RuD_7!=V`KsRrkqaiG2507L!FshBUd`>Dh6`vdj(2W}KA9ayB3fr2C-%) zhrE1A^M%J0b%F;dcia2)BXOit4yYV7DL-;lPs*2H74d8(iCG(z{-;*yJLP1Y2y-Iw z0Sp~|<|?=MTf&c0`9_AOclo?UtW?Ho-unCCklPCkmj;7ue@l1EX~nnG)?BSCkHa2ei5`o!{#` zMsU0Tp}~x^i*$TaaHM;@oy7ik zX%A~97yERJLOAjCc)=>3B=4{eGrc@OsReZwC>kbF$3^xR^vn!1NCJ}lX(V_3?)EKF zZ@poCvZ|aXdxXt$_!pJ5Q9kiJb>S3MYqRSIU=ejA9~V*WM6N_7<+tO7N0G@~mK;+X zg@HX^(4-D?mr#FhFymCCm}V?`V9oVgh%I!=zmra52A>VuTq!4JLB{iO;Bo$buHGj5k^o=3!9Il0bryw&Bn&9sjRB?o!`0R}Z- zquBV!W)0Bqn!a_*r@t}79v|s{&}t0aC)bgyzy@UToxY-6^f9Y-F={TpxCUN-5@fO} zMde>*@eq`^-Wb4 zhi3qnHgx>8eXo@lS3<6#Hds>Z>C2vRbP)HeVE)LEhtt1eHrY3Ku~dJft>C8L^?h+a zaAUO#{&+)cGkD2e%tM!??nS&01SY)IM{&-t^cg2-$Ki9fFynzTJLxvLAYh~>Z_sgn z;kiKbF+B=LdsY@Z7DW@eN&)+jq>o7lrO2BraaK!N0&;|p9$CjQR=ySx7!(bWs*}tp z{;{EhJP@+)h4Y)?XhLIhr~%|!-L#bgG7195GY68Tqq!-wyz52U$_6L;*oqkuQoU^8719TD^QP}+N2yOcn zuV6lzb1lwu?S@mJZlGWs24bl*cJKYx!j_x(O}t|d=6#N^1-G&&rV*%qN8B6CRG?KV zvKNsw!>0-unHguTXE5_kN~8EIMEjYwr3N{#VzBwDamSA>Uz(J5b6@^Ue5RUzcRIjG zHf4hkc?VH5eWGF1=geZ`YMP|%$f_VBq!jXp@xiMg0nT1Dz7A;`*Br|$WRE6)A4yJQpEroD2cX*t}Hp^?1cj0DpS!Pqz zHi%?U95~IfO-OU~+U|d~Sp3J3iX~-g1FMSqR7RUmp$qy^vjTm`W|rdrAw^4}O!QNc zxXqm6--xZtHb`)s6cSSh|{_yNjZe}u?`EYc|FdLH#a{}W2M zet|fFtUTZi2G30$2P%)6%94TZ=Ydsqn44p3h!yFW*m`j;IhX@TUBL+6y3v1vonRu{ zMz_B=&TyO*m>ZKku|-K%X66-IUlJ6m*_9M)EQ9~!x_FyBvL$}X0&$?{<_Zr4z z*Q5P?94DZM%Msh_iX|dsQlI^6I)lSk1@|vVOl$@)AXBbEK?gVP<9%g6Qy4S)yE_mW zzLpifKgP&at(gUQapQJ%ly-8I?RXSrLhc?a zDV?;{MI3a9o0SD>zFPK(50s^+kAs!!9?*a!xn0?&khWR+M(kR zd{SWGEC{NcX48;=0DrnQ3=8@oe8(;DUat4KF6H|VSmK&brNTLDT$_zYBBht!3TT)A zE8I+ZVv+&rs@HgGDb}~{dhZqh24MBg{gCXI!q`{r?R7rN;l63&y+u_DxwbQ`Cx%Vg z)RzqP$0?hHe)*Y@a%gkPPA9LLKg{KyKT(9xx4l(No2_b*3Aywuz zim(ShQ2F1>s&(@j)~qtAzg`5kv}J3Oc!4rQ5?GXycnk4r-Jb&-939B+tNfKx zDCm@eGgu?u%qnOkjZ0rqyZ4o}7eK1HYd$5(QU8;dOlk&9{sq%LnUb~nK?GFyfSTU8 zd*^(I+@8r4?FeRrIM;RNw=tlWf zxNH?sfIe&11E0fVog>r4`|JcKH3yIuNC3EbSUe9#{7$D{^dN_BuoxSoeEk&AJOwDT8 z1GC#Z9S|+l9_c_`S)K9$TO+3S8tDJ(NjsjeT?pF4 z{_RvD&B+u5cuRnobcM`x*IvassYST1N@DK*cI!h{V^-h*^O}-FDq^K^ig1=_Dt+qw z((|VZYBW@3yK@Dv1}$P+9Sb~f7H%f*<9|vUffl(YiiFOszY{)Rm9;@ILkZf5OPzIv z>JTL3yEUr*=%68n83~SR@rJtZ>(7WURrJ2*d#dRKFaJIGLkt>gT zv;9VC%5i~?&688;xX`Gs7NuJ*m$6Ji_a{PJC}eukv_hx5)Iwcn2wYQRU(*l)2n+#_^UNyfRVDQ6 z&W)1M_>uqlDn!yODw(}OXish^9oMg zc_=xJ|JoQZkLBUw?%;0gLiF(GjX2vtvP!Yt^A|nD}ja_SFv8Q~FgMeLFsQilU9OBd!RmTG9_Z zPQHcZC-xQEhkY+!+3e|a>A!jxXK=)#Mt`8{c|;d%hFVf#N#w}pvG`&M_xN5Q<5W54 ze_@e*^E>UU!u#3H6~IvD3oc?)XMqb(n!n)PZ_TZ;`wfTI9q*Ql*4txFzpIoMyQ;ZI zr-|MHynu>(*jyUhB*W-p+Tz<_L(%@MnmFhmHbrc(7=G+Q+0ZVFVxsL*H;I0w`|T(b zB7c(A%Ab2%w8kfQVaHU4!ATss*9t)gt8}sMBT(a!a5?jvBlI#}ZTUta1~9rM63rG9 zOj|HrcAd0UX;9a>a;frmSPz{o3@1o(>qrlbcoX|NZ8J5lP?PBWA%aIC)-cwvy!1tU z(j;sL{^mj6;?Sj#rps}D&la}-AQ!V==G!jeyOt+$QYG>5;o;&H^%PT;9&H|!g`nRO{^ur2h%Aq}MeLUu4G7D6GX2f!{3u6v z?(LR`;SU6*8QWnUqJx+wCUZBqbmisisy4{+I&bTPVE3)(0Zs^0wDgcBZzN+~qI{8K z%^^b|q?61oQqihmdRooBB;_MX6y$peFc_`u-H~&qe!C~fn&201K>zjz1Cgz~y|jKi zkx=6>D`4^3bk#K-O)p?O(ipiI1_NjQ2%RN)j0)w&!}RyWTNdV7OUP93pw`N98| zvE{+LwNSN~jXgUZE6tL>C*jQ$kWAvf1p>@{q*U9*-MdPRs1E>bU`F|s9TX>&BBTlZ z$V?zRa@gk_(m-HMKgS5k=^w|glLhk2z;RV3PwR50a_5aLIB}-FfD+HkLX#aphhB|E zP!k!`nkVWwb^0>s4}Ig?b)9aLQX~^ZCzY?ac~!>kDy4=-au1 zhh1uB)vsrg6nl}p!}Sz9pN3^OI>e)1BgTo~iIWDr3q@Mh#%fM!*C5TCKF~*ay++~6 z+8AO#P@`~;rgI@C-Z)S00dOCey8iP*-Q#cWYSHI1-<~p<%V9;2_?UH#|1P87ar>8S z&(nknS+m!3kA8QqkM%u&2o%$B=J{DPN_>m)Sz$Bs6nEO6gkg%el8XX7^yLaj&m>3g!lXt;#nXVApd|Y9L$YbmF4^} zu$JRyk-F}5%fl^O!8QS+N&TF^0~i>WXIQGHEcoy5y#_@S>Svfg~qRGGiY_;Y&^v`r9&@e1S#uWR34sw zJ{!Xg1N<1;xuP4sI2PQtLV`XwjC*v=BX~lD+b*5Fsel%)|H@Y6cO4?t&&aSnMGJTn z1#q^9`{X^1{m050{vESgL!glDwBL>XUatmbax~oKMNBw;)EF%9FlUOcdjjhLvuh;TmsM z6u?_Ax}4|Jpm`Gqe7k^|QGe&9YETTogv5C!qk#$68DncV9(pVuO8;GcD${b8Blh!T zDN?was9a59U#g|T21?4XV>-Do&(Yq{Ocy~Kq~@w0BQ-&#N2>Jm{^tN#PF@GvdM;KT zCzxae?J3Ny`*s!UC^s0R2JvA+@IUC4a%89{s5(l6oRt@3?cvj%EUK#iwIy!qvpk?e zXoK;WfaNSGU#{=SpoiJ^A#Le{LE6v0l)y5VUM-K7xag| zC|B$|sWIlH`5^gg6To9~R91!z&elg83XC<<@MXD( zv2hZ4c8;#s)n=S-beyY>XVUySPhc{6Zo;Ni#U@(~v^oe0x$Qd!s zs;CNeW>VRZE*?3zh~scs4h7KRC|$HI%Be4Tth~TYL4PpBQlsRo@_Igkm~ZNvP9e;; zTPaQ>gLz0gnE_(l-95lTH-&_*FKc5mSJDX(9pO4?iTh z9LBW3U6n%o8QIz}Y_L#WV2OZ}Jtr0l0|ltKlrxlI_v% z((TX+LkAi~>Zq6>_RP7h@{ zYqKJBsmR0pO_#SM+(;o^nW5)Tkk>&!fcvbY?g)tL(^@fhN~7I|T&brluB~i|vjZSQ zk^dlM)cy_A8E$%zs14q??8q&?USKQ zrfOl}yJ5ytyZ;LXaT;{z0JO&HR_dM9v+c=-s!q&<_J3`HAudndoE@6|*aho`ss&;|vW{OQo!3&MRXC@{1J{ZH4hS9$L zEpYCOhUSaOjCR*nb-0Raco@kRJ6^oh+u7Zw7=`8vDNG_M#gVk>rPOANS!V62J5`Z% z;4foBM925np|a)pNHZXEPzc}wp<~sMNXIRzO6sn3<7Meu@zBa>IYxlr$hq!nSGB^f zSWU4mrO5dwb4vZ*no_%ws}Q!Zpts|uHd z0=L_eVWV@57ots@Eer67c+I*==}q!VwkU||cb5G+LL%9CzxdEJoX%2t4E#X7@8)z74ztpYapclMd=u0G6589AmVvLxhd*>IE=b$=cM-7 zW}Z6Jzu6A+JC(RqZq}#K#l;5_cgn}7;sW~a8W-g&vQB&|kd#%wNYAdVs%I4DMwuAC z{;13ot!U+~X%y8ydpcF|?-rVeyG$yEaN!02EHMiQgu2?+ZsuiO#{j{l;huzBC1v#X zFlzA=nNeNFh+;s)0Xk+%)V*=Dn>paCiKA(5H9xUkb=fF>uj}u=!Lu3LWY@#`FxRo9 zkGzcod@LmF_kAvwIZllfX^ETEfr@ti)<;&mlm$Tq>L0Mfk8Dn-QTy{_?hwCtK*` z;@~d5w&f<5f;MvH;P%}AW^n0}Bl?If^=jMy>Qn2Dw?Eh9#-ret8;Awn*mS1a8gS)V z&CGAAc)3OcqejV{o(;eob>f0PnM((=)Fu|}|J+M0=B2v1PPsR@T>&~CaciJ02^AUA zz6PwBAB2_&NP~K!m2Gd3OQ(?{x5q=qIU41=I|kSOM^Ql4HI1FLZc^r1?W&=WOxSat z6OiUHMF+rT~xvj{40whDNrrW%jdsL%e^TSCbJjhIq&hzcZ zoM62id0^=Ecuq*D!Hi1LF0;Zxx=Y4cD};E$dgLNc&}tp_U#gQ4dI0P74UZCRzZjSN ziQd1pUNwVTBqur4XJN{3F!t^bp@Y`gBXxxKxC2AE34B`VtbqWdK`;sm*6w>_(tawA z23Vh)66>7E*7CW{3)DDhniRm;>^fhl02ED4@%I)|;pt`hj~ti@eI(cbstf?C;yBxW zC&^xR25|mQ%p|1}Xgid)b4WXHrK*>@`~?~V?^tD==+?ooJ=62sd zQUWn0_#pmLd)8nEwB^BYL)G(0%7Di2-f3|?A}58yayTf}WCyn~e*E`;sxp4+&TFRE zBLGs|)h$=OgOhG*ZQ=(RJ!yNv)%c#mJLOGzPFrbF;uQvcf?#GO73FwyAFRHfbYc(T3J@9GdGw!iPtRZ z0R3*SUQW4~urR2-S-dfKD6V^QJnE#Nj~^TtDqQ5*s4uShi@aEj5RIxdRKOWzC{#TR zru4QEG2qr+(ms-X3AN1g2Utqs=8y_PUe zVW$JJ3pO^k`*CmobKRD!7YTw_^#+&llm&MOgwDdH`Qt%QNdfe9Vor#&D{OMH8hwu2 zFT!57?E°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ôLY9#}wLHDMn~E7T=Nn_x2?&tuWIY& z7zZB)4i(=f8ScO)Czq`>?fQG%5o@2q8nM zl85u^%ugGPN0(R652WD0V~=uloXBsr_Uwwo_`K3cnbHt#wnEU@OGU_6L4y1{6GqcTBXIE5}o@}mw^8VZZJbrI!_%# z5m=KF3n~5D2j%EYSWbfpH;?>OjctU?DCQ|TrgumGHl}|<0H*-6PN{MMhWj{g|4o>j zV}0Ual;7w0B0XQl?F+J>92^O0oyZ4&DK{yhsZv3DsT$w^%?LUK{PR99EBIzqnde|{ zZ!Ts_SXelC1>bbqXDO&=t=6pib>7#=Pc(R=BS+B`Ymdn^wJR42V9V?T|F~K*q7N+y@1f7fP6{0eHEW zu%%n}7t@+B+z)sm_Rju;FR96G()^!g*f|#(mnXpaOQpg|z7AFwz*eZlh0eqn60P?2 z+_OXh2i^>SjvQp<-ot`Mqvw1Yo0^)Gc^c1=%~z5sg z#vh&~zA%C{MUu*crJ6p^;Jh8r7eW*a9upmEQ2u%LY5X*LWOgzC#}F6g*@vSD(S(O8 z6(9NBRgzR`qJ`uGWJ5G1H^DESWa#!-l@*Q^xh`k&h*6Q=13*B$y<{8}O|1?NidB^> zWxzHfZclVdt)er(xw0BSYDCuW5Oe^So1b&=0D!+^|0V||G6R52q3hD{os?I+oiMX5 zb$r@^$GSYnA#}Rt_kS*HQ2$O@7Rs>8Cpl<->bHKVYZ-%9`i5GBThZPc(PVl>2cmeD*YlebKq-Nsj10J+E)?~ zO8Iianrf~>f#`Qo7Gc!h4tREsLuzFWILPW!zi>b*Qb1Cb-Mp;Ye~eIP>V-Y8X=ow{ z@(1!q6R)-Q%WA5Z{>D1; z8rurldMgwt3d`uYo62fO!*Xd^b{d~Z{wTh->HMCjR6InHe&ud=PbBpp@Cxy=!pQpg z4GpxElcyiaMfx+bH zKL)lxhT3E-2~li*eo1oAoCNlPP0nbgQ&7HJ(5@}FN_X5uK`W+gV&Jq$Tb=_hUawy# ze0+P31`%ijD3K7;7kkbxXm;riQ`+gMY z{f>oUl66{bV79bsxYV=UDBp)^5)gONQ_=Ir(NE?qKiKJEZX;{$EF&g)LQ}la=Fv|e zyd8f5eP78GLt)yGoRsH0nuY#3CE0eC&0BR%N44oX^Bg;z!w26JzG~tz-A2>bqK;CRRgiG1dsLb_el;)pQ!JHFUz7$v7D;n#5CP?f7s}MJ)ANudOVawm}2iHVnR)uT@D==Vr*x+}0(RV{&O{+|rj0$dWfRp>+QI!m6{exnPHppc=RUqx{lU(-h|^qj z_n_9Sd8i4kU(i^b*t5^pW!oKYB7GNQ7f4mV>p3}&j@nPF(-%3rllOq2$L8NOF>{m~ z{|=`E%Ok&xyYR)8XGQnewO%v9S4BUqsXCiNQV@n|E_QVTS2ZlMoptdtrukUk_7p_+od6MC*LqxP74av%kk-C$k55UC01HY+(U|LK69U!A@ z5>_(t)USBJkv>tC=2aGIq8of}prqI;3(qCtVhgq^c(3q+q@GN;S!PFZwY!@;;4h-u~rd6@jlDNySt`Z>0=frw4_l zjBEHwpYS=4kQdJ%#eS45!dZNI8_FF;x=`g6;$dP?btAEaUKALTEVQ4U8}i@t%R=?9 zw+n+n)7SfUAl}p-nT^mkUR666eu4$w^T4Lz6q|PLl{R7sAG!BSO(k~*CWh>p;hiXo zClq<~#bSiYb&u&}Vkq>26V^f)EUUfwX*_s)PC3v9Q*(`KiHFo37f z-fsFZ$ANBhY5;1S<04}7l-Fj1ey?SngNM`jIDEhm0Oeg3R2{NFH5QZj&=o^mjE`vR zjzdaos;U^=k6&iptk;Un`)b{Pjt?aAiEgiP6Tc|2CJh!YI0x5BTc(J^@1;r1fh^&C z-+oQsvf9p!&Q2nn4>631gOfu0Ww!o3nm-Upw4L_~_F5gyAt~mxLPA2yKKAn-N1n!L zZ>q$CbiKJ?m~jQ&gcgiu?cgy^=NfvGTTDCfz^%+}xY@sNWRv|fm?;gB2z7F@)30%9 zJVK3`{1t2{K)4aMP#WHQUmFG3(@*!lFU&bbourjm41Fo32nil4ZUgT`aoekMySQym z*~h#jaNY}`iVEMUb0;e*tF<`_O10jYEF$t?w!`V~P9yx4sRXCuQamV^aCFG7ZZ~mJ zcfm!ZKC-rRPoDMbs+H}FMEBiCuE?t}K>Zg0`2Y)j5L4yQVt{=VdR4Fa`WPGZOP|vO zTTe#el6W8 znDl-gH++83Oj_qM`-U}cL8yND;?2RKc7?*!_m9P^Jf6;D4|Y6nPW!kUFYES@(*e!o zZ^SQ#Wr<&c`EbMl?y$#{VDR0xpQgX=8;|ivgac zng8_7ev;EJv3nsJ5>9p;kwV!;AJFfHZRAPr1MVxF0h3j-Cj@w^e-&_a?ixS-?oJ@< z%Ig^tM+fd-^ou zbId}}U}vo}?T6_AbfYI~i_()!J?BZO8gLGvRv*D1+;jF+Ty?H}1aMD_O(#{oGZ|yR=f|h5 zs`i&Kcg8C9W>8z^0vqs58Ahg`OC?te3tIsfP@sZvPBzw3_VL){siaG%=KS;sUqH1m zyEV1>ajg{~aqO+C+TIZ7WURHe;Vj`|B@@}-bC;zEnEbZxB)xeBL@K5;5EJQ6HkiBrL6D~Zc_0bqh{KT^L z1blCwB#H#`i8neG;K^!MY)MDJ>sc$jto+Ln7Ev5o*;9v!3?Ic3C=UX5G~lY{BkUs* z7Um6Vkma-R`ZD_NYXKS|uY-KV2eXyvB0yrq>gi)p3Q0BLR(#&~WDks!mpNc+z1R3F z(9%NfNULbzTO%B|u zPwnki^j(gT4|eZPn7I0AKO5Y*0FCor$c?(VC~_NpGir!@yYyWZi?E0B%6&>QN-_3r z$h3P#$Qj$v)Xk_tHhI_S{(lKpz_0sx*HVS=&2*_A)Ky_-V`emP%5n3RwJ7^s`k;Ig zqK&(-W22cYB_^%BnaYvB&(uf=>!?woSdwm!b2htWioQYh8`JXi2pYwyltwAc@C$v; z{g&!`7J1{3=5u2UNEtlK{*(_X@)`G^dWe$SD-5}p3V5RA z)&~<~fh5-Z9o##he8j2fduNAwo}aG86}m-3Qv}@)_s-fw)j5RNyz_OymR9MWFSRV} zBWo*Dxg1Ib2;;weKE#jYV};FD%}iRO-bN2}B$s1;CO?h+VL{5IQ|6#eC9kgrAB*%U zOX5^Lth24Io#9nAnxWHRz@h zB{f3Uj$^^%JJo_YY$nvSz2QdvMaXrEHfr(^fd@fZ9YXchGXp}EOzGoQp9gPg;^SX$ zM^erS3H3NlI@)aqtd9KpqW9@}t;Zt13OIY*#mQkB`#504qM}wPu3#jZPg7C1QkUA+ zVb_^W$Fuy&*gl~oA2sTUccQjkSda$LXDMDlCRBTn$mIIxV*r1v(;%MD9aUyeo7S23 zd)(`=juP$#h#4WjcZEjzF^dj zVZlP$naV!yls7*1kbtmPG|6J?EnJnoJ?gF3MZ_kh?TDu1h(&$vL_vX&ZD*z(;9#au z5Z>wFqbf+D^KLYqCb^bX`lA%#p!cqq%EfQ@*T{?XY8K+*-(A?lgMFG+u-c44(vxzV94{g^If~36r|E+)m@^jsvh_y3TVK z{wjJfQ=K^pgqjIfR(V7&K}tX*SG&TS6{*a^^2dn)2W*`}#uYanZ~sHsadLu!f>I15;irITS@ z$(XgWLvrO*(H@8M_SvL&{ht5l;O@|rpa2~55HI<14oeMX_m}Y%zh>;aw_{#9_kFK~ zyk)JqYu*3)X?}@ggq-&YcL$*({@&EX$x;rN{pFYMZOlRM!P#Luf+B^|r-ZqMW z$z5oJB;?Vle*-L#$xdST!Hx6x(_cU3?Nm)ISd|NHB{g>#|Ucgg@e18@{1%9NgvdGEmNV8(#@- z&D9j!tRe2y9~10MvDq$L1BcX_XIu5!*%1N!qubX;oMEB21dN0&2^y+nS{zbwqoXuZ z@gsC;MM=W-aF&r-#9Kx~pKFc)$ z5e{!QZ8na8BVl0}^;?I@y@*iG#^IvW*x_CWJ-|WS{KDto(91>kAJ_t-B(^Z~ftP!0 z<$D?+KV#z?57s7QftgL{JLWmn{Su>jS6;Ss@CZD4QRi51H4+Q|V}W3OHNsw|I;ri* z?eL~rB*po{yVD$j05Z!1Gz%xqp{Fjb)8+BS2ma3V26fuMT?#CN3M^$^77SX&h;LIR zXe5dxBWRC-i`s~&J1o&PP1XwI|xOaq007CP_fHI?yic!Ow0!6$u?46*RP$Y zw*7g-JPv8SfVVTK6UHA&n`(v5jMzW4@h?k!oBt`gz>=C0n94!wik2#OG?fxXn4XFJ z5phMUIY0e%&A2eqiaU)9aw@q^0#rJxxtMY_mGXK=a}@)_mr3Qw7OZ6y|g$%gC8hU)^vrnZ*A z*ahCvu@Fn|!%0EoG0#K**7BrT_wjR04o-o4HI5cvKAAJrKH*k8#And1s=i0Al=@02 z-HvENldqs%o_v5)*nw&;^->N|HGi!ojonOlEwOM0paXAcM3C6+liph<>g3r@k8ay2LR&}ONz7t8f>QN6~+AEZ*(hv&C zYZXtVXb#Y5#`6P;CY)n}gu(&h>1=;vLO4x~IKj()CIuAUUaKD%YVx}F4lcvP8a`kg zTy$T7v-^vB47~oXb1rs}XfAoj^o-Xj)y^qN=DPkrHtcf}$U<oN! zz1Zgr{!GVQ!*h;Ps3!p+Cj0rn$uo~QA!fa70rgLsg8PV#6ofT(lDUE1P4k(TaTdCU zwjWF^b9-!#I?_5Y0PzZS8lP9ciVVB~q~Ml^c=Mx94LizJ`uHo@Kawb25+W4ZD&hR{ z<0+%~O`Bb!tIs~kQTOqZ0hn~|P;ITI3|^KLGN;|~@q%npE!(7*DjBRQ3H(;ZVM61y z(KL;V@q&06gC0BsH3gmww%i4 zlzpytnk9QjpmW;$(cH{>TTej}VTC-i+P^3ndQA6ipTOYzorP983vhonXt?W1%kWbHcm32TmErdPi1! z`%W2J>0E4-`MWYIa1AATwjEJL?MwvA?`8AlOH@ZNyylO=bMwZOi}d__CcV%41^SBF zRz3l(0Q6m^J@3Uw!idDw$in0Y_gJjHsz2is<`eIji{W2RG64{1$#w-4f%jYnygT`1LcI%PnMK8&8PG^m45(QjOW5I zq4E?VB0Yr{ws{Vi=I>J<`~&3c*|+fdqx8Hd5;c|Jc(0(jf6g+ylXJc@qM~-Av_c+q zQhUI^e0fIsl}v>f*uX7>qm`C9Or9WGl(mY$CViYQ)trkQ6#y3h zpO;P2s(d2DV}dExqLv<~0qYKpBG4F_-wi@& z9w73BD#Fq(XbM~1`Ke_YYyp?x{$s$WylW{qdzz{7XwJc<$eRTOdDHgt;9#QU{;#h+ z6p(uDdSG4x{d`d8033jlBK!E?BQW@gfWh}~c`tVFU-uOFW0M4s(fqgkZ%%v;|7rYp zGgqLz2yOYlPWAx*H30sWex|?TmwyXy_=|s!z_j=XpaK3@{(pDkubt;Nli{XmO>Mv> zzMrvh%XoY64D?H2&T*%~LC-uXwG-InR(on#uy_M-!axG^W>8lx505IxJ1uVtYx44D zby9-N@c!qX|4(ZDHwEY`43L?u@Ht zVJ~W$ksq05KSFCyZVsL+ad<5)__(;e`(BE?w#}Md0g^`E&vfYST(yM{o+`tSu)FeX zanBgvqDFg<0x|7+*nv?Jvz3;gadp=@xq!4%QI%!m!-v%;cAmgkM`NP z)(?%uqE?1kzv&M#b6N8in1q_fn%gzB&qDCR5O=_uy=~*ce(Vz%ZJOaw;8HmB2JITS z^?8YmpNjbfFl?D5hk|aQ#7(HXjP~}93g8J5!OY8QpJLxbd!~Dk*Gkt@>A_1AGjXq3 zheY=lc2rcSI%A-VZpx2dC5(!EJKwy9s9m19C};Y0hoYb9ZN^E^Gwwv@pSYS#`qR>~Mp* zt&FQp0a8f9DDDvoS)nHNfy94}Bag?RJW_KP6L9G7*5MxIrls8XfGy*)w0TL~wKc~Y z#i;%4Vd-tF&k|;lnA@nKvZj77#t`E>SesSQDf0|uw)a!){_EG6yd}))ek?S*ZOS_8 zplRriq0EtWUc*77Li5hR4;c$s%~}re5~@`6^D`2VoQCfnV~N<-m?;7PN(Tq;)Z7G! z)1?^*%WUO~d~*l>7qs7ud~{m3mRAo*(}Oz4Cd!!NR1yubz_#xDKFf$^ioMAq{~=r% zO}!=Gxh&Vfn}{x8IKm{bm&vlRk~Tv@m&TZWEo=jNk{EjG0UMn^9?n*H)Y!GyCplzX zu^Wm-UD+xqj}fl@7Rk8XkB|M^sOuig*xv^{N7&&m$GzPw-}4m-m+LVU=4gIIK(Fz4 zo5wELXYdGBtBB z=I>z$y4+t1J>CDXczAk^ZP@7K3EVCs&h$Q~k~xjpP?I*0zN(7N3PLfKVpkOw-8x>G z&IIDAt4(zt1#QG{eGBflU4nKRLs4fb7b=KRRjz{{SfT1l)pyyq-NO&5f;Q%T8ct+w zn=oHXgX@e6WlXVsbFNK?rZo$6TUnAME_9Y7ZvgbY0Dcgi*NC3YGI<97)_kx7k>M9c*tNblcn7kMS|a5 zWRVq&%eXeuFr6Pa`Yd>_xelRMLz{2ipyx_D5VTc|n-Qi!%Ka=~v7C4G7AA$`{C z&&sh8%Y6&!YY0uoUM9t6A_vk-u6I1tB>8)KV|}uh(5t7KWyfgK`P;QU7a`8Qx-2w^ z$#XM6rs1enA@g{%f*X7A+u7x(Jsi^1T(dW7x->s33~e}t`kze2O6{DR-tHXYmo|70 z;14aKVhyX=Z8rqe_M4CxYFAo>=nmJBg;SJU<^pmCdhyxz2m816Js|JHyP>(`$&|%- zR0He}?GGyhPym&?9S@tEH|<;S{;W_OJ`g!k78>LUo_)q1it`r?RX%zjRh!T+3YvaxdG zs`H*?sppM^OiHnGx(Sof?;{7jszn zV*6eK4f+13ot;xm&b#(HJpkN1cyv2w+IMio_1k6VvU&a%p`|8+l4X=xEAnyOt9rz? zQ@^;atY<)NI%p_p5&eM}dah;4zV5Cjb=k~^Uq;V%Eb?&G&&BU5CkPW#RcHzU z?}TYg4PUMHZWMUV@(wr`GXVtlpWkrCEBAeZuC%6%PSAH_MZLeO74%FdGH$13_By4_ zHueBGD{u~Ne0i^Ja{KRWN&A`kdxnZIB3Q1ERh~&noRFIoub!pvYWN&IiT}H zrkY#-b|K3|W-(Mg49BJJ=4Vx*E<2Oh*7gQNT8~*;Qn4$i3`0d==k%P6?;#I2dh!6; z5S(?FSmN|5KHYGxhCNripY3Zwu}Poz*Mu^QV5`#!z>49mQt1;v|1`C5xt0D#@*)a& zwi7>x)?@v`I|YrWOascd>grsq9Lkjn@))7o9912h>Pqd_3q>= z6nl2LlHEG%w4fD>F0Be`k``}!KfHzw7)GL*W5ou`546RlOhS|Q>rk>ttnJJlT!GF^ zztyr1Wgl7afZ?yJ69on*=k#zA2gfYzbUW7gm)%Ybb`5~qsa+uNh_2_a9X6g#rk6JD zUgUk_+kCJ);k-T2C1zUBpeJyS3_P!Jm2{5!(-Sqy6=N2~CV<*jwQV>9*1OwY7SEst ze78X!^sH?%z2`K1YsqP5kenC@`7#CuthR|jy%L(-B{~C`TqO?9@d}=W8ut_T2iF>v_q>x0lGkcb?{M%5x2xWxgB4 zJeYMqQ?Z>&0j&Sn5$sEW=gs=qQk~yQ{ZZroQ4Qw$XJ4}#*xtc@0ofvpcRla8_iOJk zfbjeReVHtyqf|AJ4&9DZV1{k-7S@Sl-pJGw}Ck3cVkW#GJVr-UCI*{nV%Sk>6n-;yM+5lgn=?MGiOx=dIL? zp3`x-^xo@~UBr^>$5YbM8&MVVf6bzT7dzu#l7gCz(w+}F5Ud@uoTi56s;lIu^5Tg0>pNq#E{r5PAhX6U_Zr=p} z+d%n$ccZ`TEZ~}@3!ebX5oq%}8zc1m#t~X^dcAS|cLLe3U;1!_ZI0cq8Y;K1n};to z9!GRB)Si_3Xg898UR0@Af`0uTbaHUXY&x|qU(7s2Y$iEOS=6-@rZ+B644546+LQvX zJ_ttrv5XBoWoDFI`4i9cdmELiqU!33^wPub&SL|XghX!bPrkyz**s9pSU98Cc|l$? zT=U{SX#dux_e~3MX)TY=^XOdlf7_khr!v;WxYbBqN^UQ=5BeR=Wd)y}xPyMVcbvAz zir4-0x(C{KdJMb;2qv(8&Jo>AXLKWr7%33KJ*s#P*`8YhKoH5n$V^;DMq1j2)pBJ9 z^iq3hU`bi+Mv+eg>fk8Y^txY!-s1{a`g~+@F%ybjBO3BRN-Tdb4LqCk^11+L1IFZ$ z(Qy?U1KN~7Rea6)X!_RRd6JCJgc^5%+s0>hJSuLJ(=xT-%P;LQe@)BA-3(W;jc}Rk znM9eJ57u*2i^q8n@a};6#eac;fdR@-`w=7Njjj_iy_wI;gdWaJ9WDo>jFC*RLDcCK z*1u~3oP88{RyZV$9)Fc=O~LdnMNwZLgGF8qYH6u5P!?O<0Y8GD|rhu*BYp6_lxy0N|Xr4Gx&Ok;P#+%`%}8aKma4y%Tm zwxFA9=pew^hz2ZK9;kOm{gCulA(fHfOC})V0G9vTrtg1>q5FaHF)!47b1mhA9aDUo zbl}r6(#3#8#4kC$rG&8mos-`tWei%8K(f$n$sF)v=L2vyuy$ik5KA(r!ymgEFoYX9 zl-vfln*xJ?Dx$CuWAOT(Zi#*j$?nl!(0*Ka^KqiDFnk zEoo|E($e}!ax={)?QuppC4)NG>S{ibgYiMOTRswVQHj1}l87gC)RVc`{%DDDSZwP+ zF}hoY?%i!U|M2(v0W?8{%+*T8;x&-2MGiA#1GY!P8SAdvTyHn2^w8^D%_fz;JCwGw zF=um2x2HW_3^WW3@=6Tp3ebA1WMc)!ywM#<_Inb88gD{~-B9Bt2V)oYQSH0Abj(hN3C?(<1CbAl|HJR9r8?jlwwZCuOFuU;KMX z+NsuWOC>IUPtgZFf^45CV38d|L8o0Z4eMQcXooY8RZ+~j!qCb$=wYO(@vnEJ*8BKb z(mrS81nq%3*-A_>$)Q(Zn$73U<(&1m-!0K~9x|SnA8_gYS2~h`b^kSonqPaNE*)Sv zo_>6QH`CMbU*#Mx|EqjpdHKEdOw3vogV^!1Y^>BF443h@YotK346^@cvdL|SQ1jf; z`;WZ}@?qiWh6Zfh&GVW(4D>yGt=f46^y~ z_D}et>)T6_CUhfK>U>GyjW}l46thnU#AGCvP?*ERl348047us*+!AW#_CEd)YP?Gt zJ>o%|ZtzBOLl6)_*v_{!!Db?}JT^9xGrevUha@ll+@}h{a@jVX#mr&+fhj9J@ZYD~ z)$9CSJ(uak$oRaZYUt2A33T-(Fnx3QdR0(0)Xg|<1$%+Cja}7-Oq92D>M1J-qW&E| zfRP^l;(vbo{}w*ozXxbpg0#Dk+*j^Zg&^}hzVkPoOz@Znj?}P8Z>@_ou9*5PzD>P(zoW}ZL9_^+*_|jX zG>$tEym5iK0%DOV#%6fKG5*INZ~EiQfa#6sxB9@Y57lqyoIW&CDsKqSMv)6i43 z(EHVk#JAPx3R6rS91fp-IHPe~40K`zeiUdw-?0>P5f(!@Q3rs@4`+slMHkfWXmume zeb9G`k2)qw!1>ah(|2$gtmc6I0?U6a8v-k=O>!;&KgY{=iH*EAVkN}IDLIXr5i=1*L&CViSDs=P2G)-v52 z@|bKQ1Wt{87OR7fxBHY7xu8><>lq6rrVB< zA!z~VN}F2nO-0ttRoCI~vyz*zu!113_?5cDG6i}Ju+$!@i7ZUlx~*~7A6#Ca4PsY_ zxo4(FfY@l0PY&6F8giXiacJCT5M%6*e;_>gRcjnw?XF$ zkZvpk6ffGNnH#$T@36@J!Xu5H2egDynUBFGwBR7o~uOMNs)AD|NWhaEKp(5O1e)#`SJpi<~40iK)5`@tke&~{ZSQ}-R7U~e6lr#06-rl?V> zAzKS8qAPm4Y=nP%LoE1Zr^TtFl zD>yK9J=?A8ENuTN5Lf>xEVc(&gYk*H}+~D!KJ(w&E#`M)61uaLritqH9 z-a;t4?7pEyRWF)1N}+z2sd>RZV~j_&*j9lh|H-MQQ)@_fX=x)76F`7p@aRl+HLh}) zV4;E{@l9_>WsYiHky4kw%NUfYVYeyfybE=R8Y(Sqx>WmLynP2y(@~dite}XXQUp}Q zf(imk?n3?MAUHxXy$9+vuIpSq~N2*Z8#? zBRdJ6f#N%3#F32#ff|!9x}$13tIPh7paRCW`vi*UYK}Uf65J~8?cUvaqBmSebYK1I zO+^@O_k2LEvzF8v|9WN~sq5Z;(P^xtHMc5mCtC5?{d~jrFA3U&IxNy<$el`TJq~nl zR$ZsUv_I3drn32WYM^!fShUD`0V8%)(3I6}r4+5dGH4)Ceht}#!Ov=05%*EITPrt1 z{Le@Np0t7g1WsxmwWI`bPqk{ffQ+;_2hT_>IfAg2CqmDqVLKsn<3>nx(HPNQwQc+RKJGDb@wjArR z&*HN^X2d+`0IcgGYRUbjB01Ti(NR7Z#@Ugr5f!%j^Jb=|wc9wR4wpueM$z(zdlt*f z(lsl_K3zZG`7bUk4(4gmKkTlf65kyw!X#ug-`1_(Z7ZvBuS8C&#knoSFz7X_nEv?o zkc`>oc`3jD-7&j7cYezeFY3w-W~ZgX*4!KM_S`A<-QTVo#XAgOEUS*O*stHRBGe@i zxvhR2uDhckcCaZajv1{e(0)@}BLC+3m!;E<5yf zH_m<8p6Ts0HnZ}yU?En_Vs6Acx4eDlZ;lq(kKQnLH^ThFn8s5KB0VJtLUsGP__#&_=U)nSL4+iD4zxt5|-5| z#Sl8249tpTGteOBaJ}-1ihADmK)0n4$%56kUd3>~ho5ZN;=YBglEk3$=3YjnQ@XI0n1Q z;luMhCp$d}lVZf$eP*W-0tuZe^T4>4nkvX0S{VKflTr9_lQLbj+mbA-_yXSr! zqo5nJ*|#_s+1vFL>G1*_&YP!xX5=kq_4o6A(tXxj{DAu-H4um-f6j$x@id69Whf$7 zOY(G`mic@ydQ3H^#R^*y@OL3q<8ffv>qt3D{_};i^JDVvvC@p|m1xTtzQN7tt)x2?Yr?ix}}_DR1wW=Q%aY%kfE*f?Jf7Vxyw~+PH!|i4{Qj*Tf^I z1t*%46omKsRD^Yg)Qj3#_s(!;O$oGZyJt7J30PW!0z3Xv!w!DGhY6P;H2cxEh6kMq z>~5Vrzr4ILMtoyeyZNrub9)169Dk5ic?cm=BXkDw;#1fKJ;yD&iNQ@n79W1*luL1| zns=vBU%8O(R{%e&z#R!7y8n5zk3HxV=@j0Wz#?&#dY>&1;{(wRfKQiD1!>Ixa~v6gKmm zRpvH?wZ;T%tmn$>&i#(sSq#x*5#8~nhrYNShjT&gmE^h2vm=@1L;1!IB+2hue9KF^ z>31`QUe|t&jDRIxf;B`@7@PeP)Lwi4;6d(4hNzxA;p!(gJY|s%bJkrowA@#_3~2K6oZeKH>!Og&Jo8Tf$vsSkl4s68?$YVA}iBWk(cL? zOwY!V07B|z-!0OWl_Et5;GIw#W7KI^@ zxvldgR1g|sA|!T37Sua6^0Kn9^YfPu3iPt=l^iIy#B^dhU&$f~>^YbXUf9P?rr{sTUz)|6A#oEnFdRP(7pWVnkTDP#MyFP| zw5JB9Emj^mH~@48zwePP1wE$+W?#a3c}qZladG9KQ;gP`#jeY_%%sg}a)#vg;5K)* zwzjvcCv~v47syzO@fFiaD3^ui8!Hw2xk%&z+H-7gCoSIX)w+SMM|1sTN&Oi~u~8iq zZYX>jWG#Q4Dz|m@?0gAr&t<3Dz5YyXMlT^_g`)_-bX#fZMtRTjm)8W=BPEDy zgD6}@s9YG;m`f{CXqH_)yL>s%Q)s$R;HuB?Y`a#)t9P@n$rBenU2}35&(Y^H%`|-e ztdybhQJwqq*5Y8i%|bJHwl6#Ox>mb}`?Ivr!wsV4{omwzN34iPJcw0`Pg0Z`-&2<1 zrxmr_WgX(2TW(2t9~sm>SiDSLSyd^1@G%fcM4M4d%D1<7itT@*o~WnS-Q8d&Hl1f$ zVotY)6&<#ZVQT*{)m^QV{E(L52IVNs?-vUYqwCeVbZ(rMSZ|t5a9tTA;?WK@5@T+? zU4PE=iQ-qU5(qnJ^*r6U&gs0$^&1fe;en{>9HWC7b(A*B(&9p+XZ2p{PW9sQw7^R} zyCD<(Yqb|*1cif4v zG)`>$z(wa(ma3A*bw{&~A=(-0frei%q}3>cn~q(`oMBMJCSXpW4# z`vIB6W@1_F9=}glb6WLYurIUAB7;?KPJ8Wgc9}p~v2DkVoA^&jrtXMv%U%4k)si(0* z=DKoV_w>-2=hhO~NGiv?49wEoHm8|NL)@u7Gp`3%_jRiT1b7lq#?6J-{ROf$;#&KP zb!*;_x@?}6JjKXuK0Ni2FH8NFQu5rdTfLtG0vZDtD(veq8XD*i-Fh=^QQes)le@dl z`}kusZCWo3O$|d@lO^l@YAT)PN6V09D`LKl7s=t$$y}e&e@e8)xI#@&ubyc?uWB}EVrIf; zHr9hiS9K=T{H&9-)6y(m{@vYPV@S6W#JJa;*B|J?7+zS1)tTw;@4v|Bh^Lg5K^#IL zWFFjC!DrI8Msn&tFVWn3?H_q+w@BTem6A!o!cgCQB>UkLmIpD8%Yhe#ianOU5RMRA zlDVgB_r8R;b|eU04}L5gc3a4H>6+BlBrSnlj#wU^yLSsz(c4=5x#)Zc^`2m>dB?4u zcc@6N&!0bc#B>_sM&213&eRbW7BzDveK|+3{;bmy$U$vlx5})vUDxm?+UDBU)rq zXJnc^dHUo@3d+{-)(71ot-r4ICz_eiT%y}<>P<4K@e~=JUzmUQ{;1YeDTw&A-*pOM zhsBhvtgI+~eLQx#_0*|Tbw7XlP^)vsVQSp71+?vfbNRRH zqPK4^O9d$#2BQnL-?dOg2R{QtCM=h zjHOWmGU9TT=T0g0tJzYHFJHbe6egYw&vF)9$L|v2s3)2yr6~**=_RY(*6{1~8+DHY ztp*EP-wyH6*txij>`xqMklU4eiGAXKVD;DN%VWtOd+tcxVUJvKo{<4If|dzVqY0MLOa2EZ~h+rWysX(&7~Lk zp_km$4xCb>!t4 z?arOpFjN>Swk-LWG4CXT*59Q&G-XU832=p)c^S-|3Ed<>%k=y>eZ*+AVyAfm_>~wVgOrDK-zQ z9w7ddMLu*o)H67UDR3ytk*_UovtH{7$8S3xJ2}<)Ww`bUYiN6X)t}AiqVY3lrnOr; zqWJ5FTV&tCl6FC-#l^*C_Hi@q`)F}%%6r2G-L!}d70m+4J(^4MA@=W8vj(f(iQ;A_ z_k+Vd^D5l77W@qSKVKLzGkziXCyymF2R6Ij4925Ad?06LW>$?na&N1!lH%zD{bZ@& zvuT~NX1%qct~nBnd=`7_{fo&w_H!f4FfZtkCnW>_tIfax$BDjqQ$AB-k%crgsWmK% z*M2v>yj-w8x!-J1-62c0XQ)IPTRVoVy~$W+iP5OitqbYMrToGx;e1nGQ4mwBH`sOm zNL*a((()3k;sxy9>N7P*#lwipQd2TNySkqCPa~S>3SFr4BUIRYewP?wBLWsV<0N#_ zzt(-b-Wt-8ueWG;RjMw$HS)IRogHcRU{h1v-roN1Zmgi~>Tt?NXS@Wm#3hG%Vy@sE z6ThWyfq8eylUaG&X+~cCa_Wg+8NC#A9ML>>IPWR}vh78lSDU}318bBxdj>nXF5k(w z&rtF!OHE~UEG-SZBtfWmC$Y6v6!@GDnPN&y;^X6~zbVz9%)?a6G&1UQ4<*#NoMbt5 zYBPr4#BCdYjOEwZ0hwm8@yybc{;LqPrMciZ5r@Z*AO9|L@@$=H*VbtArq!{ek-DuWONo^}qVA2?`2cbU2LoD#^ma@`K35%KGRZy{1h`Zx9rQ?QMj!_5; zx)GKRdeKkh!pLQW7mfn&{H?clxVKkQQc_x6X;+V*0w#0)i>cd*h%_q=5xe%lHz($` z2A-;)JrhbWqSH7pbNFX(h4Y({FWB1DB6EtX0bZ;29@>)RQWs?&m}u%tuV_;!7{Mb^JJ&6NjCEY;%sx?CAr2{{g%NK>qqNPUO)R$J055CMB7cfg(oUH z`UJ~i@3)^meWKww^yZBp)XQvx4j(&t6Y06PKCPUeNgKUb3)QzTT?-Kw8>!ch`paM#^Eak501K zq<`X1;?==i%&Ai+zX*7C@A*d-mz1DOEge?7f_D`da)XsoOsi&h0iU3yPe_uO$wg*#kLtuZbp zlM~?e!enbCSDe7Cta~l<%`eiE?-YeyeItweH*sMdi&QAV?;$*x;5Z-(Ag89L zlHCrbTj^=l4qx8C4BxGyWpPvONY9fuyf8<+|IRSr`w1mEgohRvvR38up%4E4dQc4{ zRi^(4L~tR+rx){(sLcGch#^=A0O5s+c=LmJsf~t_G4rP^LZA85p~nxkwMW{9>@NC+ zl{+4IQeBE@*6%gy$XHNoZBCKQ6F+b}z^gnTS6p-cGn8rJt7M>UcF_G|zeC5b!F5MW zvuyEqu3jW!o=KEAy^Bm8rP1zYgYQTwNlC$` z<3Xb~$1Yz7Cu~{7$&O7&R%%j0#$*~}#)+({d^L1MS-H3VNd(odSrb7_L{(LP_??f> zHogeixuOFx&gw*c){naP=pooGR?}eklLk+!{H^)t-?o`4V+1ThxRAOmzm{H843}Bx zSsA4*WcKQ{6f-Evw__DfQcz%rYRm#xbZD(oz6`CX|LINZtl2+3w{Mge-WpNuyl1+a zKRz%pV4+neC)_E4F2$lfty@za_Li6Pv}*>OzF#KuJ*<%OLHPUVTP11>vQuOUaPMydbd zL1&s`LfDNnSFT=VID)umeeANqnc(1qeY}usL$Urc+G&YV*!XKvXlPB`=+wtaF;M%p z^>A4>{H;dC_~QIK%)e1qwbif92CU8c3+p>ZU45uKk=3`=ia)%6|LD!(ZTLVfIa1?9 z9IunEadlL8Xr8xO*c?(!kf^FsC$99ZuCBW6tmv!witB4;48ao3ec!(ytD5buRzDnt zttH{-Li+H#fCXq98LpP%QW7&VS| zIY_W()+rjc*sc)SPNIH5yPKzNqvcY;S~{DVL~D_+E$!Kb(`_-+(a}{9kv(hR3^E-0 zllJbYFFA{x9KngU|F0o`Zg4C`!}@W$4ClFNE#-5eU;n&ddB9+l#w1_`8HHN6y-bx` zjs0c=syC4AVsAj2f&MvGcG1zZyP8bw6pKHv~ zEa2tm&()hp~uOK)8J7hcP*>%zQZi-tfbA&&6S676d8`bhtOqrcNbviNlMS3 zAZpdYV~AVhrY{~nmJ9n3yW?E{>(_&NWtKFBc)^!FVGo}~2A=1?CVJbA_(Q7kG_&z& zsnqQ0We0ovmPk8zDvvk#?aW*O2VKSZOClZ{OQB8o^K6rF_oD0 zx8WB&hH(KggH|KO29r1|#c1rP=O6IWq))G~Yp4GSh$$nZx@f5vsyH-C9NvmS*6tRY zci+xp@3@S@C>pv<#S&FLiZE67Q6gpyLE~5BwAtns=N+&E^*=|n*+sUB_i$V6dI-d| z&;UYc%dNJyHXrIY_wPS?^vEy5>-)Wjdi+L)hKw{c$!<*N&+8i+viaOpD({MqL(>E- zi#S{qa0v^Bu<=3iD>BMcr+(I5RZ&`1gv`a{4TVd5wow@wGK}V;y_8Cry)u?jukkk8kBsQE^+Ac493{YPC3!g^`b0FuZGI|%G=F+z*A<%gu@WXilo5Gz)E@CYu738q@OMPov+M~-> z-^|t>RG~aKxqO0J&rPi#okk~n_MJO-j^ub3y?13Dj0*O^CbShdRS>iA3Mi*}$7NiA zfYlfy1EZ;#8M4MvM_qle;DL=Q{gwn+qEaH4I;R5h2=!Y;P+?QkO=ct#{#YJZTjvMn zH>TrXP>F(xUcl8P+YiL~~gMwCFiTbI}P9Gqr%l5$bfT3W7G-0D+g6Jh@g?Qm4 z<;LyG%F0a6lL#eA`mbS2V^vlS*+PDU-o63UB;V7vBYXY;w|Sa^f=STWSjFDH{^ayb zXIx4TcW=w@-_E_2d_0DoqlFHxW1_DO6=IZXW3y}*+BEDS3z}PPHswWdKTgR&=p4An z5hL(~|2wa1h-`|C)$5G3EQlSymZSfKrgeV4ASQ0!beZMX7nHhO%-t;2s?TRXT07Y6 z8TI0p22^K2aUluVu2rI1O2er#xB2lZc=jSr%M8C!c?AV)-wz#3*}lfs9vnI1ZN5Go zBkrJ7lBr6=<4Fk}sE~Gm6rI3$h^S@`(nxB9r4B6FvciW(KN8yX49Cputf+rt z60@C(TBBqX7#tWd9jYE`dMTx%)9v}-0X{EHTU$H!B>SNt_s6yFO*avUU9oDnJ*7Qg zaejWsxq`Rzx~koxj9hM0^IE0JIjMtbK7F(Mm(CrLd905MR5fqEP6{iWO+*5unR_c* zQH45dX08Y93EO#Yt&$%$Cd>QHJHG$JGkoYr^Q@MzPP}>-kuKB#o*@EZ>H}~0_|Kj@ z$MX{ZNs|v^!VyAKaAdRw(zF__6zMN%4*lB8g*a9TDd3<0^WoyF zEG*-{nrjFIWR(-s(^NSVEi`fTjPqWh1LN7|jNW||&U3jZB_Yc!dZOMxIlojo@Y1co z{b}0@YSw5?QLhVc{@&Y`Ffwh@+c-aGj2@oJdX}_M@2_5EZ;}?PS@6xQVB(#FeX)i4 z2JJ1S)yYQ1TVx0$Bco|Ec>1T8;q;&Y5aFSY6%1L*(D0BOepP6`kC89ymaY%12zDv#mbXDPVTWv1o?%*s|)nL$egon*DkUaF5?L9(*mt5;-HmwNNNnW07_-#QHR z=4`j++1bc~l*3Jlq$JNhex)>p01o1kUqFEC-uhMmlauK{Hm6Uy>&}m?NGl&|CIL&k z+s|$XNW&f;%h!1M_;?B|5kh2tlV^`A?JWe{hw;a^w3rwfK40Sb)xuUrJ@K7z^`Rdf zn|AV_@wyw5Z>6@e5}8pI(t)2nx93w^Y!6M{BPEUs&p>=Q&(m%H!-pBU)QBPSe;iDQBiSo zbIa96@m?6hU@&cMa%}R%*KNOl|88n(O4hs9!*b^i_-;?7rEiRyfd}{F$BzoTSwc9s zq?A-iaq;HXR&ULF@EedwjOgoiyetDeJJ{aW8#4#t;g`*<;r3n_wH_(q`dcWZsQAXl zMr-Je&OA}2%kbjnUZ-y*KYhBixVW#sUw()2=g*&zbK#0O!@yu-X=!P09=pQ#>(?(I zUti)Y257|bUwP#y0)1i|Y!W}gESXBp}q3KYm1$xqknCR_Y zbJFawoZJO*bG+A~ngxM$yUB*Q0=?9DF{j7U(jtrOC#V9?-+lEWrnJ4tqgUplc%jrD zu5(Okq0dHLhoecRoYW>I^<3?tcm9TROmkWJ?|=U;_c(CnH-4^uC0HdxiG}66&WMTV5(?(3HXUxd}fS+r~Rt15k@p1|+1Z|_-b(B~_w z9%{1r+Z@}F1L}G9T(Z-P+gNOR9-KPqSs{uYC)T5m*jt zolX#c%`9YFs97S*c1wzUZDmwiO6rK7-c?mvuh_>SQBmm&Fh%B`<6wal7F?uOeb_jL z^5X+N+^03RiutL4#j;3F9axp#N?*UPL~DN_C&tj7Qt|^8vv_-K!D_w#U_-@T21=5hLN}WD^I+ODdD*Wtq zS^Y@F9hXgG)yP!|yV(v^2iV*Maql?$vu{30NqVK^h$QL24zjWC@bkwDJ1l@!v&w&=Ie-3lnH2`kOwTV2U=mQvRFPqm7ndDhn{1?H;=iq&+SVL; z!>BE)z;SuloX<-zx;sglSWo**(Y&SgEh*`S zT-4JXO+EpEvUe2ptk=4uBsru82J?^-o&>j{LIW6E z+13`gvF|B{i9dhxO?p!~w7{R&cJBImAL1L6Aq~*2VrcbHk&$|irUL=L2fox2g)X)5r@7UW z@`V1$lPC4m<1ozC8M>Xh8fW!+53B7i4VdM6in8Wn;_BJ=0fcoFMeg4du z0_dZTI1vHUzNUeJQq?TA07kyy>eofK?_oRva5c%FL4pSIYhvy=74l$qbxuqo4Yv0eGzAu4?=6J9{XLV}j<_7n z5*WWoe}8|#tRlm98uw2isu`sI*~aR4RXQv>&a_2COZnk>&}i3zYz+?0;>WnA6ZPFW zZ=<6%R3L1hfSv~3SB`HT92_hwD^tf`3Fkr*Kn*0xL59CQ^jAxNdjAYU+>@|`#U`vE zR{a6PICUzM+Yl{DL=cY@QJ+6BI^5COuj>6;=;-MqI};?>#mQJ6KsSenLKWs`T^*|G zlB=t$!THCnEz3(wOUuik|M}po0j2;!xw5<*%spYs;|SvGO6~G098v8_B!pal!Zrps zcKh@F4KTLcRD;ii=pq}K_SmC-5z+o`7OFvCEr zRPL^-q9WJ)tB)T)N`7c+dQ3s#pS%n{U~q7-&O0+SZaV+1}jB!Aqd znu0}~R%j%RO-#f*38Jj5hM=BcAGxE=K^2uU>_PM3z5ClkZ!)T}0zKbX=YUadFKb#LFk{hRJffQcXZFTE#@P6Gnz z*1A=g4RY2qZ=N{EYCclF2Gn}L!!$J+@2DZ99|HZ4j08{JAw_8(*Fv1r+o#lqYs+ z>9&uxqoc>_pC5Ur5Kq(9^Tt49!_$6KT@=!(YFC z#Y0LgR~tARCa|PKQr008jf%3e9k?bc706M0-uO38m8@Rxw;W@w|k%v!x>Cc*7Zl=^L ziV1x0>dJrUPY03y+PG5)umks>6D#vBUGiN|Q{bj@1Zq0rQ z45T9E_+o|Z48iC?w01$rHW^A_X=z41v(Bu`BTRI35kC(#JAtpj#zG5(M&70$KgL0K zdQ;^oC@7#ONK-bzdkZ=JTwGjZAajEKt%uk-fF8(8 zZZ8fhc1JDof0T*-@&(`v#Fve1>(Edy%G-;H&oo)oF5y#7&N6taA*JT%Qu#fAqt|us zDKR?vFf20kyx=G(G7fa@@9Q6RqOm4nkT*PTQp>|<@GTW&FdlSMl_>O&0%LuI5<`?Xaa z#7;Ng^EK4hPj|#=RRFf6{i5o?&~s?2u!f3x;GcJ+XP41s;G}*Lc3|7VK5|S-{2P~W zN5;g&gogGu1z!bLu+!oIhoWMql<(=Sh5jdO;ia%dFnKrF8K|LvPgd=`HZj>42-srP zo7xV@{`U#09Tp=1UIGIs^*D4L)2PFvJnsn;^&RcFth1xamdKM1P7HuUmT3-m9zHCYR6gd0_)^>F$kyuH1t zugp(sys>8zb180ORY%Og0qLwUf99AWzCdM}pFtdL93cfX5ih7ov#VU1gE*oZTZ?EFOvg=Mt7a=b1Ps}kheEw(7X8a`S!2jfO|IHN6f9`nViy=UuuZ?(lnMV+Un4vK2>g<#ezA=Kf}pMlXX zv{T)Ri;vL|on6GstBhnMZ*y~3QtZ;Kv}>NHIp%&;~ z(hS~royFy#^YA{|&2pXtd8S5>N|lgJ3bITNP2)eRMPmR~t&rwe{z)@)k374b7UXd#+g ziK0ujc00O_oTI=NQz>;z(RIhwyxvgj7Pszt3Jkdci{HF%eNhuBEjMusqMn3r>Iojx z?CMVTw)4YDJD~F6Sz?ZO{S7sXxRwYmomB0r&pNp}sJ&&*kxDyh@@J)=ic$ zI`~izTDci1usnGD_=6m@p6|yt4h~TEiK#g zm>wJu8Qn0GZ>qGmTs-?;|Jk$djqt?d57ck#T=R(%cAxnnB@N`uOtlO*Tw4VY=U9AH zzTk9GE(euQc1Wf!PNbB$y4L&7KN4BvVK?*Z*~N<&Ei5cpekER&J~+U)R#eUzFFLz= znxGTyoF6<0eMBiQXKR5j$dZb*G*Y<0$IV^ocrf!dv5upyJ%-QX0$1ooA(v`tthnzE z_Lgq-^PYBh{H6wZ@QuKdiJX#>aOw%*2w~{x;5H0K3)BLJA%53iVzo^ITLNpU!i^J!iC$Bt)V5)wY1U<(qQySrs=~?n)DyM7(m-ROpu2t9XVMmkv8(*yY3wM$G~jEz?2IzRR}T}EU>C^BDoFmzh*m; z+30)|sQf>A|2~xUliAQW4Qn6;N~~#El!``#nTD$T7+l(I2?|GMU&rZd!c{PvvgU|eP(2yXV!6O2^qR*ez^brrQJp~wn6?q#P*tEdi4$C9M^G%H>HTGwzF83!@y?Nt- z6+iHP>m6#TA|<7~C#=q?we41k1STLDpe*^B#R^78U5zd%QQsJpwn(>mjoIgKq1S$#hE z2YPPdN=PC0EF=}wznPG1t|cAtrb-!fI%D4Dp8N1~vEt*~5@AAtIm^SlJtGtDmf zfi0XJ!dO?))g2HGJ45YDcl>>V6{Yrws*0siTCEJq{q(49MX zp4T|K%gMFHx$b1&=D^gt5?2n$M6}Qo^?vhnbA1^)8-4RddJT%ef@(>U))gKmQ9o&# ztgMW7#wTI*4T7x`Ob(xT2n;Cjr_M=&EupzRw>r~~29ofa+wRD$ihL`MYW3fz9ee zy+urC_YriQm|8n`16^h|xuPa!6)y^q2E4P!0m54_s|QS3dwZL3sa2%8)Y*@}`ucdG z94K`9xs+60U!RK2Uqv#dicSB?k$ns#!qOF*#^xhcPi7%Wf{^U;>Vb4|Q*< zT&6}Hhq$ie^um_J!hmH@d7|xoO3DC~`fUeWw&lfHCpal1l$C~E=>ho}diona&+j-n zW`ukOZk4FR%u;zlQmSHHtbk&?Z{Q`A$Hokramn1m$pQn(`e_j->_t(xYn~qa4q58` z)_I&h=lR^`g64OI^?h-1F*vg@)d$||yJ5#Egoo^B<|AL@p+6@lCqqY{(2x!e zcX9X!IsJl;7kozWNs`_XedMHy4dUrlQe_fxFMw1G_<#KI1B{PKKi}oaW5R&&_AFfEvTq2K zw^Q#3!K|s5p>%vBqmNEAe=}wPz6bc}AZ$F{MpjLRYq+S`#ly8Tg@T>SxIQ>Ua|HX-Z5h z*|ki|)jc&v)=r%Cbz_{#;dsF`$7s=zAUEvWWbWf`X!w8t3`K z!s(vrR)7;Q%iI0X~_gepn9GT z%4NA>7^SX%-vF~Pn6|Skqnw?c9UCW$taO`R4>yYu$X126z&%fgw|IZ2am0=iJ4=^6 zJP1J9KfrD0DrXrQhJ~!dPo>zA8k1HDU_Na-I(icph`@-Ce%5T|MfL{7=TB7+4WjUo z=3zw72e=%<3p?@8u3{m5{I@Fce_Nib(_~gH%pa0Tqlaq)OCr&(x$ho;NSG<>C5v}tyGaMEL?n`|9F(8Kc%;Il< zDO{6xIPFQyt9$hM^vTl$eSK|j-zw$mcXf>eA&w39>wyIvpWODbavbo6UINY6_cZgt z#H5~q!BDo$Bxjtkv8k!yeH#hjBK4+gv_dhdb+$7-pHvjR+$bZ4$i}<24=ju9?;I4V z$Vdm0#kZAuPuTo2y0jxk02^*LsH%FLbQh@<+hg~@4*<$4q(A-2fI0_PG>DDkM&)DC z6|PW0!+d>nMCGrX1tlGf=y*ls;nDm4ir9ED?u;*Cd;6X`h4y>91xb{rHdRTB^&^6M zQ^d)in=}{F0trn+&@&gf1T(Z@Z^2!uEDy_2u1b|HJq^d=31Uqc0a%a z`i5HtUJ!GfTkQ^59Goi6heUaE-%r~s5J;*beuY zte}umQc}!aQA*4&Ei5c8RH|){6DdnoDSA9Esqxp1fKE7z81vlyGmFJK{UGAsJ&{3o z#tB=#d>Q}If%IriM>CubwQ%2Zg6XLLU<=eP&c^@Mj?2;%{}&o& zka?@>hdrR(G+7n!vSZw+RnFNZc4el4_uiIXLZ0xB80Md?Y(-VN=rT5fg-H#E>I z_Q{up3o!Af(tUp=KhYa3*2?J4^J@DFIaa2wJViR1$To1`2eWk~UhO_LO6$=o!_M`3 z{((sjPa@f(|92>Q*9=8czD541JC626sR6VcKudKdu1$^~xN=w1K#rd#74nZl6)JP1 zMf>?I-agc}71bU|Px)_tz=#P|wgl1e}6er$x;kI!bxUj8sFzh)s7Oqk`L) zqf+n_WngTKe^#~)Ow@n+GPAOam;XT9^N>dzmxo*lKT|G^RvMbhW3GqR`xAAq-x1)U z0ONn+L_6*ksmXxkcM&IRaGNMsY%S0;vl*0`_|qdZ_}n8Q!3!Hf4~E_VGfvCViL9lO zeDLVem#C>0oXg+dx|wt6#l&s_BoJ#H_B*0%&cS?L;bOCx32w;>;5SpF8N_FvK+@~B8-0te6a3B9Z*olRZB{=w5O9a$2!EM3q?i$*@#Jq%Q zcdZQ$0=c@?Hd_-gI54pq0-?^oZgY?$I89z&-=FEhR0ii~L+hLKJRcvxq?0i@&Lt60 z%(c0K$dd4I_=A$O{giQ>CSOtQU(}qHO*!H&(|A^uP5sMVGfRDa{lvG&z_-&Wd#Rii z(GC^MqSV@Cz>b~O?j%T)M16_M#+2U@W~(%Eq8$k&S@@<3CFUd43=Ada^(}fg6kr;_ zOlwTp{R0Wy=1Mffq09Yu5g<3`(&Vaaw_ME4&4tt>WhNWxZqEgc8<08;RgiG$XzXhx zO40{}$1_dlqa@t?BXE!O`G4Z)|I3>7K)Exc^0>Yz85!9>G3T-A%a@4@j0Do$?1i&% z8!ycNJiJ&xcL->ZsV{r!9GG}Js!f%`gM#w)hx}e$k1I1DjW_Rsxf+%B*y$;y#7x)a zA-mbe#>T8GAcR)pzcG;q~N*iefQ4|pqNx+1l zgi;I$C@4`SsR)Q9CFimmOrRo?L~L9&SI4&A5HtAr{yhfV5@JvOdJF2>To~;_QE%Chh^BA$vPFkkbn;Yx=X7CEO%$ar z(?j;&v6rp}arR}ql8FJEiaquFmt3T=eb{U^i_Q#hX^h>4xn`F(3@Wl%6lBT!>t%8- z>&oU{a0*Lf%0vF?UrmJH49eFAqOPDZ z$=#V&U|agiOhPZAK#F*SZK}n~>xvfpR|Vfl)NN3l^jD2{4L`;GL$CNkbSI`K;?xc; z`RzB`mIAN3w`}Sveqt4UJuj}$m1Zcl2I0C-GZ=E z+u4~YLGbMr54G|aUY}vkS5&+{@%e&yCpZ%P36(T)`|#$SU~Beg=0yF6)>btG19`da z$66jg+5*bK(lQ}=C-MFa)OK*K=x>g9C|^~TTdw&`!F?Dur_~My=dRdaA|27z&Qy!@ z>#H$2yCsLo|id?+g(Z{ol_Go)(gu>qY=Z7z!M2}(qoy-jV+o3hp8M~&nyP6Qsjh0aT&I<9rtdCFnI7VS6z zu1C(lprNP!)6IYH(%Hkri~W!6(wjHAbenJ9@B9A!`L8YcNKh5+cO9cr3YY>NBcfgz zi-`GePyNLv)PT}A;g>d2ZLQBaon#p#VtzrD6pX!US>2@QF-xAAsR=4CIGq$)?C#j` z^((LP)L;YceOa}tg)KGpGZ?&#l7DuLBG<8F$C{FVbf&0_nE8WE3O`@JTJl1MH8`5m z+bisy#l7II0XJsLliQ0urqA%6PcnZ1&REJi$f(e} zv@tHZ%jU{<0yA-)G!pp8b?k(@o1$e$NyAXHoxQ=iuZ$QCP6-(U@j%~VPoOW0ukB3I z+oip39t#QW5X{jZ%Dr{mhfZe7JddvO|MhwiSks15&Gq&4uA#OV1AYnhYR2Z(ddU}9 zz5ca-xn&}=(4NYZe}s~ASjF~k;51eJhdVM0L*jai8Ji*Qf_H?)_~Nj8o#Z+W0=SGy{si`)(Wn@)`nx@u#8~F!8$Gz_Vn_~O#BsZEKcs=LL=Mu z`}a#}#+0);u1cQhjbE~`h^V~fRsN^Xo!L>+8@JMe`Z%?nHe|+(5p{tNB5;Z|q(Bz2zdV%|+>oU;1m1yds}S^ZyfrRXm+QE?i<`&uv+%*6#|bIm+jbR+tt&S zOIsy45e8YTSHM#LFsZQ0D=Y?E%y+JRgr%KgEDUuvUi?(uE zf6Hruk5=ciaInpB)*H~G3gIOnK<$z$rF20)B1c zoi#$4hVKryX3nD8g240-WthUy8Dtq5nGJicS(hc++GY<*nat;2`#S{0>!fo1wsh%o zVVElwIwh@(Jd`twf!=`$T~xto3s@PkMYR47m$#_+FivKn5ncc0h@x2_K!9Cyj#IN# zRk*v%2>&9t<G=DZtn_|!awdus&OGoLmEQe9%aX1h7ZB^%$e)X*Ue}f3| zU%Mzu>vt|ay-;`t3cq+!73%w2IFGXUX|Jj4A19_KAB@|`g@IW-< zN8bqxSNeUeudnLbiYR>3S}Fu5UL~AQP=*LlTFd|?8)~MUoQ$gWf)b1v%DK1uPV!5O z8$>C2?F>9Q@$+*GemYL83=30Kq~mXF;g+0|nfGfAN2s%odDD=0rU&;S=Iwm2(OuE4 zz=OtSdvSC+ukWi4cHDI~&OQ$G!SNF()`_1Rt8B19aJtr*k&h8%o|h)koq`39LZlmN zljf&4dnmS~Th)H2Ecs^*9}xNdbbWE3ifv~>G1fq{UFXyAr_RH5sp|2o!q573ol#nh ziUwSag7<_YS~L*q34Gool|>XV3Yr;+*ukLH^2vsW};U|{PX6c8uI zb>#s_t@?+*!Vpc(jDSo)?7#m?SpOY{k;qfvxlUp+=ol^98-QxG&&)1pS1L!kM4Un#Lq9WteLv$|vjT?v$sLp7I z2@!d}wSwFGxh2z_iZLxft@^!fSX&X<)(u6L-RkBjc2d; zorR0{cK4GWAS37f9whH{RUZR@X5Ea{LYM%O&`o~sn)KquxJm~cHQRO0{%X(8Os`#l z%GYkTlZAdqH43L}uRdGMx4rOLy2B>8va5_Ny#>qT)}1?de0|NGyoehyGqZNV#mP|2 zM)DhD&6qd& zdR@PzSVr2oz`nON8*Mpnm%-TIyZ!hjTA>?X6IX59kz;z8ql74ZEG`#LUcg~5vZA(8 zt`9uU)VAc?tQ9TiB))fVRf?WbSsSj0Kgwll8tY{X48m%5?#$1zHtZYf6Y&KJb|LG^ z`9BxVgErRDmBfV}DaOfgwU>CI)^-oSpjLHzwP1Uaic4?X(K`Xdr0Z9QLLY?YJ1iFl z0RSu#pEpkVyZS#GqDNG3S2V%+A&!}NdIFo6JIjduJEHAsAlYt-JAF7Gjl|R8``>;2 za0Tn~%h@lAg)X{h<9^-9kXL)S5ayJ*w{43#CAE`femYt!=leMrbso_!0}6A!75!)Of~*%a<=-YqsjwOG;I%`c(xVM4#`ILEaqps`k!@(l{3t zlOtjc7GTj(+wDW2kH|k^n~OUVbvyEGr~7I<_nChVRLe#$@3CVPhKU$-dU!;Hnb)t- zFcYRm6!0RNkpnOk$xaOU)p$ct_Uh^p3;FFPtQX-=@+o4UHr(NZB~33~3LL)h!9Of5 z$Cmm9TV0|#)#6`Q;@<)W36jl_YvKkl`?+=Oaiy*owPliDK=zvGJSPP--j@`2-Cmu1 zLnX_qsTmssesP_XJ8)Du@UF?=g6C$F<`{nPWc`F^6|xEH-m8r--9o?42qEM^4~(&e z6ZZuS(i0;LQVOc|*^zL7@x9?Z?^E1m%Eo;D zFPH!t=3n%>`8xf@xLnUJ5O2~-N(MQ$(FeWMib;dq!hY){*9h_zBd6u07?_RcJ7XL~ z_}IO!vS3NLVIbX&XXef_W`)u^@^19JElEx$*!PNi01cSZ&^UFE41jsVOalT(uMPjDtNq^g~GK6bb4BH}(i4kDV>3M#IybBQuT zkbCj35x{7+Uc6okJX|orG`D~Yv$zR04)9!nkwLLL>tp+;WUDX@U{JPml%zqfU3*dQ z#QeSu#+O#T{6C<>X0D7=|3@oSt@p@9ydIag$bWsy|Hr{%>q>6!GfpcjT>qB$;o2>M z=-X*D$}lnMr2eZ-#zi?us6zi+-G=ScTwB7bVJFgKJQM)uxzkT`3tR`()&)-!pd27E z*I@~OAdxe zA=RcX@VPzQnVtRO81IPzJNTKHC>(`Dd7C3=fG=JCLvUsA;gmOu{i8n0RP>N(f<=R{$XqBg* zo1Jah{`yGFlIhh#2NR#T&sCg7TlOep=IXV&1OkcAz0g?|M)G9xZro__!ZV-T*Hrh~ zAiiljA{QOAp6zQ?FJFEc+QgAM4~rM>d&kBL&c-Z}2$SBkyRMf09>0Hc)AkUqEkR|= zg#l)QCCy*Gf(iyf2VH(y{5B)U1|4+PM5C4P2h%hWgv-&o)RfEDHd_ttO8sXuZdh~? z!w*0jKZK(#n%kMsj>VomSuLjcUXu1fR@l-%V?C2<7g$CNg8eo0ZCx*wI97MXoD5Lpbt z^eOq@TGm2)<-LddFCX`J9Io%EjC(&LSV*54z`RTbdy0aI3#(?kO(bWX?h`Bh_@$c? zk59f^v~<_`0)@SM#r^*o!1$`!6Y->{_05c(35g`^3x_21deApWi-`%E&t{dQ>kNyN z<^1BWtA!k#k1MaJJQPgREmdq7qMv|j z&6fvLx!O5JZVV0XOP|L~@Jm}h6TSAI?epcv#%n)5*dw#21%rJ3ulsF{4w)S>tHkt{ zNy@blaAKItUAODp_xVYFa++~l(fPGU7cCO@Z4QdZtfVrx+vTqRt0%56PCVM-Q)?jc zn%IPng7&N0B4?I4COXlzy%D2AbQCtkZ7*)=cL7k8zEFT(dl2fXb?bhv9BkaEi5JHQE9Zee3RVRj+`*Tv9sKYrq z7?_9r;wMC5L$WM3i(!y!n{7u`8j_84`!%_A(^_)>{;!>#N@w{XeABh>71sWHGNVN> zQg1KMFW}W8xM0hof1B4Jye+^=mh;_Qag2D6hn-cpDh~g;5m#J(`>%X)isryIN~Mq> ziz2b-Vw7(!ld)>rq~w_gwZP?iIE_IQjIq7QA8o0S(b1=e_FcaP()#G_6*rumyvDnZ zFGOlMnr9F+>SJsZlm1n;k|RJ@1<(a2XvJNz(r_zOzH3zI zECaO|I%tqIDtI&JYHek`Ffcm;26JE_TqXi>>+r|N%YNzZu77_E^#~-ljlkZ`%`T9j zK)uqDVW$4>uf_Z9fTmYT>byR4BIR>+wH3qz=pTyJ&OiYR4V)0(RJaR0@(GHjOvhvYb7N%jlxm#m`U#XEq$5%ACTJN@rH=&5?!2_CdlQ-@VY?J@uufj z3LnE-!k>CQIQc+mvR$#p|KY=^-ItW10EHk0e)CU&Q?JfWO$|3D>EkMd7!q0@5zQ!W z;Tam$B;Vew_mIWsr@e!N^wAFavNpUJB%YO5_L}iO$KM-MjoPZKlOSh=hWzx?{doO1 z_6=ACSD{XUG?9S`bT-QaUQ&?Yc^8U6H#zzx=FYLLs+a7Vlh5xntK!8_oLRtAS`#M) z>lT7veG?PXc}AqXORSb9uE1x(`6=_P1pAVNF4n zHU#x4B(VE!XQAjpWK>-}3n0hF1H`DWU9JaxYJj*lE&;(M*46!c_s(VoY}jXxEuivn zlO@ENxF^u)P0fv)3V*<2awFvF)tak;uK)I0(Tsm30cwl#W!+%OXR_3;q9fi05mtaD*iw3U+aDsK#cwoh*5DJG%%f zHdl9dHfxrO*3^K3&-*lfT2BwJpr9AD#wI2q%4g2hxdhPbPafqyi+4UtqXr1bR8?22 zONEhLO0un*L&bHkK~;rE+n((hsL391rE zge5|!$Hv}dWVnxg|FdfZvM_|LxO&b5Qm9%SQWext(Rg3jVUWnm{gT&{g+D+Xg~Nb) zfBwwDErIHakT-IVcf@!~NF?dZ=HU5{v}R{!WE_HZ03?NE9dfHad%Rl(-;TXh^YP

    h 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

    WS$Pr`C4Dd$ekmwjc| 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

    HOLL+eX(oYH^mdLEp1` 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�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

    UdT(|JNikVsDA@0uqed)U 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 RaTNTKl~%m-{+9kf{{>-22uT0{ diff --git a/sdks/python/apache_beam/runners/pipeline_context.py b/sdks/python/apache_beam/runners/pipeline_context.py index b63e5396096c..aafa257b3dd5 100644 --- a/sdks/python/apache_beam/runners/pipeline_context.py +++ b/sdks/python/apache_beam/runners/pipeline_context.py @@ -172,7 +172,6 @@ def __init__(self, iterable_state_read=None, # type: Optional[IterableStateReader] iterable_state_write=None, # type: Optional[IterableStateWriter] namespace='ref', # type: str - allow_proto_holders=False, # type: bool requirements=(), # type: Iterable[str] ): # type: (...) -> None @@ -220,7 +219,6 @@ def __init__(self, self.use_fake_coders = use_fake_coders self.iterable_state_read = iterable_state_read self.iterable_state_write = iterable_state_write - self.allow_proto_holders = allow_proto_holders self._requirements = set(requirements) def add_requirement(self, requirement): diff --git a/sdks/python/apache_beam/runners/portability/flink_runner_test.py b/sdks/python/apache_beam/runners/portability/flink_runner_test.py index 12ed1b813e7f..a5f6ac31fa39 100644 --- a/sdks/python/apache_beam/runners/portability/flink_runner_test.py +++ b/sdks/python/apache_beam/runners/portability/flink_runner_test.py @@ -57,7 +57,7 @@ # Run as # # pytest flink_runner_test.py[::TestClass::test_case] \ -# --test-pipeline-options "--environment_type=LOOPBACK" +# --test-pipeline-options="--environment_type=LOOPBACK" _LOGGER = logging.getLogger(__name__) @@ -395,6 +395,9 @@ def test_callbacks_with_exception(self): def test_register_finalizations(self): raise unittest.SkipTest("BEAM-11021") + def test_pardo_dynamic_timer(self): + raise unittest.SkipTest("BEAM-10120") + # Inherits all other tests. diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/fn_runner_test.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/fn_runner_test.py index 18a30e9cd0ce..ef8371922457 100644 --- a/sdks/python/apache_beam/runners/portability/fn_api_runner/fn_runner_test.py +++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/fn_runner_test.py @@ -23,6 +23,7 @@ import logging import os import random +import shutil import sys import tempfile import threading @@ -492,6 +493,30 @@ def is_buffered_correctly(actual): assert_that(actual, is_buffered_correctly) + def test_pardo_dynamic_timer(self): + class DynamicTimerDoFn(beam.DoFn): + dynamic_timer_spec = userstate.TimerSpec( + 'dynamic_timer', userstate.TimeDomain.WATERMARK) + + def process( + self, element, + dynamic_timer=beam.DoFn.TimerParam(dynamic_timer_spec)): + dynamic_timer.set(element[1], dynamic_timer_tag=element[0]) + + @userstate.on_timer(dynamic_timer_spec) + def dynamic_timer_callback( + self, + tag=beam.DoFn.DynamicTimerTagParam, + timestamp=beam.DoFn.TimestampParam): + yield (tag, timestamp) + + with self.create_pipeline() as p: + actual = ( + p + | beam.Create([('key1', 10), ('key2', 20), ('key3', 30)]) + | beam.ParDo(DynamicTimerDoFn())) + assert_that(actual, equal_to([('key1', 10), ('key2', 20), ('key3', 30)])) + def test_sdf(self): class ExpandingStringsDoFn(beam.DoFn): def process( @@ -510,6 +535,21 @@ def process( actual = (p | beam.Create(data) | beam.ParDo(ExpandingStringsDoFn())) assert_that(actual, equal_to(list(''.join(data)))) + def test_sdf_with_dofn_as_restriction_provider(self): + class ExpandingStringsDoFn(beam.DoFn, ExpandStringsProvider): + def process( + self, element, restriction_tracker=beam.DoFn.RestrictionParam()): + assert isinstance(restriction_tracker, RestrictionTrackerView) + cur = restriction_tracker.current_restriction().start + while restriction_tracker.try_claim(cur): + yield element[cur] + cur += 1 + + with self.create_pipeline() as p: + data = ['abc', 'defghijklmno', 'pqrstuv', 'wxyz'] + actual = (p | beam.Create(data) | beam.ParDo(ExpandingStringsDoFn())) + assert_that(actual, equal_to(list(''.join(data)))) + def test_sdf_with_check_done_failed(self): class ExpandingStringsDoFn(beam.DoFn): def process( @@ -555,6 +595,38 @@ def process( actual = (p | beam.Create(data) | beam.ParDo(ExpandingStringsDoFn())) assert_that(actual, equal_to(list(''.join(data)))) + def test_sdf_with_dofn_as_watermark_estimator(self): + class ExpandingStringsDoFn(beam.DoFn, beam.WatermarkEstimatorProvider): + def initial_estimator_state(self, element, restriction): + return None + + def create_watermark_estimator(self, state): + return beam.io.watermark_estimators.ManualWatermarkEstimator(state) + + def process( + self, + element, + restriction_tracker=beam.DoFn.RestrictionParam( + ExpandStringsProvider()), + watermark_estimator=beam.DoFn.WatermarkEstimatorParam( + ManualWatermarkEstimator.default_provider())): + cur = restriction_tracker.current_restriction().start + while restriction_tracker.try_claim(cur): + watermark_estimator.set_watermark(timestamp.Timestamp(cur)) + assert ( + watermark_estimator.current_watermark() == timestamp.Timestamp( + cur)) + yield element[cur] + if cur % 2 == 1: + restriction_tracker.defer_remainder(timestamp.Duration(micros=5)) + return + cur += 1 + + with self.create_pipeline() as p: + data = ['abc', 'defghijklmno', 'pqrstuv', 'wxyz'] + actual = (p | beam.Create(data) | beam.ParDo(ExpandingStringsDoFn())) + assert_that(actual, equal_to(list(''.join(data)))) + def run_sdf_initiated_checkpointing(self, is_drain=False): counter = beam.metrics.Metrics.counter('ns', 'my_counter') @@ -834,21 +906,19 @@ def process( assert_that(res, equal_to(['1', '2'])) def test_register_finalizations(self): - class FinalizableSplittableDoFn(beam.DoFn): - was_finalized = False - - def set_finalized(self): - self.was_finalized = True + event_recorder = EventRecorder(tempfile.gettempdir()) + class FinalizableSplittableDoFn(beam.DoFn): def process( self, element, bundle_finalizer=beam.DoFn.BundleFinalizerParam, restriction_tracker=beam.DoFn.RestrictionParam( - OffsetRangeProvider(use_bounded_offset_range=True))): + OffsetRangeProvider( + use_bounded_offset_range=True, checkpoint_only=True))): # We use SDF to enforce finalization call happens by using # self-initiated checkpoint. - if self.was_finalized: + if 'finalized' in event_recorder.events(): restriction_tracker.try_claim( restriction_tracker.current_restriction().start) yield element @@ -856,7 +926,7 @@ def process( return if restriction_tracker.try_claim( restriction_tracker.current_restriction().start): - bundle_finalizer.register(lambda: self.set_finalized()) + bundle_finalizer.register(lambda: event_recorder.record('finalized')) # We sleep here instead of setting a resume time since the resume time # doesn't need to be honored. time.sleep(1) @@ -870,6 +940,8 @@ def process( | beam.ParDo(FinalizableSplittableDoFn())) assert_that(res, equal_to([max_retries])) + event_recorder.cleanup() + def test_sdf_synthetic_source(self): common_attrs = { 'key_size': 1, @@ -1348,6 +1420,9 @@ def test_draining_sdf_with_sdf_initiated_checkpointing(self): def test_sdf_with_watermark_tracking(self): raise unittest.SkipTest("This test is for a single worker only.") + def test_sdf_with_dofn_as_watermark_estimator(self): + raise unittest.SkipTest("This test is for a single worker only.") + def test_register_finalizations(self): raise unittest.SkipTest("This test is for a single worker only.") @@ -1375,6 +1450,9 @@ def test_draining_sdf_with_sdf_initiated_checkpointing(self): def test_sdf_with_watermark_tracking(self): raise unittest.SkipTest("This test is for a single worker only.") + def test_sdf_with_dofn_as_watermark_estimator(self): + raise unittest.SkipTest("This test is for a single worker only.") + def test_register_finalizations(self): raise unittest.SkipTest("This test is for a single worker only.") @@ -1413,6 +1491,9 @@ def test_draining_sdf_with_sdf_initiated_checkpointing(self): def test_sdf_with_watermark_tracking(self): raise unittest.SkipTest("This test is for a single worker only.") + def test_sdf_with_dofn_as_watermark_estimator(self): + raise unittest.SkipTest("This test is for a single worker only.") + class FnApiRunnerSplitTest(unittest.TestCase): def create_pipeline(self, is_drain=False): @@ -1707,6 +1788,36 @@ def _unpickle_element_counter(name): return _pickled_element_counters[name] +class EventRecorder(object): + """Used to be registered as a callback in bundle finalization. + + The reason why records are written into a tmp file is, the in-memory dataset + cannot keep callback records when passing into one DoFn. + """ + def __init__(self, tmp_dir): + self.tmp_dir = os.path.join(tmp_dir, uuid.uuid4().hex) + os.mkdir(self.tmp_dir) + + def record(self, content): + file_path = os.path.join(self.tmp_dir, uuid.uuid4().hex + '.txt') + with open(file_path, 'w') as f: + f.write(content) + + def events(self): + content = [] + record_files = [ + f for f in os.listdir(self.tmp_dir) + if os.path.isfile(os.path.join(self.tmp_dir, f)) + ] + for file in record_files: + with open(os.path.join(self.tmp_dir, file), 'r') as f: + content.append(f.read()) + return sorted(content) + + def cleanup(self): + shutil.rmtree(self.tmp_dir) + + class ExpandStringsProvider(beam.transforms.core.RestrictionProvider): """A RestrictionProvider that used for sdf related tests.""" def initial_restriction(self, element): @@ -1730,13 +1841,23 @@ def is_bounded(self): class OffsetRangeProvider(beam.transforms.core.RestrictionProvider): - def __init__(self, use_bounded_offset_range): + def __init__(self, use_bounded_offset_range, checkpoint_only=False): self.use_bounded_offset_range = use_bounded_offset_range + self.checkpoint_only = checkpoint_only def initial_restriction(self, element): return restriction_trackers.OffsetRange(0, element) def create_tracker(self, restriction): + if self.checkpoint_only: + + class CheckpointOnlyOffsetRestrictionTracker( + restriction_trackers.OffsetRestrictionTracker): + def try_split(self, unused_fraction_of_remainder): + return super(CheckpointOnlyOffsetRestrictionTracker, + self).try_split(0.0) + + return CheckpointOnlyOffsetRestrictionTracker(restriction) if self.use_bounded_offset_range: return restriction_trackers.OffsetRestrictionTracker(restriction) return UnboundedOffsetRestrictionTracker(restriction) diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/translations.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/translations.py index 8f12779d67f8..6e8f95e91ef2 100644 --- a/sdks/python/apache_beam/runners/portability/fn_api_runner/translations.py +++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/translations.py @@ -174,7 +174,7 @@ def fuse(self, other, context): union(self.must_follow, other.must_follow), environment=self._merge_environments( self.environment, other.environment), - parent=_parent_for_fused_stages([self.name, other.name], context), + parent=_parent_for_fused_stages([self, other], context), forced_root=self.forced_root or other.forced_root) def is_runner_urn(self, context): @@ -557,8 +557,14 @@ def add_parent(child, parent): pipeline_proto.components.transforms[parent]) copy_output_pcollections(components.transforms[parent]) del components.transforms[parent].subtransforms[:] - add_parent(parent, parents.get(parent)) + # Ensure that child is the last item in the parent's subtransforms. + # If the stages were previously sorted into topological order using + # sort_stages, this ensures that the parent transforms are also + # added in topological order. + if child in components.transforms[parent].subtransforms: + components.transforms[parent].subtransforms.remove(child) components.transforms[parent].subtransforms.append(child) + add_parent(parent, parents.get(parent)) def copy_subtransforms(transform): for subtransform_id in transform.subtransforms: @@ -793,7 +799,7 @@ def get_stage_key(stage): only_element(stage.transforms[0].outputs.values()) for stage in sibling_stages ] - parent = _parent_for_fused_stages([s.name for s in sibling_stages], context) + parent = _parent_for_fused_stages(sibling_stages, context) for to_delete_pcoll_id in output_pcoll_ids[1:]: pcoll_id_remap[to_delete_pcoll_id] = output_pcoll_ids[0] del context.components.pcollections[to_delete_pcoll_id] @@ -942,13 +948,46 @@ def get_stage_key(stage): component_coder_ids=[key_coder_id, pack_output_value_coder_id]) pack_output_kv_coder_id = context.add_or_get_coder_id(pack_output_kv_coder) - # Set up packed PCollection - pack_combine_name = fused_stage.name + def make_pack_name(names): + """Return the packed Transform or Stage name. + + The output name will contain the input names' common prefix, the infix + '/Packed', and the input names' suffixes in square brackets. + For example, if the input names are 'a/b/c1/d1' and 'a/b/c2/d2, then + the output name is 'a/b/Packed[c1/d1, c2/d2]'. + """ + assert names + tokens_in_names = [name.split('/') for name in names] + common_prefix_tokens = [] + + # Find the longest common prefix of tokens. + while True: + first_token_in_names = set() + for tokens in tokens_in_names: + if not tokens: + break + first_token_in_names.add(tokens[0]) + if len(first_token_in_names) != 1: + break + common_prefix_tokens.append(next(iter(first_token_in_names))) + for tokens in tokens_in_names: + tokens.pop(0) + + common_prefix_tokens.append('Packed') + common_prefix = '/'.join(common_prefix_tokens) + suffixes = ['/'.join(tokens) for tokens in tokens_in_names] + return '%s[%s]' % (common_prefix, ', '.join(suffixes)) + + pack_stage_name = make_pack_name([stage.name for stage in packable_stages]) + pack_transform_name = make_pack_name([ + only_transform(stage.transforms).unique_name + for stage in packable_stages + ]) pack_pcoll_id = unique_name(context.components.pcollections, 'pcollection') input_pcoll = context.components.pcollections[input_pcoll_id] context.components.pcollections[pack_pcoll_id].CopyFrom( beam_runner_api_pb2.PCollection( - unique_name=pack_combine_name + '.out', + unique_name=pack_transform_name + '/Pack.out', coder_id=pack_output_kv_coder_id, windowing_strategy_id=input_pcoll.windowing_strategy_id, is_bounded=input_pcoll.is_bounded)) @@ -963,7 +1002,7 @@ def get_stage_key(stage): for combine_payload in combine_payloads ]).to_runner_api(context) # type: ignore[arg-type] pack_transform = beam_runner_api_pb2.PTransform( - unique_name=pack_combine_name + '/Pack', + unique_name=pack_transform_name + '/Pack', spec=beam_runner_api_pb2.FunctionSpec( urn=common_urns.composites.COMBINE_PER_KEY.urn, payload=beam_runner_api_pb2.CombinePayload( @@ -974,7 +1013,7 @@ def get_stage_key(stage): outputs={'out': pack_pcoll_id}, environment_id=fused_stage.environment) pack_stage = Stage( - pack_combine_name + '/Pack', [pack_transform], + pack_stage_name + '/Pack', [pack_transform], downstream_side_inputs=fused_stage.downstream_side_inputs, must_follow=fused_stage.must_follow, parent=fused_stage.parent, @@ -985,7 +1024,7 @@ def get_stage_key(stage): tags = [str(i) for i in range(len(output_pcoll_ids))] pickled_do_fn_data = pickler.dumps((_UnpackFn(tags), (), {}, [], None)) unpack_transform = beam_runner_api_pb2.PTransform( - unique_name=pack_combine_name + '/Unpack', + unique_name=pack_transform_name + '/Unpack', spec=beam_runner_api_pb2.FunctionSpec( urn=common_urns.primitives.PAR_DO.urn, payload=beam_runner_api_pb2.ParDoPayload( @@ -996,7 +1035,7 @@ def get_stage_key(stage): outputs=dict(zip(tags, output_pcoll_ids)), environment_id=fused_stage.environment) unpack_stage = Stage( - pack_combine_name + '/Unpack', [unpack_transform], + pack_stage_name + '/Unpack', [unpack_transform], downstream_side_inputs=fused_stage.downstream_side_inputs, must_follow=fused_stage.must_follow, parent=fused_stage.parent, @@ -1185,18 +1224,16 @@ def unlifted_stages(stage): yield stage -def _lowest_common_ancestor(a, b, context): - # type: (str, str, TransformContext) -> Optional[str] +def _lowest_common_ancestor(a, b, parents): + # type: (str, str, Dict[str, str]) -> Optional[str] '''Returns the name of the lowest common ancestor of the two named stages. - The provided context is used to compute ancestors of stages. Note that stages - are considered to be ancestors of themselves. + The map of stage names to their parents' stage names should be provided + in parents. Note that stages are considered to be ancestors of themselves. ''' assert a != b - parents = context.parents_map() - def get_ancestors(name): ancestor = name while ancestor is not None: @@ -1211,7 +1248,7 @@ def get_ancestors(name): def _parent_for_fused_stages(stages, context): - # type: (Iterable[Optional[str]], TransformContext) -> Optional[str] + # type: (Iterable[Stage], TransformContext) -> Optional[str] '''Returns the name of the new parent for the fused stages. @@ -1219,15 +1256,25 @@ def _parent_for_fused_stages(stages, context): contained in the set of stages to be fused. The provided context is used to compute ancestors of stages. ''' + + parents = context.parents_map() + # If any of the input stages were produced by fusion or an optimizer phase, + # or had its parent modified by an optimizer phase, its parent will not be + # be reflected in the PipelineContext yet, so we need to add it to the + # parents map. + for stage in stages: + parents[stage.name] = stage.parent + def reduce_fn(a, b): # type: (Optional[str], Optional[str]) -> Optional[str] if a is None or b is None: return None - return _lowest_common_ancestor(a, b, context) + return _lowest_common_ancestor(a, b, parents) - result = functools.reduce(reduce_fn, stages) - if result in stages: - result = context.parents_map().get(result) + stage_names = [stage.name for stage in stages] # type: List[Optional[str]] + result = functools.reduce(reduce_fn, stage_names) + if result in stage_names: + result = parents.get(result) return result diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/translations_test.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/translations_test.py index 0ce11bda45c4..97bbfc2f568d 100644 --- a/sdks/python/apache_beam/runners/portability/fn_api_runner/translations_test.py +++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/translations_test.py @@ -38,6 +38,7 @@ class MultipleKeyWithNone(beam.PTransform): def expand(self, pcoll): _ = pcoll | 'key-with-none-a' >> beam.ParDo(core._KeyWithNone()) _ = pcoll | 'key-with-none-b' >> beam.ParDo(core._KeyWithNone()) + _ = pcoll | 'key-with-none-c' >> beam.ParDo(core._KeyWithNone()) pipeline = beam.Pipeline() _ = pipeline | beam.Create( @@ -57,6 +58,7 @@ class MultipleCombines(beam.PTransform): def expand(self, pcoll): _ = pcoll | 'mean-perkey' >> combiners.Mean.PerKey() _ = pcoll | 'count-perkey' >> combiners.Count.PerKey() + _ = pcoll | 'largest-perkey' >> core.CombinePerKey(combiners.Largest(1)) pipeline = beam.Pipeline() vals = [6, 3, 1, 1, 9, 1, 5, 2, 0, 6] @@ -74,7 +76,8 @@ def expand(self, pcoll): if transform.spec.urn == common_urns.composites.COMBINE_PER_KEY.urn: combine_per_key_stages.append(stage) self.assertEqual(len(combine_per_key_stages), 1) - self.assertIn('/Pack', combine_per_key_stages[0].name) + self.assertIn('Packed', combine_per_key_stages[0].name) + self.assertIn('Packed', combine_per_key_stages[0].transforms[0].unique_name) self.assertIn('multiple-combines', combine_per_key_stages[0].parent) self.assertNotIn('-perkey', combine_per_key_stages[0].parent) @@ -83,6 +86,7 @@ class MultipleCombines(beam.PTransform): def expand(self, pcoll): _ = pcoll | 'mean-perkey' >> combiners.Mean.PerKey() _ = pcoll | 'count-perkey' >> combiners.Count.PerKey() + _ = pcoll | 'largest-perkey' >> core.CombinePerKey(combiners.Largest(1)) pipeline = beam.Pipeline() vals = [6, 3, 1, 1, 9, 1, 5, 2, 0, 6] @@ -99,15 +103,19 @@ def expand(self, pcoll): combine_per_key_stages.append(stage) # Combiner packing should be skipped because the environment is missing # the beam:combinefn:packed_python:v1 capability. - self.assertEqual(len(combine_per_key_stages), 2) + self.assertEqual(len(combine_per_key_stages), 3) for combine_per_key_stage in combine_per_key_stages: - self.assertNotIn('/Pack', combine_per_key_stage.name) + self.assertNotIn('Packed', combine_per_key_stage.name) + self.assertNotIn( + 'Packed', combine_per_key_stage.transforms[0].unique_name) def test_pack_global_combiners(self): class MultipleCombines(beam.PTransform): def expand(self, pcoll): _ = pcoll | 'mean-globally' >> combiners.Mean.Globally() _ = pcoll | 'count-globally' >> combiners.Count.Globally() + _ = pcoll | 'largest-globally' >> core.CombineGlobally( + combiners.Largest(1)) pipeline = beam.Pipeline() vals = [6, 3, 1, 1, 9, 1, 5, 2, 0, 6] @@ -134,7 +142,8 @@ def expand(self, pcoll): if transform.spec.urn == common_urns.composites.COMBINE_PER_KEY.urn: combine_per_key_stages.append(stage) self.assertEqual(len(combine_per_key_stages), 1) - self.assertIn('/Pack', combine_per_key_stages[0].name) + self.assertIn('Packed', combine_per_key_stages[0].name) + self.assertIn('Packed', combine_per_key_stages[0].transforms[0].unique_name) self.assertIn('multiple-combines', combine_per_key_stages[0].parent) self.assertNotIn('-globally', combine_per_key_stages[0].parent) @@ -172,6 +181,7 @@ def test_optimize_multiple_combine_globally(self): pcoll = pipeline | Create(vals) _ = pcoll | 'mean-globally' >> combiners.Mean.Globally() _ = pcoll | 'count-globally' >> combiners.Count.Globally() + _ = pcoll | 'largest-globally' >> core.CombineGlobally(combiners.Largest(1)) pipeline_proto = pipeline.to_runner_api() optimized_pipeline_proto = translations.optimize_pipeline( pipeline_proto, @@ -186,6 +196,37 @@ def test_optimize_multiple_combine_globally(self): beam.Pipeline.from_runner_api( optimized_pipeline_proto, runner, pipeline_options.PipelineOptions()) + def test_pipeline_from_sorted_stages_is_toplogically_ordered(self): + pipeline = beam.Pipeline() + side = pipeline | 'side' >> Create([3, 4]) + + class CreateAndMultiplyBySide(beam.PTransform): + def expand(self, pcoll): + return ( + pcoll | 'main' >> Create([1, 2]) | 'compute' >> beam.FlatMap( + lambda x, s: [x * y for y in s], beam.pvalue.AsIter(side))) + + _ = pipeline | 'create-and-multiply-by-side' >> CreateAndMultiplyBySide() + pipeline_proto = pipeline.to_runner_api() + optimized_pipeline_proto = translations.optimize_pipeline( + pipeline_proto, [ + (lambda stages, _: reversed(list(stages))), + translations.sort_stages, + ], + known_runner_urns=frozenset(), + partial=True) + + def assert_is_topologically_sorted(transform_id, visited_pcolls): + transform = optimized_pipeline_proto.components.transforms[transform_id] + self.assertTrue(set(transform.inputs.values()).issubset(visited_pcolls)) + visited_pcolls.update(transform.outputs.values()) + for subtransform in transform.subtransforms: + assert_is_topologically_sorted(subtransform, visited_pcolls) + + self.assertEqual(len(optimized_pipeline_proto.root_transform_ids), 1) + assert_is_topologically_sorted( + optimized_pipeline_proto.root_transform_ids[0], set()) + if __name__ == '__main__': logging.getLogger().setLevel(logging.INFO) diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py index 756e4ba25b96..dbfcf6cd19d6 100644 --- a/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py +++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py @@ -686,7 +686,7 @@ def stop_worker(self): # The subprocesses module is not threadsafe on Python 2.7. Use this lock to -# prevent concurrent calls to POpen(). +# prevent concurrent calls to Popen(). SUBPROCESS_LOCK = threading.Lock() @@ -744,9 +744,12 @@ def start_worker(self): # type: () -> None with SUBPROCESS_LOCK: try: + _LOGGER.info('Attempting to pull image %s', self._container_image) subprocess.check_call(['docker', 'pull', self._container_image]) except Exception: - _LOGGER.info('Unable to pull image %s' % self._container_image) + _LOGGER.info( + 'Unable to pull image %s, defaulting to local image if it exists' % + self._container_image) self._container_id = subprocess.check_output([ 'docker', 'run', @@ -766,7 +769,7 @@ def start_worker(self): 'docker', 'inspect', '-f', '{{.State.Status}}', self._container_id ]).strip() _LOGGER.info( - 'Waiting for docker to start up.Current status is %s' % + 'Waiting for docker to start up. Current status is %s' % status.decode('utf-8')) if status == b'running': _LOGGER.info( diff --git a/sdks/python/apache_beam/runners/portability/job_server.py b/sdks/python/apache_beam/runners/portability/job_server.py index ec40ae843b64..dfc8802971db 100644 --- a/sdks/python/apache_beam/runners/portability/job_server.py +++ b/sdks/python/apache_beam/runners/portability/job_server.py @@ -129,6 +129,8 @@ def __init__(self, options): self._artifact_port = options.artifact_port self._expansion_port = options.expansion_port self._artifacts_dir = options.artifacts_dir + self._java_launcher = options.job_server_java_launcher + self._jvm_properties = options.job_server_jvm_properties def java_arguments( self, job_port, artifact_port, expansion_port, artifacts_dir): @@ -151,8 +153,9 @@ def subprocess_cmd_and_endpoint(self): self._artifacts_dir if self._artifacts_dir else self.local_temp_dir( prefix='artifacts')) job_port, = subprocess_server.pick_port(self._job_port) - return (['java', '-jar', jar_path] + list( + subprocess_cmd = [self._java_launcher, '-jar'] + self._jvm_properties + [ + jar_path + ] + list( self.java_arguments( - job_port, self._artifact_port, self._expansion_port, - artifacts_dir)), - 'localhost:%s' % job_port) + job_port, self._artifact_port, self._expansion_port, artifacts_dir)) + return (subprocess_cmd, 'localhost:%s' % job_port) diff --git a/sdks/python/apache_beam/runners/portability/job_server_test.py b/sdks/python/apache_beam/runners/portability/job_server_test.py new file mode 100644 index 000000000000..13ad4aaeb1ac --- /dev/null +++ b/sdks/python/apache_beam/runners/portability/job_server_test.py @@ -0,0 +1,84 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# pytype: skip-file + +from __future__ import absolute_import +from __future__ import print_function + +import logging +import unittest + +from apache_beam.options.pipeline_options import PipelineOptions +from apache_beam.runners.portability.job_server import JavaJarJobServer + + +class JavaJarJobServerStub(JavaJarJobServer): + def java_arguments( + self, job_port, artifact_port, expansion_port, artifacts_dir): + return [ + '--artifacts-dir', + artifacts_dir, + '--job-port', + job_port, + '--artifact-port', + artifact_port, + '--expansion-port', + expansion_port + ] + + def path_to_jar(self): + return '/path/to/jar' + + @staticmethod + def local_jar(url): + return url + + +class JavaJarJobServerTest(unittest.TestCase): + def test_subprocess_cmd_and_endpoint(self): + pipeline_options = PipelineOptions([ + '--job_port=8099', + '--artifact_port=8098', + '--expansion_port=8097', + '--artifacts_dir=/path/to/artifacts/', + '--job_server_java_launcher=/path/to/java', + '--job_server_jvm_properties=-Dsome.property=value' + ]) + job_server = JavaJarJobServerStub(pipeline_options) + subprocess_cmd, endpoint = job_server.subprocess_cmd_and_endpoint() + self.assertEqual( + subprocess_cmd, + [ + '/path/to/java', + '-jar', + '-Dsome.property=value', + '/path/to/jar', + '--artifacts-dir', + '/path/to/artifacts/', + '--job-port', + 8099, + '--artifact-port', + 8098, + '--expansion-port', + 8097 + ]) + self.assertEqual(endpoint, 'localhost:8099') + + +if __name__ == '__main__': + logging.getLogger().setLevel(logging.INFO) + unittest.main() diff --git a/sdks/python/apache_beam/runners/portability/portable_runner.py b/sdks/python/apache_beam/runners/portability/portable_runner.py index 15c860698611..a5b7936626ce 100644 --- a/sdks/python/apache_beam/runners/portability/portable_runner.py +++ b/sdks/python/apache_beam/runners/portability/portable_runner.py @@ -321,54 +321,71 @@ def get_proto_pipeline(pipeline, options): default_environment=PortableRunner._create_environment( portable_options)) - # Preemptively apply combiner lifting, until all runners support it. - # These optimizations commute and are idempotent. + # TODO: https://issues.apache.org/jira/browse/BEAM-7199 + # Eventually remove the 'pre_optimize' option alltogether and only perform + # the equivalent of the 'default' case below (minus the 'lift_combiners' + # part). pre_optimize = options.view_as(DebugOptions).lookup_experiment( - 'pre_optimize', 'lift_combiners').lower() - if not options.view_as(StandardOptions).streaming: - flink_known_urns = frozenset([ - common_urns.composites.RESHUFFLE.urn, - common_urns.primitives.IMPULSE.urn, - common_urns.primitives.FLATTEN.urn, - common_urns.primitives.GROUP_BY_KEY.urn - ]) - if pre_optimize == 'none': - pass + 'pre_optimize', 'default').lower() + if (not options.view_as(StandardOptions).streaming and + pre_optimize != 'none'): + if pre_optimize == 'default': + phases = [ + translations.eliminate_common_key_with_none, + translations.pack_combiners, + # TODO: https://issues.apache.org/jira/browse/BEAM-4678 + # https://issues.apache.org/jira/browse/BEAM-11478 + # Eventually remove the 'lift_combiners' phase from 'default'. + translations.lift_combiners, + translations.sort_stages + ] + partial = True elif pre_optimize == 'all': - proto_pipeline = translations.optimize_pipeline( - proto_pipeline, - phases=[ - translations.annotate_downstream_side_inputs, - translations.annotate_stateful_dofns_as_roots, - translations.fix_side_input_pcoll_coders, - translations.eliminate_common_key_with_none, - translations.pack_combiners, - translations.lift_combiners, - translations.expand_sdf, - translations.fix_flatten_coders, - # fn_api_runner_transforms.sink_flattens, - translations.greedily_fuse, - translations.read_to_impulse, - translations.extract_impulse_stages, - translations.remove_data_plane_ops, - translations.sort_stages - ], - known_runner_urns=flink_known_urns) + phases = [ + translations.annotate_downstream_side_inputs, + translations.annotate_stateful_dofns_as_roots, + translations.fix_side_input_pcoll_coders, + translations.eliminate_common_key_with_none, + translations.pack_combiners, + translations.lift_combiners, + translations.expand_sdf, + translations.fix_flatten_coders, + # translations.sink_flattens, + translations.greedily_fuse, + translations.read_to_impulse, + translations.extract_impulse_stages, + translations.remove_data_plane_ops, + translations.sort_stages + ] + partial = False else: phases = [] for phase_name in pre_optimize.split(','): # For now, these are all we allow. - if phase_name in 'lift_combiners': + if phase_name in ('eliminate_common_key_with_none', + 'pack_combiners', + 'lift_combiners'): phases.append(getattr(translations, phase_name)) else: raise ValueError( 'Unknown or inapplicable phase for pre_optimize: %s' % phase_name) + phases.append(translations.sort_stages) + partial = True + + # All (known) portable runners (ie Flink and Spark) support these URNs. + known_urns = frozenset([ + common_urns.composites.RESHUFFLE.urn, + common_urns.primitives.IMPULSE.urn, + common_urns.primitives.FLATTEN.urn, + common_urns.primitives.GROUP_BY_KEY.urn + ]) proto_pipeline = translations.optimize_pipeline( proto_pipeline, phases=phases, - known_runner_urns=flink_known_urns, - partial=True) + known_runner_urns=known_urns, + partial=partial) + return proto_pipeline def run_pipeline(self, pipeline, options): diff --git a/sdks/python/apache_beam/runners/portability/sdk_container_builder.py b/sdks/python/apache_beam/runners/portability/sdk_container_builder.py index 9a4984a4e9c1..f41e9f8fbdb7 100644 --- a/sdks/python/apache_beam/runners/portability/sdk_container_builder.py +++ b/sdks/python/apache_beam/runners/portability/sdk_container_builder.py @@ -196,7 +196,7 @@ def __init__(self, options): response_encoding='utf8') if not self._docker_registry_push_url: self._docker_registry_push_url = ( - 'gcr.io/%s' % self._google_cloud_options.project) + 'gcr.io/%s/prebuilt_beam_sdk' % self._google_cloud_options.project) def invoke_docker_build_and_push(self, container_image_name): project_id = self._google_cloud_options.project @@ -219,12 +219,11 @@ def invoke_docker_build_and_push(self, container_image_name): build = cloudbuild_v1.Build() build.steps = [] step = cloudbuild_v1.BuildStep() - step.name = 'gcr.io/cloud-builders/docker' - step.args = ['build', '-t', container_image_name, '.'] + step.name = 'gcr.io/kaniko-project/executor:latest' + step.args = ['--destination=' + container_image_name, '--cache=true'] step.dir = SOURCE_FOLDER build.steps.append(step) - build.images = [container_image_name] source = cloudbuild_v1.Source() source.storage_source = cloudbuild_v1.StorageSource() @@ -236,13 +235,19 @@ def invoke_docker_build_and_push(self, container_image_name): build.timeout = Duration().FromSeconds(seconds=1800) now = time.time() - _LOGGER.info('Building sdk container, this may take a few minutes...') operation = client.create_build(project_id=project_id, build=build) - # if build fails exception will be raised and stops the job submission. - result = operation.result() _LOGGER.info( - "Python SDK container pre-build finished in %.2f seconds, " - "check build log at %s" % (time.time() - now, result.log_url)) + 'Building sdk container with Google Cloud Build, this may ' + 'take a few minutes, you may check build log at %s' % + operation.metadata.build.log_url) + + # block until build finish, if build fails exception will be raised and + # stops the job submission. + operation.result() + + _LOGGER.info( + "Python SDK container pre-build finished in %.2f seconds" % + (time.time() - now)) _LOGGER.info( "Python SDK container built and pushed as %s." % container_image_name) diff --git a/sdks/python/apache_beam/runners/portability/spark_runner_test.py b/sdks/python/apache_beam/runners/portability/spark_runner_test.py index 53f0fbb1e164..062e06f75a54 100644 --- a/sdks/python/apache_beam/runners/portability/spark_runner_test.py +++ b/sdks/python/apache_beam/runners/portability/spark_runner_test.py @@ -36,7 +36,7 @@ # Run as # # pytest spark_runner_test.py[::TestClass::test_case] \ -# --test-pipeline-options "--environment_type=LOOPBACK" +# --test-pipeline-options="--environment_type=LOOPBACK" _LOGGER = logging.getLogger(__name__) @@ -87,7 +87,7 @@ def parse_options(self, request): self.set_spark_job_server_jar( known_args.spark_job_server_jar or job_server.JavaJarJobServer.path_to_beam_jar( - ':runners:job-server:shadowJar')) + ':runners:spark:job-server:shadowJar')) self.environment_type = known_args.environment_type self.environment_options = known_args.environment_options @@ -168,6 +168,13 @@ def test_register_finalizations(self): # Skip until Spark runner supports bundle finalization. raise unittest.SkipTest("BEAM-7233") + def test_sdf_with_dofn_as_watermark_estimator(self): + # Skip until Spark runner supports SDF and self-checkpoint. + raise unittest.SkipTest("BEAM-7222") + + def test_pardo_dynamic_timer(self): + raise unittest.SkipTest("BEAM-9912") + def test_flattened_side_input(self): # Blocked on support for transcoding # https://jira.apache.org/jira/browse/BEAM-7236 diff --git a/sdks/python/apache_beam/runners/runner.py b/sdks/python/apache_beam/runners/runner.py index ba80b276c95d..02ed84581250 100644 --- a/sdks/python/apache_beam/runners/runner.py +++ b/sdks/python/apache_beam/runners/runner.py @@ -31,6 +31,8 @@ from typing import TYPE_CHECKING from typing import Optional +from apache_beam.options.pipeline_options import StandardOptions + if TYPE_CHECKING: from apache_beam import pvalue from apache_beam import PTransform @@ -41,22 +43,10 @@ __all__ = ['PipelineRunner', 'PipelineState', 'PipelineResult'] -_ALL_KNOWN_RUNNERS = ( - 'apache_beam.runners.dataflow.dataflow_runner.DataflowRunner', - 'apache_beam.runners.direct.direct_runner.BundleBasedDirectRunner', - 'apache_beam.runners.direct.direct_runner.DirectRunner', - 'apache_beam.runners.direct.direct_runner.SwitchingDirectRunner', - 'apache_beam.runners.interactive.interactive_runner.InteractiveRunner', - 'apache_beam.runners.portability.flink_runner.FlinkRunner', - 'apache_beam.runners.portability.portable_runner.PortableRunner', - 'apache_beam.runners.portability.spark_runner.SparkRunner', - 'apache_beam.runners.test.TestDirectRunner', - 'apache_beam.runners.test.TestDataflowRunner', -) - -_KNOWN_RUNNER_NAMES = [path.split('.')[-1] for path in _ALL_KNOWN_RUNNERS] - -_RUNNER_MAP = {path.split('.')[-1].lower(): path for path in _ALL_KNOWN_RUNNERS} +_RUNNER_MAP = { + path.split('.')[-1].lower(): path + for path in StandardOptions.ALL_KNOWN_RUNNERS +} # Allow this alias, but don't make public. _RUNNER_MAP['pythonrpcdirectrunner'] = ( @@ -110,7 +100,7 @@ def create_runner(runner_name): raise ValueError( 'Unexpected pipeline runner: %s. Valid values are %s ' 'or the fully qualified name of a PipelineRunner subclass.' % - (runner_name, ', '.join(_KNOWN_RUNNER_NAMES))) + (runner_name, ', '.join(StandardOptions.KNOWN_RUNNER_NAMES))) class PipelineRunner(object): diff --git a/sdks/python/apache_beam/runners/worker/bundle_processor.py b/sdks/python/apache_beam/runners/worker/bundle_processor.py index 95d50545a9b4..1e1c0586b6a6 100644 --- a/sdks/python/apache_beam/runners/worker/bundle_processor.py +++ b/sdks/python/apache_beam/runners/worker/bundle_processor.py @@ -88,8 +88,8 @@ from apache_beam.runners.sdf_utils import SplitResultResidual from apache_beam.runners.worker import data_plane from apache_beam.runners.worker import sdk_worker - from apache_beam.transforms import window from apache_beam.transforms.core import Windowing + from apache_beam.transforms.window import BoundedWindow from apache_beam.utils import windowed_value # This module is experimental. No backwards-compatibility guarantees. @@ -381,7 +381,7 @@ def __init__(self, self._element_coder = coder.wrapped_value_coder self._target_window_coder = coder.window_coder # TODO(robertwb): Limit the cache size. - self._cache = {} # type: Dict[window.BoundedWindow, Any] + self._cache = {} # type: Dict[BoundedWindow, Any] def __getitem__(self, window): target_window = self._side_input_data.window_mapping_fn(window) @@ -644,14 +644,14 @@ def commit(self): class OutputTimer(userstate.BaseTimer): def __init__(self, key, - window, # type: windowed_value.BoundedWindow + window, # type: BoundedWindow timestamp, # type: timestamp.Timestamp paneinfo, # type: windowed_value.PaneInfo time_domain, # type: str timer_family_id, # type: str timer_coder_impl, # type: coder_impl.TimerCoderImpl output_stream # type: data_plane.ClosableOutputStream - ): + ): self._key = key self._window = window self._input_timestamp = timestamp @@ -661,12 +661,11 @@ def __init__(self, self._output_stream = output_stream self._timer_coder_impl = timer_coder_impl - def set(self, ts): - # type: (timestamp.TimestampTypes) -> None + def set(self, ts: timestamp.TimestampTypes, dynamic_timer_tag='') -> None: ts = timestamp.Timestamp.of(ts) timer = userstate.Timer( user_key=self._key, - dynamic_timer_tag='', + dynamic_timer_tag=dynamic_timer_tag, windows=(self._window, ), clear_bit=False, fire_timestamp=ts, @@ -676,11 +675,10 @@ def set(self, ts): self._timer_coder_impl.encode_to_stream(timer, self._output_stream, True) self._output_stream.maybe_flush() - def clear(self): - # type: () -> None + def clear(self, dynamic_timer_tag='') -> None: timer = userstate.Timer( user_key=self._key, - dynamic_timer_tag='', + dynamic_timer_tag=dynamic_timer_tag, windows=(self._window, ), clear_bit=True, fire_timestamp=None, @@ -713,10 +711,8 @@ def __init__(self, Args: state_handler: A StateServicer object. transform_id: The name of the PTransform that this context is associated. - key_coder: - window_coder: - timer_family_specs: A list of ``userstate.TimerSpec`` objects specifying - the timers associated with this operation. + key_coder: Coder for the key type. + window_coder: Coder for the window type. """ self._state_handler = state_handler self._transform_id = transform_id @@ -731,14 +727,11 @@ def add_timer_info(self, timer_family_id, timer_info): self._timers_info[timer_family_id] = timer_info def get_timer( - self, - timer_spec, - key, - window, # type: windowed_value.BoundedWindow - timestamp, - pane): - # type: (...) -> OutputTimer + self, timer_spec: userstate.TimerSpec, key, window, timestamp, + pane) -> OutputTimer: assert self._timers_info[timer_spec.name].output_stream is not None + timer_coder_impl = self._timers_info[timer_spec.name].timer_coder_impl + output_stream = self._timers_info[timer_spec.name].output_stream return OutputTimer( key, window, @@ -746,8 +739,8 @@ def get_timer( pane, timer_spec.time_domain, timer_spec.name, - self._timers_info[timer_spec.name].timer_coder_impl, - self._timers_info[timer_spec.name].output_stream) + timer_coder_impl, + output_stream) def get_state(self, *args): # type: (*Any) -> FnApiUserRuntimeStateTypes @@ -759,7 +752,7 @@ def get_state(self, *args): def _create_state(self, state_spec, # type: userstate.StateSpec key, - window # type: windowed_value.BoundedWindow + window # type: BoundedWindow ): # type: (...) -> FnApiUserRuntimeStateTypes if isinstance(state_spec, @@ -1861,3 +1854,20 @@ def process(self, element): return _create_simple_pardo_operation( factory, transform_id, transform_proto, consumers, MapWindows()) + + +@BeamTransformFactory.register_urn(common_urns.primitives.TO_STRING.urn, None) +def create_to_string_fn( + factory, # type: BeamTransformFactory + transform_id, # type: str + transform_proto, # type: beam_runner_api_pb2.PTransform + mapping_fn_spec, # type: beam_runner_api_pb2.FunctionSpec + consumers # type: Dict[str, List[operations.Operation]] +): + class ToString(beam.DoFn): + def process(self, element): + key, value = element + return [(key, str(value))] + + return _create_simple_pardo_operation( + factory, transform_id, transform_proto, consumers, ToString()) diff --git a/sdks/python/apache_beam/runners/worker/operations.py b/sdks/python/apache_beam/runners/worker/operations.py index 8c1c4a079159..70ed3d281018 100644 --- a/sdks/python/apache_beam/runners/worker/operations.py +++ b/sdks/python/apache_beam/runners/worker/operations.py @@ -73,6 +73,7 @@ from apache_beam.runners.sdf_utils import SplitResultResidual from apache_beam.runners.worker.bundle_processor import ExecutionContext from apache_beam.runners.worker.statesampler import StateSampler + from apache_beam.transforms.userstate import TimerSpec # Allow some "pure mode" declarations. try: @@ -685,7 +686,7 @@ def setup(self): self.timer_specs = { spec.name: spec for spec in userstate.get_dofn_specs(fn)[1] - } + } # type: Dict[str, TimerSpec] if self.side_input_maps is None: if tags_and_types: @@ -741,7 +742,8 @@ def process_timer(self, tag, timer_data): timer_data.user_key, timer_data.windows[0], timer_data.fire_timestamp, - timer_data.paneinfo) + timer_data.paneinfo, + timer_data.dynamic_timer_tag) def finish(self): # type: () -> None diff --git a/sdks/python/apache_beam/runners/worker/sdk_worker_test.py b/sdks/python/apache_beam/runners/worker/sdk_worker_test.py index c1cf6418baed..7fa290fddb8f 100644 --- a/sdks/python/apache_beam/runners/worker/sdk_worker_test.py +++ b/sdks/python/apache_beam/runners/worker/sdk_worker_test.py @@ -263,6 +263,8 @@ def test_harness_monitoring_infos_and_metadata(self): responses['monitoring_infos_metadata'].monitoring_infos.monitoring_info) found = False for mi in short_id_to_mi.values(): + # Clear the timestamp before comparing + mi.ClearField("start_time") if mi == expected_monitoring_info: found = True self.assertTrue(found, str(responses['monitoring_infos_metadata'])) diff --git a/sdks/python/apache_beam/transforms/core.py b/sdks/python/apache_beam/transforms/core.py index e2b4ae37fe2c..1f48c5fc3b1a 100644 --- a/sdks/python/apache_beam/transforms/core.py +++ b/sdks/python/apache_beam/transforms/core.py @@ -38,7 +38,6 @@ from apache_beam import pvalue from apache_beam import typehints from apache_beam.coders import typecoders -from apache_beam.coders.coders import ExternalCoder from apache_beam.internal import pickler from apache_beam.internal import util from apache_beam.options.pipeline_options import TypeOptions @@ -69,7 +68,6 @@ from apache_beam.typehints.decorators import with_output_types from apache_beam.typehints.trivial_inference import element_type from apache_beam.typehints.typehints import is_consistent_with -from apache_beam.utils import proto_utils from apache_beam.utils import urns from apache_beam.utils.timestamp import Duration @@ -220,7 +218,10 @@ class RestrictionProvider(object): To denote a ``DoFn`` class to be Splittable ``DoFn``, ``DoFn.process()`` method of that class should have exactly one parameter whose default value is - an instance of ``RestrictionProvider``. + an instance of ``RestrictionParam``. This ``RestrictionParam`` can either be + constructed with an explicit ``RestrictionProvider``, or, if no + ``RestrictionProvider`` is provided, the ``DoFn`` itself must be a + ``RestrictionProvider``. The provided ``RestrictionProvider`` instance must provide suitable overrides for the following methods: @@ -407,95 +408,6 @@ def get_function_args_defaults(f): return args, defaults -class RunnerAPIPTransformHolder(PTransform): - """A `PTransform` that holds a runner API `PTransform` proto. - - This is used for transforms, for which corresponding objects - cannot be initialized in Python SDK. For example, for `ParDo` transforms for - remote SDKs that may be available in Python SDK transform graph when expanding - a cross-language transform since a Python `ParDo` object cannot be generated - without a serialized Python `DoFn` object. - """ - def __init__(self, proto, context): - self._proto = proto - self._context = context - - # For ParDos with side-inputs, this will be populated after this object is - # created. - self.side_inputs = [] - self.is_pardo_with_stateful_dofn = bool(self._get_pardo_state_specs()) - - def proto(self): - """Runner API payload for a `PTransform`""" - return self._proto - - def to_runner_api(self, context, **extra_kwargs): - # TODO(BEAM-7850): no need to copy around Environment if it is a direct - # attribute of PTransform. - id_to_proto_map = self._context.environments.get_id_to_proto_map() - for env_id in id_to_proto_map: - if env_id not in context.environments: - context.environments.put_proto(env_id, id_to_proto_map[env_id]) - else: - env1 = id_to_proto_map[env_id] - env2 = context.environments[env_id] - assert env1.urn == env2.to_runner_api(context).urn, ( - 'Expected environments with the same ID to be equal but received ' - 'environments with different URNs ' - '%r and %r', - env1.urn, env2.to_runner_api(context).urn) - assert env1.payload == env2.to_runner_api(context).payload, ( - 'Expected environments with the same ID to be equal but received ' - 'environments with different payloads ' - '%r and %r', - env1.payload, env2.to_runner_api(context).payload) - - def recursively_add_coder_protos(coder_id, old_context, new_context): - coder_proto = old_context.coders.get_proto_from_id(coder_id) - new_context.coders.put_proto(coder_id, coder_proto, True) - for component_coder_id in coder_proto.component_coder_ids: - recursively_add_coder_protos( - component_coder_id, old_context, new_context) - - if common_urns.primitives.PAR_DO.urn == self._proto.urn: - # If a restriction coder has been set by an external SDK, we have to - # explicitly add it (and all component coders recursively) to the context - # to make sure that it does not get dropped by Python SDK. - par_do_payload = proto_utils.parse_Bytes( - self._proto.payload, beam_runner_api_pb2.ParDoPayload) - if par_do_payload.restriction_coder_id: - recursively_add_coder_protos( - par_do_payload.restriction_coder_id, self._context, context) - elif (common_urns.composites.COMBINE_PER_KEY.urn == self._proto.urn or - common_urns.composites.COMBINE_GLOBALLY.urn == self._proto.urn): - # We have to include coders embedded in `CombinePayload`. - combine_payload = proto_utils.parse_Bytes( - self._proto.payload, beam_runner_api_pb2.CombinePayload) - if combine_payload.accumulator_coder_id: - recursively_add_coder_protos( - combine_payload.accumulator_coder_id, self._context, context) - - return self._proto - - def get_restriction_coder(self): - # For some runners, restriction coder ID has to be provided to correctly - # encode ParDo transforms that are SDF. - if common_urns.primitives.PAR_DO.urn == self._proto.urn: - par_do_payload = proto_utils.parse_Bytes( - self._proto.payload, beam_runner_api_pb2.ParDoPayload) - if par_do_payload.restriction_coder_id: - restriction_coder_proto = self._context.coders.get_proto_from_id( - par_do_payload.restriction_coder_id) - - return ExternalCoder(restriction_coder_proto) - - def _get_pardo_state_specs(self): - if common_urns.primitives.PAR_DO.urn == self._proto.urn: - par_do_payload = proto_utils.parse_Bytes( - self._proto.payload, beam_runner_api_pb2.ParDoPayload) - return par_do_payload.state_specs - - class WatermarkEstimatorProvider(object): """Provides methods for generating WatermarkEstimator. @@ -503,8 +415,11 @@ class WatermarkEstimatorProvider(object): information within an SDF. In order to make an SDF.process() access to the typical WatermarkEstimator, - the SDF author should pass a DoFn.WatermarkEstimatorParam with a default value - of one WatermarkEstimatorProvider instance. + the SDF author should have an argument whose default value is a + DoFn.WatermarkEstimatorParam instance. This DoFn.WatermarkEstimatorParam + can either be constructed with an explicit WatermarkEstimatorProvider, + or, if no WatermarkEstimatorProvider is provided, the DoFn itself must + be a WatermarkEstimatorProvider. """ def initial_estimator_state(self, element, restriction): """Returns the initial state of the WatermarkEstimator with given element @@ -546,9 +461,10 @@ def __repr__(self): class _RestrictionDoFnParam(_DoFnParam): """Restriction Provider DoFn parameter.""" - def __init__(self, restriction_provider): - # type: (RestrictionProvider) -> None - if not isinstance(restriction_provider, RestrictionProvider): + def __init__(self, restriction_provider=None): + # type: (typing.Optional[RestrictionProvider]) -> None + if (restriction_provider is not None and + not isinstance(restriction_provider, RestrictionProvider)): raise ValueError( 'DoFn.RestrictionParam expected RestrictionProvider object.') self.restriction_provider = restriction_provider @@ -604,12 +520,15 @@ def reset(self): class _WatermarkEstimatorParam(_DoFnParam): - """WatermarkEstomator DoFn parameter.""" - def __init__(self, watermark_estimator_provider): - # type: (WatermarkEstimatorProvider) -> None - if not isinstance(watermark_estimator_provider, WatermarkEstimatorProvider): + """WatermarkEstimator DoFn parameter.""" + def __init__( + self, + watermark_estimator_provider: typing. + Optional[WatermarkEstimatorProvider] = None): + if (watermark_estimator_provider is not None and not isinstance( + watermark_estimator_provider, WatermarkEstimatorProvider)): raise ValueError( - 'DoFn._WatermarkEstimatorParam expected' + 'DoFn.WatermarkEstimatorParam expected' 'WatermarkEstimatorProvider object.') self.watermark_estimator_provider = watermark_estimator_provider self.param_id = 'WatermarkEstimatorProvider' @@ -643,6 +562,7 @@ class DoFn(WithTypeHints, HasDisplayData, urns.RunnerApiFn): # DoFn.KeyParam StateParam = _StateDoFnParam TimerParam = _TimerDoFnParam + DynamicTimerTagParam = _DoFnParam('DynamicTimerTagParam') DoFnProcessParams = [ ElementParam, @@ -654,7 +574,7 @@ class DoFn(WithTypeHints, HasDisplayData, urns.RunnerApiFn): BundleFinalizerParam, KeyParam, StateParam, - TimerParam + TimerParam, ] RestrictionParam = _RestrictionDoFnParam @@ -682,23 +602,30 @@ def process(self, element, *args, **kwargs): This is invoked by ``DoFnRunner`` for each element of a input ``PCollection``. - If specified, following default arguments are used by the ``DoFnRunner`` to - be able to pass the parameters correctly. - - ``DoFn.ElementParam``: element to be processed, should not be mutated. - ``DoFn.SideInputParam``: a side input that may be used when processing. - ``DoFn.TimestampParam``: timestamp of the input element. - ``DoFn.WindowParam``: ``Window`` the input element belongs to. - ``DoFn.TimerParam``: a ``userstate.RuntimeTimer`` object defined by the spec - of the parameter. - ``DoFn.StateParam``: a ``userstate.RuntimeState`` object defined by the spec - of the parameter. - ``DoFn.KeyParam``: key associated with the element. - ``DoFn.RestrictionParam``: an ``iobase.RestrictionTracker`` will be - provided here to allow treatment as a Splittable ``DoFn``. The restriction - tracker will be derived from the restriction provider in the parameter. - ``DoFn.WatermarkEstimatorParam``: a function that can be used to track - output watermark of Splittable ``DoFn`` implementations. + The following parameters can be used as default values on ``process`` + arguments to indicate that a DoFn accepts the corresponding parameters. For + example, a DoFn might accept the element and its timestamp with the + following signature:: + + def process(element=DoFn.ElementParam, timestamp=DoFn.TimestampParam): + ... + + The full set of parameters is: + + - ``DoFn.ElementParam``: element to be processed, should not be mutated. + - ``DoFn.SideInputParam``: a side input that may be used when processing. + - ``DoFn.TimestampParam``: timestamp of the input element. + - ``DoFn.WindowParam``: ``Window`` the input element belongs to. + - ``DoFn.TimerParam``: a ``userstate.RuntimeTimer`` object defined by the + spec of the parameter. + - ``DoFn.StateParam``: a ``userstate.RuntimeState`` object defined by the + spec of the parameter. + - ``DoFn.KeyParam``: key associated with the element. + - ``DoFn.RestrictionParam``: an ``iobase.RestrictionTracker`` will be + provided here to allow treatment as a Splittable ``DoFn``. The restriction + tracker will be derived from the restriction provider in the parameter. + - ``DoFn.WatermarkEstimatorParam``: a function that can be used to track + output watermark of Splittable ``DoFn`` implementations. Args: element: The element to be processed @@ -1148,10 +1075,7 @@ def compact(self, accumulator, *args, **kwargs): return [self._fn(accumulator, *args, **kwargs)] def extract_output(self, accumulator, *args, **kwargs): - if len(accumulator) == 1: - return accumulator[0] - else: - return self._fn(accumulator, *args, **kwargs) + return self._fn(accumulator, *args, **kwargs) def default_type_hints(self): fn_hints = get_type_hints(self._fn) @@ -1228,10 +1152,7 @@ def compact(self, accumulator): return [self._fn(accumulator)] def extract_output(self, accumulator): - if len(accumulator) == 1: - return accumulator[0] - else: - return self._fn(accumulator) + return self._fn(accumulator) class PartitionFn(WithTypeHints): diff --git a/sdks/python/apache_beam/transforms/environments.py b/sdks/python/apache_beam/transforms/environments.py index 9d48e892371d..46ea1975e359 100644 --- a/sdks/python/apache_beam/transforms/environments.py +++ b/sdks/python/apache_beam/transforms/environments.py @@ -205,16 +205,11 @@ def from_runner_api(cls, return None parameter_type, constructor = cls._known_urns[proto.urn] - try: - return constructor( - proto_utils.parse_Bytes(proto.payload, parameter_type), - proto.capabilities, - proto.dependencies, - context) - except Exception: - if context.allow_proto_holders: - return RunnerAPIEnvironmentHolder(proto) - raise + return constructor( + proto_utils.parse_Bytes(proto.payload, parameter_type), + proto.capabilities, + proto.dependencies, + context) @classmethod def from_options(cls, options): @@ -239,10 +234,17 @@ def __init__( ): super(DockerEnvironment, self).__init__(capabilities, artifacts) if container_image: + logging.info( + 'Using provided Python SDK container image: %s' % (container_image)) self.container_image = container_image else: + logging.info('No image given, using default Python SDK image') self.container_image = self.default_docker_image() + logging.info( + 'Python SDK container image set to "%s" for Docker environment' % + (self.container_image)) + def __eq__(self, other): return self.__class__ == other.__class__ \ and self.container_image == other.container_image @@ -312,9 +314,7 @@ def default_docker_image(): image = ( 'apache/beam_python{version_suffix}_sdk:{tag}'.format( version_suffix=version_suffix, tag=sdk_version)) - logging.info( - 'Using Python SDK docker image: %s. If the image is not ' - 'available at local, we will try to pull from hub.docker.com' % (image)) + logging.info('Default Python SDK image for environment is %s' % (image)) return image diff --git a/sdks/python/apache_beam/transforms/external.py b/sdks/python/apache_beam/transforms/external.py index 6b8f849ecc37..1c5e1bde3080 100644 --- a/sdks/python/apache_beam/transforms/external.py +++ b/sdks/python/apache_beam/transforms/external.py @@ -222,7 +222,10 @@ class ExternalTransform(ptransform.PTransform): Experimental; no backwards compatibility guarantees. """ _namespace_counter = 0 - _namespace = threading.local() # type: ignore[assignment] + + # Variable name _namespace conflicts with DisplayData._namespace so we use + # name _external_namespace here. + _external_namespace = threading.local() _IMPULSE_PREFIX = 'impulse' @@ -240,7 +243,7 @@ def __init__(self, urn, payload, expansion_service=None): self._payload = ( payload.payload() if isinstance(payload, PayloadBuilder) else payload) self._expansion_service = expansion_service - self._namespace = self._fresh_namespace() + self._external_namespace = self._fresh_namespace() self._inputs = {} # type: Dict[str, pvalue.PCollection] self._output = {} # type: Dict[str, pvalue.PCollection] @@ -257,15 +260,15 @@ def default_label(self): @classmethod def get_local_namespace(cls): - return getattr(cls._namespace, 'value', 'external') + return getattr(cls._external_namespace, 'value', 'external') @classmethod @contextlib.contextmanager def outer_namespace(cls, namespace): prev = cls.get_local_namespace() - cls._namespace.value = namespace + cls._external_namespace.value = namespace yield - cls._namespace.value = prev + cls._external_namespace.value = prev @classmethod def _fresh_namespace(cls): @@ -306,7 +309,7 @@ def expand(self, pvalueish): components = context.to_runner_api() request = beam_expansion_api_pb2.ExpansionRequest( components=components, - namespace=self._namespace, # type: ignore # mypy thinks self._namespace is threading.local + namespace=self._external_namespace, # type: ignore # mypy thinks self._namespace is threading.local transform=transform_proto) with self._service() as service: @@ -412,7 +415,7 @@ def _normalize(coder_proto): return normalized for id, proto in self._expanded_components.coders.items(): - if id.startswith(self._namespace): + if id.startswith(self._external_namespace): context.coders.put_proto(id, proto) elif id in context.coders: if not _equivalent(context.coders._id_to_proto[id], proto): @@ -422,10 +425,10 @@ def _normalize(coder_proto): else: context.coders.put_proto(id, proto) for id, proto in self._expanded_components.windowing_strategies.items(): - if id.startswith(self._namespace): + if id.startswith(self._external_namespace): context.windowing_strategies.put_proto(id, proto) for id, proto in self._expanded_components.environments.items(): - if id.startswith(self._namespace): + if id.startswith(self._external_namespace): context.environments.put_proto(id, proto) for id, proto in self._expanded_components.pcollections.items(): id = pcoll_renames.get(id, id) @@ -436,7 +439,8 @@ def _normalize(coder_proto): if id.startswith(self._IMPULSE_PREFIX): # Our fake inputs. continue - assert id.startswith(self._namespace), (id, self._namespace) + assert id.startswith( + self._external_namespace), (id, self._external_namespace) new_proto = beam_runner_api_pb2.PTransform( unique_name=proto.unique_name, spec=proto.spec, diff --git a/sdks/python/apache_beam/transforms/ptransform.py b/sdks/python/apache_beam/transforms/ptransform.py index 15d3699aa86e..84dfd666ae0e 100644 --- a/sdks/python/apache_beam/transforms/ptransform.py +++ b/sdks/python/apache_beam/transforms/ptransform.py @@ -73,6 +73,7 @@ class and wrapper class that allows lambda functions to be used as from apache_beam.pvalue import DoOutputsTuple from apache_beam.transforms.display import DisplayDataItem from apache_beam.transforms.display import HasDisplayData +from apache_beam.transforms.sideinputs import SIDE_INPUT_PREFIX from apache_beam.typehints import native_type_compatibility from apache_beam.typehints import typehints from apache_beam.typehints.decorators import IOTypeHints @@ -614,6 +615,35 @@ def _pvaluish_from_dict(self, input_dict): else: return input_dict + def _named_inputs(self, inputs, side_inputs): + # type: (Sequence[pvalue.PValue], Sequence[Any]) -> Dict[str, pvalue.PValue] + + """Returns the dictionary of named inputs (including side inputs) as they + should be named in the beam proto. + """ + # TODO(BEAM-1833): Push names up into the sdk construction. + main_inputs = { + str(ix): input + for (ix, input) in enumerate(inputs) + if isinstance(input, pvalue.PCollection) + } + named_side_inputs = {(SIDE_INPUT_PREFIX + '%s') % ix: si.pvalue + for (ix, si) in enumerate(side_inputs)} + return dict(main_inputs, **named_side_inputs) + + def _named_outputs(self, outputs): + # type: (Dict[object, pvalue.PCollection]) -> Dict[str, pvalue.PCollection] + + """Returns the dictionary of named outputs as they should be named in the + beam proto. + """ + # TODO(BEAM-1833): Push names up into the sdk construction. + return { + str(tag): output + for (tag, output) in outputs.items() + if isinstance(output, pvalue.PCollection) + } + _known_urns = {} # type: Dict[str, Tuple[Optional[type], ConstructorFn]] @classmethod @@ -697,18 +727,10 @@ def from_runner_api(cls, return None parameter_type, constructor = cls._known_urns[proto.spec.urn] - try: - return constructor( - proto, - proto_utils.parse_Bytes(proto.spec.payload, parameter_type), - context) - except Exception: - if context.allow_proto_holders: - # For external transforms we cannot build a Python ParDo object so - # we build a holder transform instead. - from apache_beam.transforms.core import RunnerAPIPTransformHolder - return RunnerAPIPTransformHolder(proto.spec, context) - raise + return constructor( + proto, + proto_utils.parse_Bytes(proto.spec.payload, parameter_type), + context) def to_runner_api_parameter( self, diff --git a/sdks/python/apache_beam/transforms/trigger.py b/sdks/python/apache_beam/transforms/trigger.py index d176a8be2182..cd3b10e1e17e 100644 --- a/sdks/python/apache_beam/transforms/trigger.py +++ b/sdks/python/apache_beam/transforms/trigger.py @@ -915,7 +915,8 @@ class SimpleState(with_metaclass(ABCMeta, object)): # type: ignore[misc] Only timers must hold the watermark (by their timestamp). """ @abstractmethod - def set_timer(self, window, name, time_domain, timestamp): + def set_timer( + self, window, name, time_domain, timestamp, dynamic_timer_tag=''): pass @abstractmethod @@ -923,7 +924,7 @@ def get_window(self, window_id): pass @abstractmethod - def clear_timer(self, window, name, time_domain): + def clear_timer(self, window, name, time_domain, dynamic_timer_tag=''): pass @abstractmethod @@ -971,12 +972,19 @@ def __init__(self, raw_state): self.window_ids = self.raw_state.get_global_state(self.WINDOW_IDS, {}) self.counter = None - def set_timer(self, window, name, time_domain, timestamp): - self.raw_state.set_timer(self._get_id(window), name, time_domain, timestamp) + def set_timer( + self, window, name, time_domain, timestamp, dynamic_timer_tag=''): + self.raw_state.set_timer( + self._get_id(window), + name, + time_domain, + timestamp, + dynamic_timer_tag=dynamic_timer_tag) - def clear_timer(self, window, name, time_domain): + def clear_timer(self, window, name, time_domain, dynamic_timer_tag=''): for window_id in self._get_ids(window): - self.raw_state.clear_timer(window_id, name, time_domain) + self.raw_state.clear_timer( + window_id, name, time_domain, dynamic_timer_tag=dynamic_timer_tag) def add_state(self, window, tag, value): if isinstance(tag, _ReadModifyWriteStateTag): @@ -1122,7 +1130,7 @@ def process_entire_key(self, key, windowed_values): yield wvalue.with_value((key, wvalue.value)) while state.timers: fired = state.get_and_clear_timers() - for timer_window, (name, time_domain, fire_time) in fired: + for timer_window, (name, time_domain, fire_time, _) in fired: for wvalue in self.process_timer(timer_window, name, time_domain, @@ -1445,11 +1453,12 @@ def set_global_state(self, tag, value): def get_global_state(self, tag, default=None): return self.global_state.get(tag.tag, default) - def set_timer(self, window, name, time_domain, timestamp): - self.timers[window][(name, time_domain)] = timestamp + def set_timer( + self, window, name, time_domain, timestamp, dynamic_timer_tag=''): + self.timers[window][(name, time_domain, dynamic_timer_tag)] = timestamp - def clear_timer(self, window, name, time_domain): - self.timers[window].pop((name, time_domain), None) + def clear_timer(self, window, name, time_domain, dynamic_timer_tag=''): + self.timers[window].pop((name, time_domain, dynamic_timer_tag), None) if not self.timers[window]: del self.timers[window] @@ -1504,7 +1513,8 @@ def get_timers( expired = [] has_realtime_timer = False for window, timers in list(self.timers.items()): - for (name, time_domain), timestamp in list(timers.items()): + for (name, time_domain, dynamic_timer_tag), timestamp in list( + timers.items()): if time_domain == TimeDomain.REAL_TIME: time_marker = processing_time has_realtime_timer = True @@ -1515,9 +1525,10 @@ def get_timers( 'TimeDomain error: No timers defined for time domain %s.', time_domain) if timestamp <= time_marker: - expired.append((window, (name, time_domain, timestamp))) + expired.append( + (window, (name, time_domain, timestamp, dynamic_timer_tag))) if clear: - del timers[(name, time_domain)] + del timers[(name, time_domain, dynamic_timer_tag)] if not timers and clear: del self.timers[window] return expired, has_realtime_timer diff --git a/sdks/python/apache_beam/transforms/trigger_test.py b/sdks/python/apache_beam/transforms/trigger_test.py index 073b5eca60cd..c0463067b0e0 100644 --- a/sdks/python/apache_beam/transforms/trigger_test.py +++ b/sdks/python/apache_beam/transforms/trigger_test.py @@ -157,8 +157,8 @@ def run_trigger( actual_panes[window].append(set(wvalue.value)) while state.timers: - for timer_window, (name, time_domain, - timestamp) in state.get_and_clear_timers(): + for timer_window, (name, time_domain, timestamp, + _) in state.get_and_clear_timers(): for wvalue in driver.process_timer(timer_window, name, time_domain, @@ -179,8 +179,8 @@ def run_trigger( actual_panes[window].append(set(wvalue.value)) while state.timers: - for timer_window, (name, time_domain, - timestamp) in state.get_and_clear_timers(): + for timer_window, (name, time_domain, timestamp, + _) in state.get_and_clear_timers(): for wvalue in driver.process_timer(timer_window, name, time_domain, @@ -838,7 +838,7 @@ def _execute( def fire_timers(): to_fire = state.get_and_clear_timers(watermark) while to_fire: - for timer_window, (name, time_domain, t_timestamp) in to_fire: + for timer_window, (name, time_domain, t_timestamp, _) in to_fire: for wvalue in driver.process_timer(timer_window, name, time_domain, diff --git a/sdks/python/apache_beam/transforms/userstate.py b/sdks/python/apache_beam/transforms/userstate.py index 8d417ada9a63..82ebd6ffc06e 100644 --- a/sdks/python/apache_beam/transforms/userstate.py +++ b/sdks/python/apache_beam/transforms/userstate.py @@ -25,11 +25,13 @@ from __future__ import absolute_import +import collections import types from builtins import object from typing import TYPE_CHECKING from typing import Any from typing import Callable +from typing import Dict from typing import Iterable from typing import NamedTuple from typing import Optional @@ -184,29 +186,6 @@ def to_runner_api(self, context, key_coder, window_coder): coders._TimerCoder(key_coder, window_coder))) -# TODO(BEAM-9602): Provide support for dynamic timer. -class TimerFamilySpec(object): - prefix = "tfs-" - - def __init__(self, name, time_domain): - # type: (str, str) -> None - self.name = self.prefix + name - if time_domain not in (TimeDomain.WATERMARK, TimeDomain.REAL_TIME): - raise ValueError('Unsupported TimeDomain: %r.' % (time_domain, )) - self.time_domain = time_domain - - def __repr__(self): - # type: () -> str - return '%s(%s)' % (self.__class__.__name__, self.name) - - def to_runner_api(self, context, key_coder, window_coder): - # type: (PipelineContext, coders.Coder, coders.Coder) -> beam_runner_api_pb2.TimerFamilySpec - return beam_runner_api_pb2.TimerFamilySpec( - time_domain=TimeDomain.to_runner_api(self.time_domain), - timer_family_coder_id=context.coders.get_id( - coders._TimerCoder(key_coder, window_coder))) - - def on_timer(timer_spec): # type: (TimerSpec) -> Callable[[CallableT], CallableT] @@ -324,30 +303,34 @@ def validate_stateful_dofn(dofn): class BaseTimer(object): - def clear(self): - # type: () -> None + def clear(self, dynamic_timer_tag=''): + # type: (str) -> None raise NotImplementedError - def set(self, timestamp): - # type: (Timestamp) -> None + def set(self, timestamp, dynamic_timer_tag=''): + # type: (Timestamp, str) -> None raise NotImplementedError +_TimerTuple = collections.namedtuple('timer_tuple', ('cleared', 'timestamp')) + + class RuntimeTimer(BaseTimer): """Timer interface object passed to user code.""" - def __init__(self, timer_spec): - # type: (TimerSpec) -> None + def __init__(self) -> None: + self._timer_recordings = {} # type: Dict[str, _TimerTuple] self._cleared = False self._new_timestamp = None # type: Optional[Timestamp] - def clear(self): - # type: () -> None - self._cleared = True - self._new_timestamp = None + def clear(self, dynamic_timer_tag=''): + # type: (str) -> None + self._timer_recordings[dynamic_timer_tag] = _TimerTuple( + cleared=True, timestamp=None) - def set(self, timestamp): - # type: (Timestamp) -> None - self._new_timestamp = timestamp + def set(self, timestamp, dynamic_timer_tag=''): + # type: (Timestamp, str) -> None + self._timer_recordings[dynamic_timer_tag] = _TimerTuple( + cleared=False, timestamp=timestamp) class RuntimeState(object): diff --git a/sdks/python/apache_beam/transforms/userstate_test.py b/sdks/python/apache_beam/transforms/userstate_test.py index ec676624019d..4d8385ba1231 100644 --- a/sdks/python/apache_beam/transforms/userstate_test.py +++ b/sdks/python/apache_beam/transforms/userstate_test.py @@ -64,6 +64,7 @@ class TestStatefulDoFn(DoFn): EXPIRY_TIMER_1 = TimerSpec('expiry1', TimeDomain.WATERMARK) EXPIRY_TIMER_2 = TimerSpec('expiry2', TimeDomain.WATERMARK) EXPIRY_TIMER_3 = TimerSpec('expiry3', TimeDomain.WATERMARK) + EXPIRY_TIMER_FAMILY = TimerSpec('expiry_family', TimeDomain.WATERMARK) def process( self, @@ -72,7 +73,8 @@ def process( buffer_1=DoFn.StateParam(BUFFER_STATE_1), buffer_2=DoFn.StateParam(BUFFER_STATE_2), timer_1=DoFn.TimerParam(EXPIRY_TIMER_1), - timer_2=DoFn.TimerParam(EXPIRY_TIMER_2)): + timer_2=DoFn.TimerParam(EXPIRY_TIMER_2), + dynamic_timer=DoFn.TimerParam(EXPIRY_TIMER_FAMILY)): yield element @on_timer(EXPIRY_TIMER_1) @@ -103,6 +105,13 @@ def on_expiry_3( timer_3=DoFn.TimerParam(EXPIRY_TIMER_3)): yield 'expired3' + @on_timer(EXPIRY_TIMER_FAMILY) + def on_expiry_family( + self, + dynamic_timer=DoFn.TimerParam(EXPIRY_TIMER_FAMILY), + dynamic_timer_tag=DoFn.DynamicTimerTagParam): + yield (dynamic_timer_tag, 'expired_dynamic_timer') + class InterfaceTest(unittest.TestCase): def _validate_dofn(self, dofn): @@ -165,29 +174,44 @@ def test_good_signatures(self): class BasicStatefulDoFn(DoFn): BUFFER_STATE = BagStateSpec('buffer', BytesCoder()) EXPIRY_TIMER = TimerSpec('expiry1', TimeDomain.WATERMARK) + EXPIRY_TIMER_FAMILY = TimerSpec('expiry_family_1', TimeDomain.WATERMARK) def process( self, element, buffer=DoFn.StateParam(BUFFER_STATE), - timer1=DoFn.TimerParam(EXPIRY_TIMER)): + timer1=DoFn.TimerParam(EXPIRY_TIMER), + dynamic_timer=DoFn.TimerParam(EXPIRY_TIMER_FAMILY)): yield element @on_timer(EXPIRY_TIMER) def expiry_callback(self, element, timer=DoFn.TimerParam(EXPIRY_TIMER)): yield element + @on_timer(EXPIRY_TIMER_FAMILY) + def expiry_family_callback( + self, element, dynamic_timer=DoFn.TimerParam(EXPIRY_TIMER_FAMILY)): + yield element + # Validate get_dofn_specs() and timer callbacks in # DoFnSignature. stateful_dofn = BasicStatefulDoFn() signature = self._validate_dofn(stateful_dofn) expected_specs = ( set([BasicStatefulDoFn.BUFFER_STATE]), - set([BasicStatefulDoFn.EXPIRY_TIMER])) + set([ + BasicStatefulDoFn.EXPIRY_TIMER, + BasicStatefulDoFn.EXPIRY_TIMER_FAMILY + ]), + ) self.assertEqual(expected_specs, get_dofn_specs(stateful_dofn)) self.assertEqual( stateful_dofn.expiry_callback, signature.timer_methods[BasicStatefulDoFn.EXPIRY_TIMER].method_value) + self.assertEqual( + stateful_dofn.expiry_family_callback, + signature.timer_methods[ + BasicStatefulDoFn.EXPIRY_TIMER_FAMILY].method_value) stateful_dofn = TestStatefulDoFn() signature = self._validate_dofn(stateful_dofn) @@ -196,7 +220,8 @@ def expiry_callback(self, element, timer=DoFn.TimerParam(EXPIRY_TIMER)): set([ TestStatefulDoFn.EXPIRY_TIMER_1, TestStatefulDoFn.EXPIRY_TIMER_2, - TestStatefulDoFn.EXPIRY_TIMER_3 + TestStatefulDoFn.EXPIRY_TIMER_3, + TestStatefulDoFn.EXPIRY_TIMER_FAMILY ])) self.assertEqual(expected_specs, get_dofn_specs(stateful_dofn)) self.assertEqual( @@ -208,6 +233,10 @@ def expiry_callback(self, element, timer=DoFn.TimerParam(EXPIRY_TIMER)): self.assertEqual( stateful_dofn.on_expiry_3, signature.timer_methods[TestStatefulDoFn.EXPIRY_TIMER_3].method_value) + self.assertEqual( + stateful_dofn.on_expiry_family, + signature.timer_methods[ + TestStatefulDoFn.EXPIRY_TIMER_FAMILY].method_value) def test_bad_signatures(self): # (1) The same state parameter is duplicated on the process method. @@ -269,6 +298,20 @@ def expiry_callback( with self.assertRaises(ValueError): self._validate_dofn(BadStatefulDoFn4()) + # (5) The same timer family parameter is duplicated on the process method. + class BadStatefulDoFn5(DoFn): + EXPIRY_TIMER_FAMILY = TimerSpec('dynamic_timer', TimeDomain.WATERMARK) + + def process( + self, + element, + dynamic_timer_1=DoFn.TimerParam(EXPIRY_TIMER_FAMILY), + dynamic_timer_2=DoFn.TimerParam(EXPIRY_TIMER_FAMILY)): + yield element + + with self.assertRaises(ValueError): + self._validate_dofn(BadStatefulDoFn5()) + def test_validation_typos(self): # (1) Here, the user mistakenly used the same timer spec twice for two # different timer callbacks. @@ -826,6 +869,171 @@ def emit_callback_1( self.assertEqual([('timer1-mykey', 10, 10, 15)], sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + def test_timer_default_tag(self): + class DynamicTimerDoFn(DoFn): + EMIT_TIMER_FAMILY = TimerSpec('emit', TimeDomain.WATERMARK) + + def process(self, element, emit=DoFn.TimerParam(EMIT_TIMER_FAMILY)): + emit.set(10) + emit.set(20, dynamic_timer_tag='') + + @on_timer(EMIT_TIMER_FAMILY) + def emit_callback( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + with TestPipeline() as p: + test_stream = (TestStream().advance_watermark_to(10).add_elements( + [1])).advance_watermark_to_infinity() + ( + p + | test_stream + | beam.Map(lambda x: ('mykey', x)) + | beam.ParDo(DynamicTimerDoFn()) + | beam.ParDo(self.record_dofn())) + + self.assertEqual([('', 20)], + sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + + def test_dynamic_timer_simple_dofn(self): + class DynamicTimerDoFn(DoFn): + EMIT_TIMER_FAMILY = TimerSpec('emit', TimeDomain.WATERMARK) + + def process(self, element, emit=DoFn.TimerParam(EMIT_TIMER_FAMILY)): + emit.set(10, dynamic_timer_tag='emit1') + emit.set(20, dynamic_timer_tag='emit2') + emit.set(30, dynamic_timer_tag='emit3') + + @on_timer(EMIT_TIMER_FAMILY) + def emit_callback( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + with TestPipeline() as p: + test_stream = (TestStream().advance_watermark_to(10).add_elements( + [1])).advance_watermark_to_infinity() + ( + p + | test_stream + | beam.Map(lambda x: ('mykey', x)) + | beam.ParDo(DynamicTimerDoFn()) + | beam.ParDo(self.record_dofn())) + + self.assertEqual([('emit1', 10), ('emit2', 20), ('emit3', 30)], + sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + + def test_dynamic_timer_clear_timer(self): + class DynamicTimerDoFn(DoFn): + EMIT_TIMER_FAMILY = TimerSpec('emit', TimeDomain.WATERMARK) + + def process(self, element, emit=DoFn.TimerParam(EMIT_TIMER_FAMILY)): + if element[1] == 'set': + emit.set(10, dynamic_timer_tag='emit1') + emit.set(20, dynamic_timer_tag='emit2') + emit.set(30, dynamic_timer_tag='emit3') + if element[1] == 'clear': + emit.clear(dynamic_timer_tag='emit3') + + @on_timer(EMIT_TIMER_FAMILY) + def emit_callback( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + with TestPipeline() as p: + test_stream = ( + TestStream().advance_watermark_to(5).add_elements( + ['set']).advance_watermark_to(10).add_elements( + ['clear']).advance_watermark_to_infinity()) + ( + p + | test_stream + | beam.Map(lambda x: ('mykey', x)) + | beam.ParDo(DynamicTimerDoFn()) + | beam.ParDo(self.record_dofn())) + + self.assertEqual([('emit1', 10), ('emit2', 20)], + sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + + def test_dynamic_timer_multiple(self): + class DynamicTimerDoFn(DoFn): + EMIT_TIMER_FAMILY1 = TimerSpec('emit_family_1', TimeDomain.WATERMARK) + EMIT_TIMER_FAMILY2 = TimerSpec('emit_family_2', TimeDomain.WATERMARK) + + def process( + self, + element, + emit1=DoFn.TimerParam(EMIT_TIMER_FAMILY1), + emit2=DoFn.TimerParam(EMIT_TIMER_FAMILY2)): + emit1.set(10, dynamic_timer_tag='emit11') + emit1.set(20, dynamic_timer_tag='emit12') + emit1.set(30, dynamic_timer_tag='emit13') + emit2.set(30, dynamic_timer_tag='emit21') + emit2.set(20, dynamic_timer_tag='emit22') + emit2.set(10, dynamic_timer_tag='emit23') + + @on_timer(EMIT_TIMER_FAMILY1) + def emit_callback( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + @on_timer(EMIT_TIMER_FAMILY2) + def emit_callback_2( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + with TestPipeline() as p: + test_stream = ( + TestStream().advance_watermark_to(5).add_elements( + ['1']).advance_watermark_to_infinity()) + ( + p + | test_stream + | beam.Map(lambda x: ('mykey', x)) + | beam.ParDo(DynamicTimerDoFn()) + | beam.ParDo(self.record_dofn())) + + self.assertEqual([('emit11', 10), ('emit12', 20), ('emit13', 30), + ('emit21', 30), ('emit22', 20), ('emit23', 10)], + sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + + def test_dynamic_timer_and_simple_timer(self): + class DynamicTimerDoFn(DoFn): + EMIT_TIMER_FAMILY = TimerSpec('emit', TimeDomain.WATERMARK) + GC_TIMER = TimerSpec('gc', TimeDomain.WATERMARK) + + def process( + self, + element, + emit=DoFn.TimerParam(EMIT_TIMER_FAMILY), + gc=DoFn.TimerParam(GC_TIMER)): + emit.set(10, dynamic_timer_tag='emit1') + emit.set(20, dynamic_timer_tag='emit2') + emit.set(30, dynamic_timer_tag='emit3') + gc.set(40) + + @on_timer(EMIT_TIMER_FAMILY) + def emit_callback( + self, ts=DoFn.TimestampParam, tag=DoFn.DynamicTimerTagParam): + yield (tag, ts) + + @on_timer(GC_TIMER) + def gc(self, ts=DoFn.TimestampParam): + yield ('gc', ts) + + with TestPipeline() as p: + test_stream = ( + TestStream().advance_watermark_to(5).add_elements( + ['1']).advance_watermark_to_infinity()) + ( + p + | test_stream + | beam.Map(lambda x: ('mykey', x)) + | beam.ParDo(DynamicTimerDoFn()) + | beam.ParDo(self.record_dofn())) + + self.assertEqual([('emit1', 10), ('emit2', 20), ('emit3', 30), ('gc', 40)], + sorted(StatefulDoFnOnDirectRunnerTest.all_records)) + def test_index_assignment(self): class IndexAssigningStatefulDoFn(DoFn): INDEX_STATE = CombiningValueStateSpec('index', sum) diff --git a/sdks/python/apache_beam/transforms/util.py b/sdks/python/apache_beam/transforms/util.py index 85681f4ecb05..0e795dbd7419 100644 --- a/sdks/python/apache_beam/transforms/util.py +++ b/sdks/python/apache_beam/transforms/util.py @@ -50,6 +50,7 @@ from apache_beam import typehints from apache_beam.metrics import Metrics from apache_beam.portability import common_urns +from apache_beam.portability.api import beam_runner_api_pb2 from apache_beam.transforms import window from apache_beam.transforms.combiners import CountCombineFn from apache_beam.transforms.core import CombinePerKey @@ -72,6 +73,7 @@ from apache_beam.transforms.window import NonMergingWindowFn from apache_beam.transforms.window import TimestampCombiner from apache_beam.transforms.window import TimestampedValue +from apache_beam.typehints.sharded_key_type import ShardedKeyType from apache_beam.utils import windowed_value from apache_beam.utils.annotations import deprecated from apache_beam.utils.annotations import experimental @@ -763,15 +765,12 @@ def __init__( max_buffering_duration_secs: (optional) How long in seconds at most an incomplete batch of elements is allowed to be buffered in the states. The duration must be a positive second duration and should be given as - an int or float. + an int or float. Setting this parameter to zero effectively means no + buffering limit. clock: (optional) an alternative to time.time (mostly for testing) """ - self.batch_size = batch_size - - if max_buffering_duration_secs is not None: - assert max_buffering_duration_secs > 0, ( - 'max buffering duration should be a positive value') - self.max_buffering_duration_secs = max_buffering_duration_secs + self.params = _GroupIntoBatchesParams( + batch_size, max_buffering_duration_secs) self.clock = clock def expand(self, pcoll): @@ -779,13 +778,30 @@ def expand(self, pcoll): return pcoll | ParDo( _pardo_group_into_batches( input_coder, - self.batch_size, - self.max_buffering_duration_secs, + self.params.batch_size, + self.params.max_buffering_duration_secs, self.clock)) - @experimental() + def to_runner_api_parameter( + self, + unused_context # type: PipelineContext + ): # type: (...) -> Tuple[str, beam_runner_api_pb2.GroupIntoBatchesPayload] + return ( + common_urns.group_into_batches_components.GROUP_INTO_BATCHES.urn, + self.params.get_payload()) + + @staticmethod + @PTransform.register_urn( + common_urns.group_into_batches_components.GROUP_INTO_BATCHES.urn, + beam_runner_api_pb2.GroupIntoBatchesPayload) + def from_runner_api_parameter(unused_ptransform, proto, unused_context): + return GroupIntoBatches(*_GroupIntoBatchesParams.parse_payload(proto)) + @typehints.with_input_types(Tuple[K, V]) - @typehints.with_output_types(Tuple[K, Iterable[V]]) + @typehints.with_output_types( + typehints.Tuple[ + ShardedKeyType[typehints.TypeVariable(K)], # type: ignore[misc] + typehints.Iterable[typehints.TypeVariable(V)]]) class WithShardedKey(PTransform): """A GroupIntoBatches transform that outputs batched elements associated with sharded input keys. @@ -796,25 +812,16 @@ class WithShardedKey(PTransform): execution time. """ def __init__(self, batch_size, max_buffering_duration_secs=None): - """Create a new GroupIntoBatches.WithShardedKey. - - Arguments: - batch_size: (required) How many elements should be in a batch - max_buffering_duration_secs: (optional) How long in seconds at most an - incomplete batch of elements is allowed to be buffered in the states. - The duration must be a positive second duration and should be given as - an int or float. + """Create a new GroupIntoBatches with sharded output. + See ``GroupIntoBatches`` transform for a description of input parameters. """ - self.batch_size = batch_size - - if max_buffering_duration_secs is not None: - assert max_buffering_duration_secs > 0, ( - 'max buffering duration should be a positive value') - self.max_buffering_duration_secs = max_buffering_duration_secs + self.params = _GroupIntoBatchesParams( + batch_size, max_buffering_duration_secs) _shard_id_prefix = uuid.uuid4().bytes def expand(self, pcoll): + key_type, value_type = pcoll.element_type.tuple_types sharded_pcoll = pcoll | Map( lambda key_value: ( ShardedKey( @@ -822,10 +829,70 @@ def expand(self, pcoll): # Use [uuid, thread id] as the shard id. GroupIntoBatches.WithShardedKey._shard_id_prefix + bytes( threading.get_ident().to_bytes(8, 'big'))), - key_value[1])) + key_value[1])).with_output_types( + typehints.Tuple[ + ShardedKeyType[key_type], # type: ignore[misc] + value_type]) return ( sharded_pcoll - | GroupIntoBatches(self.batch_size, self.max_buffering_duration_secs)) + | GroupIntoBatches( + self.params.batch_size, self.params.max_buffering_duration_secs)) + + def to_runner_api_parameter( + self, + unused_context # type: PipelineContext + ): # type: (...) -> Tuple[str, beam_runner_api_pb2.GroupIntoBatchesPayload] + return ( + common_urns.composites.GROUP_INTO_BATCHES_WITH_SHARDED_KEY.urn, + self.params.get_payload()) + + @staticmethod + @PTransform.register_urn( + common_urns.composites.GROUP_INTO_BATCHES_WITH_SHARDED_KEY.urn, + beam_runner_api_pb2.GroupIntoBatchesPayload) + def from_runner_api_parameter(unused_ptransform, proto, unused_context): + return GroupIntoBatches.WithShardedKey( + *_GroupIntoBatchesParams.parse_payload(proto)) + + +class _GroupIntoBatchesParams: + """This class represents the parameters for + :class:`apache_beam.utils.GroupIntoBatches` transform, used to define how + elements should be batched. + """ + def __init__(self, batch_size, max_buffering_duration_secs): + self.batch_size = batch_size + self.max_buffering_duration_secs = ( + 0 + if max_buffering_duration_secs is None else max_buffering_duration_secs) + self._validate() + + def __eq__(self, other): + if other is None or not isinstance(other, _GroupIntoBatchesParams): + return False + return ( + self.batch_size == other.batch_size and + self.max_buffering_duration_secs == other.max_buffering_duration_secs) + + def _validate(self): + assert self.batch_size is not None and self.batch_size > 0, ( + 'batch_size must be a positive value') + assert ( + self.max_buffering_duration_secs is not None and + self.max_buffering_duration_secs >= 0), ( + 'max_buffering_duration must be a non-negative value') + + def get_payload(self): + return beam_runner_api_pb2.GroupIntoBatchesPayload( + batch_size=self.batch_size, + max_buffering_duration_millis=int( + self.max_buffering_duration_secs * 1000)) + + @staticmethod + def parse_payload( + proto # type: beam_runner_api_pb2.GroupIntoBatchesPayload + ): + return proto.batch_size, proto.max_buffering_duration_millis / 1000 def _pardo_group_into_batches( @@ -850,7 +917,7 @@ def process( element_state.add(element) count_state.add(1) count = count_state.read() - if count == 1 and max_buffering_duration_secs is not None: + if count == 1 and max_buffering_duration_secs > 0: # This is the first element in batch. Start counting buffering time if a # limit was set. buffering_timer.set(clock() + max_buffering_duration_secs) diff --git a/sdks/python/apache_beam/transforms/util_test.py b/sdks/python/apache_beam/transforms/util_test.py index 26dcdb17f07d..50710ee0a03c 100644 --- a/sdks/python/apache_beam/transforms/util_test.py +++ b/sdks/python/apache_beam/transforms/util_test.py @@ -43,6 +43,9 @@ from apache_beam.coders import coders from apache_beam.options.pipeline_options import PipelineOptions from apache_beam.options.pipeline_options import StandardOptions +from apache_beam.portability import common_urns +from apache_beam.portability.api import beam_runner_api_pb2 +from apache_beam.runners import pipeline_context from apache_beam.testing.test_pipeline import TestPipeline from apache_beam.testing.test_stream import TestStream from apache_beam.testing.util import TestWindowedValue @@ -62,6 +65,9 @@ from apache_beam.transforms.window import Sessions from apache_beam.transforms.window import SlidingWindows from apache_beam.transforms.window import TimestampedValue +from apache_beam.typehints import typehints +from apache_beam.typehints.sharded_key_type import ShardedKeyType +from apache_beam.utils import proto_utils from apache_beam.utils import timestamp from apache_beam.utils.timestamp import MAX_TIMESTAMP from apache_beam.utils.timestamp import MIN_TIMESTAMP @@ -773,6 +779,65 @@ def test_buffering_timer_in_global_window_streaming(self): # the global window ends. assert_that(num_elements_per_batch, equal_to([9, 1])) + def test_output_typehints(self): + transform = util.GroupIntoBatches.WithShardedKey( + GroupIntoBatchesTest.BATCH_SIZE) + unused_input_type = typehints.Tuple[str, str] + output_type = transform.infer_output_type(unused_input_type) + self.assertTrue(isinstance(output_type, typehints.TupleConstraint)) + k, v = output_type.tuple_types + self.assertTrue(isinstance(k, ShardedKeyType)) + self.assertTrue(isinstance(v, typehints.IterableTypeConstraint)) + + with TestPipeline() as pipeline: + collection = ( + pipeline + | beam.Create([((1, 2), 'a'), ((2, 3), 'b')]) + | util.GroupIntoBatches.WithShardedKey( + GroupIntoBatchesTest.BATCH_SIZE)) + self.assertTrue( + collection.element_type, + typehints.Tuple[ + ShardedKeyType[typehints.Tuple[int, int]], # type: ignore[misc] + typehints.Iterable[str]]) + + def _test_runner_api_round_trip(self, transform, urn): + context = pipeline_context.PipelineContext() + proto = transform.to_runner_api(context) + self.assertEqual(urn, proto.urn) + payload = ( + proto_utils.parse_Bytes( + proto.payload, beam_runner_api_pb2.GroupIntoBatchesPayload)) + self.assertEqual(transform.params.batch_size, payload.batch_size) + self.assertEqual( + transform.params.max_buffering_duration_secs * 1000, + payload.max_buffering_duration_millis) + + transform_from_proto = ( + transform.__class__.from_runner_api_parameter(None, payload, None)) + self.assertIsInstance(transform_from_proto, transform.__class__) + self.assertEqual(transform.params, transform_from_proto.params) + + def test_runner_api(self): + batch_size = 10 + max_buffering_duration_secs = [None, 0, 5] + + for duration in max_buffering_duration_secs: + self._test_runner_api_round_trip( + util.GroupIntoBatches(batch_size, duration), + common_urns.group_into_batches_components.GROUP_INTO_BATCHES.urn) + self._test_runner_api_round_trip( + util.GroupIntoBatches(batch_size), + common_urns.group_into_batches_components.GROUP_INTO_BATCHES.urn) + + for duration in max_buffering_duration_secs: + self._test_runner_api_round_trip( + util.GroupIntoBatches.WithShardedKey(batch_size, duration), + common_urns.composites.GROUP_INTO_BATCHES_WITH_SHARDED_KEY.urn) + self._test_runner_api_round_trip( + util.GroupIntoBatches.WithShardedKey(batch_size), + common_urns.composites.GROUP_INTO_BATCHES_WITH_SHARDED_KEY.urn) + class ToStringTest(unittest.TestCase): def test_tostring_elements(self): diff --git a/sdks/python/apache_beam/typehints/native_type_compatibility.py b/sdks/python/apache_beam/typehints/native_type_compatibility.py index 750dd9225dc3..1baa119c4659 100644 --- a/sdks/python/apache_beam/typehints/native_type_compatibility.py +++ b/sdks/python/apache_beam/typehints/native_type_compatibility.py @@ -338,13 +338,6 @@ def convert_to_typing_type(typ): Raises: ValueError: The type was malformed or could not be converted. """ - - from apache_beam.coders.coders import CoderElementType - if isinstance(typ, CoderElementType): - # This represents an element that holds a coder. - # No special handling is needed here. - return typ - if isinstance(typ, typehints.TypeVariable): # This is a special case, as it's not parameterized by types. # Also, identity must be preserved through conversion (i.e. the same diff --git a/sdks/python/apache_beam/typehints/sharded_key_type.py b/sdks/python/apache_beam/typehints/sharded_key_type.py new file mode 100644 index 000000000000..72b198d1cf3d --- /dev/null +++ b/sdks/python/apache_beam/typehints/sharded_key_type.py @@ -0,0 +1,92 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +"""Type constraint for `ShardedKey`. + +Can be used like a type-hint, for instance, + 'ShardedKeyType[int]' + 'ShardedKeyType[Tuple[T]]' + +The type constraint is registered to be associated with +:class:`apache_beam.coders.coders.ShardedKeyCoder`. +Mostly for internal use. +""" + +# pytype: skip-file + +from __future__ import absolute_import + +from six import with_metaclass + +from apache_beam import coders +from apache_beam.typehints import typehints +from apache_beam.utils.sharded_key import ShardedKey + + +class ShardedKeyTypeConstraint(with_metaclass(typehints.GetitemConstructor, + typehints.TypeConstraint)): + def __init__(self, key_type): + typehints.validate_composite_type_param( + key_type, error_msg_prefix='Parameter to ShardedKeyType hint') + self.key_type = typehints.normalize(key_type) + + def _inner_types(self): + yield self.key_type + + def _consistent_with_check_(self, sub): + return ( + isinstance(sub, self.__class__) and + typehints.is_consistent_with(sub.key_type, self.key_type)) + + def type_check(self, instance): + if not isinstance(instance, ShardedKey): + raise typehints.CompositeTypeHintError( + "ShardedKey type-constraint violated. Valid object instance " + "must be of type 'ShardedKey'. Instead, an instance of '%s' " + "was received." % (instance.__class__.__name__)) + + try: + typehints.check_constraint(self.key_type, instance.key) + except (typehints.CompositeTypeHintError, typehints.SimpleTypeHintError): + raise typehints.CompositeTypeHintError( + "%s type-constraint violated. The type of key in 'ShardedKey' " + "is incorrect. Expected an instance of type '%s', " + "instead received an instance of type '%s'." % ( + repr(self), + typehints._unified_repr(self.key_type), + instance.key.__class__.__name__)) + + def match_type_variables(self, concrete_type): + if isinstance(concrete_type, ShardedKeyTypeConstraint): + return typehints.match_type_variables( + self.key_type, concrete_type.key_type) + return {} + + def __eq__(self, other): + return isinstance( + other, ShardedKeyTypeConstraint) and self.key_type == other.key_type + + def __hash__(self): + return hash(self.key_type) + + def __repr__(self): + return 'ShardedKey[%s]' % typehints._unified_repr(self.key_type) + + +ShardedKeyType = ShardedKeyTypeConstraint +coders.typecoders.registry.register_coder( + ShardedKeyType, coders.ShardedKeyCoder) diff --git a/sdks/python/apache_beam/typehints/sharded_key_type_test.py b/sdks/python/apache_beam/typehints/sharded_key_type_test.py new file mode 100644 index 000000000000..dce065bcd8c6 --- /dev/null +++ b/sdks/python/apache_beam/typehints/sharded_key_type_test.py @@ -0,0 +1,89 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +"""Unit tests for the ShardedKeyTypeConstraint.""" + +# pytype: skip-file + +from __future__ import absolute_import + +from apache_beam.typehints import Tuple +from apache_beam.typehints import typehints +from apache_beam.typehints.sharded_key_type import ShardedKeyType +from apache_beam.typehints.typehints_test import TypeHintTestCase +from apache_beam.utils.sharded_key import ShardedKey + + +class ShardedKeyTypeConstraintTest(TypeHintTestCase): + def test_compatibility(self): + constraint1 = ShardedKeyType[int] + constraint2 = ShardedKeyType[str] + + self.assertCompatible(constraint1, constraint1) + self.assertCompatible(constraint2, constraint2) + self.assertNotCompatible(constraint1, constraint2) + + def test_repr(self): + constraint = ShardedKeyType[int] + self.assertEqual('ShardedKey[int]', repr(constraint)) + + def test_type_check_not_sharded_key(self): + constraint = ShardedKeyType[int] + obj = 5 + with self.assertRaises(TypeError) as e: + constraint.type_check(obj) + self.assertEqual( + "ShardedKey type-constraint violated. Valid object instance must be of " + "type 'ShardedKey'. Instead, an instance of 'int' was received.", + e.exception.args[0]) + + def test_type_check_invalid_key_type(self): + constraint = ShardedKeyType[int] + obj = ShardedKey(key='abc', shard_id=b'123') + with self.assertRaises((TypeError, TypeError)) as e: + constraint.type_check(obj) + self.assertEqual( + "ShardedKey[int] type-constraint violated. The type of key in " + "'ShardedKey' is incorrect. Expected an instance of type 'int', " + "instead received an instance of type 'str'.", + e.exception.args[0]) + + def test_type_check_valid_simple_type(self): + constraint = ShardedKeyType[str] + obj = ShardedKey(key='abc', shard_id=b'123') + self.assertIsNone(constraint.type_check(obj)) + + def test_type_check_valid_composite_type(self): + constraint = ShardedKeyType[Tuple[int, str]] + obj = ShardedKey(key=(1, 'a'), shard_id=b'123') + self.assertIsNone(constraint.type_check(obj)) + + def test_match_type_variables(self): + K = typehints.TypeVariable('K') # pylint: disable=invalid-name + constraint = ShardedKeyType[K] + self.assertEqual({K: int}, + constraint.match_type_variables(ShardedKeyType[int])) + + def test_getitem(self): + K = typehints.TypeVariable('K') # pylint: disable=invalid-name + T = typehints.TypeVariable('T') # pylint: disable=invalid-name + with self.assertRaisesRegex(TypeError, + 'Parameter to ShardedKeyType hint.*'): + _ = ShardedKeyType[K, T] + with self.assertRaisesRegex(TypeError, + 'Parameter to ShardedKeyType hint.*'): + _ = ShardedKeyType[(K, T)] diff --git a/sdks/python/apache_beam/utils/shared.py b/sdks/python/apache_beam/utils/shared.py index 37f8f1e1a646..420c2be0c8a1 100644 --- a/sdks/python/apache_beam/utils/shared.py +++ b/sdks/python/apache_beam/utils/shared.py @@ -37,7 +37,7 @@ # references but can add support through subclassing: # https://docs.python.org/3/library/weakref.html class WeakRefList(list): - pass + pass class GetNthStringFn(beam.DoFn): def __init__(self, shared_handle): diff --git a/sdks/python/apache_beam/version.py b/sdks/python/apache_beam/version.py index 88da315df062..fd3ed07982dc 100644 --- a/sdks/python/apache_beam/version.py +++ b/sdks/python/apache_beam/version.py @@ -17,4 +17,4 @@ """Apache Beam SDK version information and utilities.""" -__version__ = '2.27.0.dev' +__version__ = '2.28.0.dev' diff --git a/sdks/python/build-requirements.txt b/sdks/python/build-requirements.txt index 1ecd6ec10a50..415ac340ab1d 100644 --- a/sdks/python/build-requirements.txt +++ b/sdks/python/build-requirements.txt @@ -17,3 +17,6 @@ grpcio-tools==1.30.0 future==0.18.2 mypy-protobuf==1.18 + +# Avoid https://github.com/pypa/virtualenv/issues/2006 +distlib==0.3.1 \ No newline at end of file diff --git a/sdks/python/container/common.gradle b/sdks/python/container/common.gradle index bb4eba94c485..9fedf9322f9e 100644 --- a/sdks/python/container/common.gradle +++ b/sdks/python/container/common.gradle @@ -60,6 +60,8 @@ docker { project.docker_image_default_repo_root, tag: project.rootProject.hasProperty(["docker-tag"]) ? project.rootProject["docker-tag"] : project.sdk_version) + // tags used by dockerTag task + tags containerImageTags() files "../Dockerfile", "./build" buildArgs(['py_version': "${project.ext.pythonVersion}", 'pull_licenses': project.rootProject.hasProperty(["docker-pull-licenses"]) || diff --git a/sdks/python/setup.py b/sdks/python/setup.py index e0292981d242..059394a92260 100644 --- a/sdks/python/setup.py +++ b/sdks/python/setup.py @@ -165,7 +165,9 @@ def get_version(): 'freezegun>=0.3.12', 'nose>=1.3.7', 'nose_xunitmp>=0.4.1', - 'pandas>=1.0,<2', + # TODO(BEAM-11531): Address test breakages in pandas 1.2 + # 'pandas>=1.0,<2', + 'pandas>=1.0,<1.2.0', 'parameterized>=0.7.1,<0.8.0', 'pyhamcrest>=1.9,!=1.10.0,<2.0.0', 'pyyaml>=3.12,<6.0.0', @@ -215,7 +217,7 @@ def get_version(): # headless chrome based integration tests 'selenium>=3.141.0,<4', 'needle>=0.5.0,<1', - 'chromedriver-binary>=86,<87', + 'chromedriver-binary>=87,<88', # use a fixed major version of PIL for different python versions 'pillow>=7.1.1,<8', ] diff --git a/sdks/python/test-suites/dataflow/build.gradle b/sdks/python/test-suites/dataflow/build.gradle index 919e74358629..22e19dbe075f 100644 --- a/sdks/python/test-suites/dataflow/build.gradle +++ b/sdks/python/test-suites/dataflow/build.gradle @@ -48,3 +48,27 @@ task chicagoTaxiExample { dependsOn.add("sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:chicagoTaxiExample") } } + +task validatesRunnerBatchTests { + getVersionsAsList('dataflow_validates_runner_batch_tests').each { + dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerBatchTests") + } +} + +task validatesRunnerStreamingTests { + getVersionsAsList('dataflow_validates_runner_streaming_tests').each { + dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerStreamingTests") + } +} + +task validatesRunnerBatchTestsV2 { + getVersionsAsList('dataflow_validates_runner_batch_tests_V2').each { + dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerBatchTests") + } +} + +task validatesRunnerStreamingTestsV2 { + getVersionsAsList('dataflow_validates_runner_streaming_tests_V2').each { + dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerStreamingTests") + } +} diff --git a/sdks/python/test-suites/gradle.properties b/sdks/python/test-suites/gradle.properties index 1ff61155cef8..e27d53a11902 100644 --- a/sdks/python/test-suites/gradle.properties +++ b/sdks/python/test-suites/gradle.properties @@ -24,6 +24,11 @@ dataflow_precommit_it_task_py_versions=3.6,3.7 dataflow_mongodbio_it_task_py_versions=3.6 dataflow_chicago_taxi_example_task_py_versions=3.7 +dataflow_validates_runner_batch_tests=3.6,3.7,3.8 +dataflow_validates_runner_streaming_tests=3.6,3.7,3.8 +# TODO: Enable following tests after making sure we have enough capacity. +dataflow_validates_runner_batch_tests_V2=3.8 +dataflow_validates_runner_streaming_tests_V2=3.8 # direct runner test-suites direct_mongodbio_it_task_py_versions=3.6 diff --git a/sdks/python/test-suites/portable/common.gradle b/sdks/python/test-suites/portable/common.gradle index 0e3e95673f4e..27937689bbe3 100644 --- a/sdks/python/test-suites/portable/common.gradle +++ b/sdks/python/test-suites/portable/common.gradle @@ -19,7 +19,8 @@ import org.apache.tools.ant.taskdefs.condition.Os */ def pythonRootDir = "${rootDir}/sdks/python" -def pythonVersionSuffix = project.ext.pythonVersion == '2.7' ? '2' : project.ext.pythonVersion.replace('.', '') +def pythonVersionSuffix = project.ext.pythonVersion.replace('.', '') +def latestFlinkVersion = project.ext.latestFlinkVersion ext { pythonContainerTask = ":sdks:python:container:py${pythonVersionSuffix}:docker" @@ -27,15 +28,15 @@ ext { def createFlinkRunnerTestTask(String workerType) { def taskName = "flinkCompatibilityMatrix${workerType}" - // `project(':runners:flink:1.10:job-server').shadowJar.archivePath` is not resolvable until runtime, so hard-code it here. - def jobServerJar = "${rootDir}/runners/flink/1.10/job-server/build/libs/beam-runners-flink-1.10-job-server-${version}.jar" + // project(":runners:flink:${latestFlinkVersion}:job-server").shadowJar.archivePath is not resolvable until runtime, so hard-code it here. + def jobServerJar = "${rootDir}/runners/flink/${latestFlinkVersion}/job-server/build/libs/beam-runners-flink-${latestFlinkVersion}-job-server-${version}.jar" def options = "--flink_job_server_jar=${jobServerJar} --environment_type=${workerType}" if (workerType == 'PROCESS') { options += " --environment_options=process_command=${buildDir.absolutePath}/sdk_worker.sh" } def task = toxTask(taskName, 'flink-runner-test', options) // Through the Flink job server, we transitively add dependencies on the expansion services needed in tests. - task.dependsOn ':runners:flink:1.10:job-server:shadowJar' + task.dependsOn ":runners:flink:${latestFlinkVersion}:job-server:shadowJar" // The Java SDK worker is required to execute external transforms. task.dependsOn ':sdks:java:container:java8:docker' if (workerType == 'DOCKER') { @@ -57,7 +58,7 @@ task flinkValidatesRunner() { // TODO(BEAM-8598): Enable on pre-commit. task flinkTriggerTranscript() { dependsOn 'setupVirtualenv' - dependsOn ':runners:flink:1.10:job-server:shadowJar' + dependsOn ":runners:flink:${latestFlinkVersion}:job-server:shadowJar" doLast { exec { executable 'sh' @@ -67,7 +68,7 @@ task flinkTriggerTranscript() { && pip install -e .[test] \\ && python setup.py nosetests \\ --tests apache_beam.transforms.trigger_test:WeakTestStreamTranscriptTest \\ - --test-pipeline-options='--runner=FlinkRunner --environment_type=LOOPBACK --flink_job_server_jar=${project(":runners:flink:1.10:job-server:").shadowJar.archivePath}' + --test-pipeline-options='--runner=FlinkRunner --environment_type=LOOPBACK --flink_job_server_jar=${project(":runners:flink:${latestFlinkVersion}:job-server:").shadowJar.archivePath}' """ } } @@ -146,7 +147,7 @@ task sparkValidatesRunner() { project.task("preCommitPy${pythonVersionSuffix}") { dependsOn = [":sdks:python:container:py${pythonVersionSuffix}:docker", - ':runners:flink:1.10:job-server:shadowJar', + ":runners:flink:${latestFlinkVersion}:job-server:shadowJar", 'portableWordCountFlinkRunnerBatch', 'portableWordCountFlinkRunnerStreaming'] } @@ -163,7 +164,7 @@ project.task("postCommitPy${pythonVersionSuffix}IT") { dependsOn = [ 'setupVirtualenv', 'installGcpTest', - ':runners:flink:1.10:job-server:shadowJar', + ":runners:flink:${latestFlinkVersion}:job-server:shadowJar", ':sdks:java:container:java8:docker', ':sdks:java:testing:kafka-service:buildTestKafkaServiceJar', ':sdks:java:io:google-cloud-platform:expansion-service:shadowJar', @@ -193,3 +194,70 @@ project.task("postCommitPy${pythonVersionSuffix}IT") { } } } + +def addTestJavaJarCreator(String runner, Task jobServerJarTask) { + project.tasks.create(name: "testJavaJarCreator${runner}") { + dependsOn jobServerJarTask + dependsOn pythonContainerTask + doLast{ + exec { + executable "sh" + def options = [ + "--runner ${runner}", + "--job_server_jar ${jobServerJarTask.archivePath}", + "--env_dir ${project.rootProject.buildDir}/gradleenv/${project.path.hashCode()}", + "--python_root_dir ${project.rootDir}/sdks/python", + "--python_version ${project.ext.pythonVersion}", + "--python_container_image ${project.docker_image_default_repo_root}/" + + "${project.docker_image_default_repo_prefix}" + + "python${project.ext.pythonVersion}_sdk:${project.sdk_version}", + ] + args "-c", "${project.rootDir}/runners/portability/test_pipeline_jar.sh ${options.join(' ')}" + } + } + } +} + +// TODO(BEAM-11333) Update and test multiple Flink versions. +addTestJavaJarCreator("FlinkRunner", tasks.getByPath(":runners:flink:${latestFlinkVersion}:job-server:shadowJar")) +addTestJavaJarCreator("SparkRunner", tasks.getByPath(":runners:spark:job-server:shadowJar")) + +def addTestFlinkUberJar(boolean saveMainSession) { + project.tasks.create(name: "testUberJarFlinkRunner${saveMainSession ? 'SaveMainSession' : ''}") { + dependsOn ":runners:flink:${latestFlinkVersion}:job-server:shadowJar" + dependsOn ":runners:flink:${latestFlinkVersion}:job-server:miniCluster" + dependsOn pythonContainerTask + doLast{ + exec { + executable "sh" + def options = [ + "--flink_job_server_jar ${tasks.getByPath(":runners:flink:${latestFlinkVersion}:job-server:shadowJar").archivePath}", + "--flink_mini_cluster_jar ${tasks.getByPath(":runners:flink:${latestFlinkVersion}:job-server:miniCluster").archivePath}", + "--env_dir ${project.rootProject.buildDir}/gradleenv/${project.path.hashCode()}", + "--python_root_dir ${project.rootDir}/sdks/python", + "--python_version ${project.ext.pythonVersion}", + "--python_container_image ${project.docker_image_default_repo_root}/" + + "${project.docker_image_default_repo_prefix}" + + "python${project.ext.pythonVersion}_sdk:${project.sdk_version}", + ] + if (saveMainSession) { + options.add('--save_main_session') + } + args "-c", "${project.rootDir}/runners/portability/test_flink_uber_jar.sh ${options.join(' ')}" + } + } + } +} + +addTestFlinkUberJar(false) +addTestFlinkUberJar(true) + +task testPipelineJarSparkRunner() { + dependsOn testJavaJarCreatorSparkRunner +} + +task testPipelineJarFlinkRunner() { + dependsOn testJavaJarCreatorFlinkRunner + dependsOn testUberJarFlinkRunner + dependsOn testUberJarFlinkRunnerSaveMainSession +} diff --git a/website/.gitignore b/website/.gitignore deleted file mode 100644 index bbed591c748a..000000000000 --- a/website/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -_site -.doctrees -.sass-cache -.jekyll-metadata -vendor/ -.bundle/ -content/ - -# Ignore IntelliJ files. -.idea/ -*.iml -*.ipr -*.iws - -# Hugo -www/node_modules -www/dist -www/site/resources -www/site/code_samples -www/site/_config_branch_repo.toml -www/yarn-error.log -!www/site/content - diff --git a/website/www/node_modules/.bin/autoprefixer b/website/www/node_modules/.bin/autoprefixer new file mode 100755 index 000000000000..33e58646bc49 --- /dev/null +++ b/website/www/node_modules/.bin/autoprefixer @@ -0,0 +1,22 @@ +#!/usr/bin/env node + +let mode = process.argv[2] +if (mode === '--info') { + process.stdout.write( + require('../')().info() + '\n') +} else if (mode === '--version') { + process.stdout.write( + 'autoprefixer ' + require('../package.json').version + '\n') +} else { + process.stdout.write( + 'autoprefix\n' + + '\n' + + 'Options:\n' + + ' --info Show target browsers and used prefixes\n' + + ' --version Show version number\n' + + ' --help Show help\n' + + '\n' + + 'Usage:\n' + + ' autoprefixer --info\n' + ) +} diff --git a/website/www/node_modules/.bin/browserslist b/website/www/node_modules/.bin/browserslist new file mode 100755 index 000000000000..526885fdb145 --- /dev/null +++ b/website/www/node_modules/.bin/browserslist @@ -0,0 +1,145 @@ +#!/usr/bin/env node + +var fs = require('fs') + +var browserslist = require('./') +var updateDb = require('./update-db') +var pkg = require('./package.json') + +var args = process.argv.slice(2) + +var USAGE = 'Usage:\n' + + ' npx browserslist\n' + + ' npx browserslist "QUERIES"\n' + + ' npx browserslist --json "QUERIES"\n' + + ' npx browserslist --config="path/to/browserlist/file"\n' + + ' npx browserslist --coverage "QUERIES"\n' + + ' npx browserslist --coverage=US "QUERIES"\n' + + ' npx browserslist --coverage=US,RU,global "QUERIES"\n' + + ' npx browserslist --env="environment name defined in config"\n' + + ' npx browserslist --stats="path/to/browserlist/stats/file"\n' + + ' npx browserslist --mobile-to-desktop\n' + + ' npx browserslist --update-db' + +function isArg (arg) { + return args.some(function (str) { + return str === arg || str.indexOf(arg + '=') === 0 + }) +} + +function error (msg) { + process.stderr.write('browserslist: ' + msg + '\n') + process.exit(1) +} + +if (isArg('--help') || isArg('-h')) { + process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n') +} else if (isArg('--version') || isArg('-v')) { + process.stdout.write('browserslist ' + pkg.version + '\n') +} else if (isArg('--update-db')) { + updateDb(function (str) { + process.stdout.write(str) + }) +} else { + var mode = 'browsers' + var opts = { } + var queries + var areas + + for (var i = 0; i < args.length; i++) { + if (args[i][0] !== '-') { + queries = args[i].replace(/^["']|["']$/g, '') + continue + } + + var arg = args[i].split('=') + var name = arg[0] + var value = arg[1] + + if (value) value = value.replace(/^["']|["']$/g, '') + + if (name === '--config' || name === '-b') { + opts.config = value + } else if (name === '--env' || name === '-e') { + opts.env = value + } else if (name === '--stats' || name === '-s') { + opts.stats = value + } else if (name === '--coverage' || name === '-c') { + if (mode !== 'json') mode = 'coverage' + if (value) { + areas = value.split(',') + } else { + areas = ['global'] + } + } else if (name === '--json') { + mode = 'json' + } else if (name === '--mobile-to-desktop') { + opts.mobileToDesktop = true + } else { + error('Unknown arguments ' + args[i] + '.\n\n' + USAGE) + } + } + + var browsers + try { + browsers = browserslist(queries, opts) + } catch (e) { + if (e.name === 'BrowserslistError') { + error(e.message) + } else { + throw e + } + } + + var coverage + if (mode === 'browsers') { + browsers.forEach(function (browser) { + process.stdout.write(browser + '\n') + }) + } else if (areas) { + coverage = areas.map(function (area) { + var stats + if (area !== 'global') { + stats = area + } else if (opts.stats) { + stats = JSON.parse(fs.readFileSync(opts.stats)) + } + var result = browserslist.coverage(browsers, stats) + var round = Math.round(result * 100) / 100.0 + + return [area, round] + }) + + if (mode === 'coverage') { + var prefix = 'These browsers account for ' + process.stdout.write(prefix) + coverage.forEach(function (data, index) { + var area = data[0] + var round = data[1] + var end = 'globally' + if (area && area !== 'global') { + end = 'in the ' + area.toUpperCase() + } else if (opts.stats) { + end = 'in custom statistics' + } + + if (index !== 0) { + process.stdout.write(prefix.replace(/./g, ' ')) + } + + process.stdout.write(round + '% of all users ' + end + '\n') + }) + } + } + + if (mode === 'json') { + var data = { browsers: browsers } + if (coverage) { + data.coverage = coverage.reduce(function (object, j) { + object[j[0]] = j[1] + return object + }, { }) + } + process.stdout.write(JSON.stringify(data, null, ' ') + '\n') + } +} diff --git a/website/www/node_modules/.bin/cross-env b/website/www/node_modules/.bin/cross-env new file mode 100755 index 000000000000..5ed1b7fe7282 --- /dev/null +++ b/website/www/node_modules/.bin/cross-env @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +const crossEnv = require('..') + +crossEnv(process.argv.slice(2)) diff --git a/website/www/node_modules/.bin/cross-env-shell b/website/www/node_modules/.bin/cross-env-shell new file mode 100755 index 000000000000..588034a460dc --- /dev/null +++ b/website/www/node_modules/.bin/cross-env-shell @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +const crossEnv = require('..') + +crossEnv(process.argv.slice(2), {shell: true}) diff --git a/website/www/node_modules/.bin/esparse b/website/www/node_modules/.bin/esparse new file mode 100755 index 000000000000..45d05fbb7326 --- /dev/null +++ b/website/www/node_modules/.bin/esparse @@ -0,0 +1,139 @@ +#!/usr/bin/env node +/* + Copyright JS Foundation and other contributors, https://js.foundation/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 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 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. +*/ + +/*jslint sloppy:true node:true rhino:true */ + +var fs, esprima, fname, forceFile, content, options, syntax; + +if (typeof require === 'function') { + fs = require('fs'); + try { + esprima = require('esprima'); + } catch (e) { + esprima = require('../'); + } +} else if (typeof load === 'function') { + try { + load('esprima.js'); + } catch (e) { + load('../esprima.js'); + } +} + +// Shims to Node.js objects when running under Rhino. +if (typeof console === 'undefined' && typeof process === 'undefined') { + console = { log: print }; + fs = { readFileSync: readFile }; + process = { argv: arguments, exit: quit }; + process.argv.unshift('esparse.js'); + process.argv.unshift('rhino'); +} + +function showUsage() { + console.log('Usage:'); + console.log(' esparse [options] [file.js]'); + console.log(); + console.log('Available options:'); + console.log(); + console.log(' --comment Gather all line and block comments in an array'); + console.log(' --loc Include line-column location info for each syntax node'); + console.log(' --range Include index-based range for each syntax node'); + console.log(' --raw Display the raw value of literals'); + console.log(' --tokens List all tokens in an array'); + console.log(' --tolerant Tolerate errors on a best-effort basis (experimental)'); + console.log(' -v, --version Shows program version'); + console.log(); + process.exit(1); +} + +options = {}; + +process.argv.splice(2).forEach(function (entry) { + + if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') { + if (typeof fname === 'string') { + console.log('Error: more than one input file.'); + process.exit(1); + } else { + fname = entry; + } + } else if (entry === '-h' || entry === '--help') { + showUsage(); + } else if (entry === '-v' || entry === '--version') { + console.log('ECMAScript Parser (using Esprima version', esprima.version, ')'); + console.log(); + process.exit(0); + } else if (entry === '--comment') { + options.comment = true; + } else if (entry === '--loc') { + options.loc = true; + } else if (entry === '--range') { + options.range = true; + } else if (entry === '--raw') { + options.raw = true; + } else if (entry === '--tokens') { + options.tokens = true; + } else if (entry === '--tolerant') { + options.tolerant = true; + } else if (entry === '--') { + forceFile = true; + } else { + console.log('Error: unknown option ' + entry + '.'); + process.exit(1); + } +}); + +// Special handling for regular expression literal since we need to +// convert it to a string literal, otherwise it will be decoded +// as object "{}" and the regular expression would be lost. +function adjustRegexLiteral(key, value) { + if (key === 'value' && value instanceof RegExp) { + value = value.toString(); + } + return value; +} + +function run(content) { + syntax = esprima.parse(content, options); + console.log(JSON.stringify(syntax, adjustRegexLiteral, 4)); +} + +try { + if (fname && (fname !== '-' || forceFile)) { + run(fs.readFileSync(fname, 'utf-8')); + } else { + var content = ''; + process.stdin.resume(); + process.stdin.on('data', function(chunk) { + content += chunk; + }); + process.stdin.on('end', function() { + run(content); + }); + } +} catch (e) { + console.log('Error: ' + e.message); + process.exit(1); +} diff --git a/website/www/node_modules/.bin/esvalidate b/website/www/node_modules/.bin/esvalidate new file mode 100755 index 000000000000..d49a7e40a8c3 --- /dev/null +++ b/website/www/node_modules/.bin/esvalidate @@ -0,0 +1,236 @@ +#!/usr/bin/env node +/* + Copyright JS Foundation and other contributors, https://js.foundation/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 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 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. +*/ + +/*jslint sloppy:true plusplus:true node:true rhino:true */ +/*global phantom:true */ + +var fs, system, esprima, options, fnames, forceFile, count; + +if (typeof esprima === 'undefined') { + // PhantomJS can only require() relative files + if (typeof phantom === 'object') { + fs = require('fs'); + system = require('system'); + esprima = require('./esprima'); + } else if (typeof require === 'function') { + fs = require('fs'); + try { + esprima = require('esprima'); + } catch (e) { + esprima = require('../'); + } + } else if (typeof load === 'function') { + try { + load('esprima.js'); + } catch (e) { + load('../esprima.js'); + } + } +} + +// Shims to Node.js objects when running under PhantomJS 1.7+. +if (typeof phantom === 'object') { + fs.readFileSync = fs.read; + process = { + argv: [].slice.call(system.args), + exit: phantom.exit, + on: function (evt, callback) { + callback(); + } + }; + process.argv.unshift('phantomjs'); +} + +// Shims to Node.js objects when running under Rhino. +if (typeof console === 'undefined' && typeof process === 'undefined') { + console = { log: print }; + fs = { readFileSync: readFile }; + process = { + argv: arguments, + exit: quit, + on: function (evt, callback) { + callback(); + } + }; + process.argv.unshift('esvalidate.js'); + process.argv.unshift('rhino'); +} + +function showUsage() { + console.log('Usage:'); + console.log(' esvalidate [options] [file.js...]'); + console.log(); + console.log('Available options:'); + console.log(); + console.log(' --format=type Set the report format, plain (default) or junit'); + console.log(' -v, --version Print program version'); + console.log(); + process.exit(1); +} + +options = { + format: 'plain' +}; + +fnames = []; + +process.argv.splice(2).forEach(function (entry) { + + if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') { + fnames.push(entry); + } else if (entry === '-h' || entry === '--help') { + showUsage(); + } else if (entry === '-v' || entry === '--version') { + console.log('ECMAScript Validator (using Esprima version', esprima.version, ')'); + console.log(); + process.exit(0); + } else if (entry.slice(0, 9) === '--format=') { + options.format = entry.slice(9); + if (options.format !== 'plain' && options.format !== 'junit') { + console.log('Error: unknown report format ' + options.format + '.'); + process.exit(1); + } + } else if (entry === '--') { + forceFile = true; + } else { + console.log('Error: unknown option ' + entry + '.'); + process.exit(1); + } +}); + +if (fnames.length === 0) { + fnames.push(''); +} + +if (options.format === 'junit') { + console.log(''); + console.log(''); +} + +count = 0; + +function run(fname, content) { + var timestamp, syntax, name; + try { + if (typeof content !== 'string') { + throw content; + } + + if (content[0] === '#' && content[1] === '!') { + content = '//' + content.substr(2, content.length); + } + + timestamp = Date.now(); + syntax = esprima.parse(content, { tolerant: true }); + + if (options.format === 'junit') { + + name = fname; + if (name.lastIndexOf('/') >= 0) { + name = name.slice(name.lastIndexOf('/') + 1); + } + + console.log(''); + + syntax.errors.forEach(function (error) { + var msg = error.message; + msg = msg.replace(/^Line\ [0-9]*\:\ /, ''); + console.log(' '); + console.log(' ' + + error.message + '(' + name + ':' + error.lineNumber + ')' + + ''); + console.log(' '); + }); + + console.log(''); + + } else if (options.format === 'plain') { + + syntax.errors.forEach(function (error) { + var msg = error.message; + msg = msg.replace(/^Line\ [0-9]*\:\ /, ''); + msg = fname + ':' + error.lineNumber + ': ' + msg; + console.log(msg); + ++count; + }); + + } + } catch (e) { + ++count; + if (options.format === 'junit') { + console.log(''); + console.log(' '); + console.log(' ' + + e.message + '(' + fname + ((e.lineNumber) ? ':' + e.lineNumber : '') + + ')'); + console.log(' '); + console.log(''); + } else { + console.log(fname + ':' + e.lineNumber + ': ' + e.message.replace(/^Line\ [0-9]*\:\ /, '')); + } + } +} + +fnames.forEach(function (fname) { + var content = ''; + try { + if (fname && (fname !== '-' || forceFile)) { + content = fs.readFileSync(fname, 'utf-8'); + } else { + fname = ''; + process.stdin.resume(); + process.stdin.on('data', function(chunk) { + content += chunk; + }); + process.stdin.on('end', function() { + run(fname, content); + }); + return; + } + } catch (e) { + content = e; + } + run(fname, content); +}); + +process.on('exit', function () { + if (options.format === 'junit') { + console.log(''); + } + + if (count > 0) { + process.exit(1); + } + + if (count === 0 && typeof phantom === 'object') { + process.exit(0); + } +}); diff --git a/website/www/node_modules/.bin/js-yaml b/website/www/node_modules/.bin/js-yaml new file mode 100755 index 000000000000..e79186be6f56 --- /dev/null +++ b/website/www/node_modules/.bin/js-yaml @@ -0,0 +1,132 @@ +#!/usr/bin/env node + + +'use strict'; + +/*eslint-disable no-console*/ + + +// stdlib +var fs = require('fs'); + + +// 3rd-party +var argparse = require('argparse'); + + +// internal +var yaml = require('..'); + + +//////////////////////////////////////////////////////////////////////////////// + + +var cli = new argparse.ArgumentParser({ + prog: 'js-yaml', + version: require('../package.json').version, + addHelp: true +}); + + +cli.addArgument([ '-c', '--compact' ], { + help: 'Display errors in compact mode', + action: 'storeTrue' +}); + + +// deprecated (not needed after we removed output colors) +// option suppressed, but not completely removed for compatibility +cli.addArgument([ '-j', '--to-json' ], { + help: argparse.Const.SUPPRESS, + dest: 'json', + action: 'storeTrue' +}); + + +cli.addArgument([ '-t', '--trace' ], { + help: 'Show stack trace on error', + action: 'storeTrue' +}); + +cli.addArgument([ 'file' ], { + help: 'File to read, utf-8 encoded without BOM', + nargs: '?', + defaultValue: '-' +}); + + +//////////////////////////////////////////////////////////////////////////////// + + +var options = cli.parseArgs(); + + +//////////////////////////////////////////////////////////////////////////////// + +function readFile(filename, encoding, callback) { + if (options.file === '-') { + // read from stdin + + var chunks = []; + + process.stdin.on('data', function (chunk) { + chunks.push(chunk); + }); + + process.stdin.on('end', function () { + return callback(null, Buffer.concat(chunks).toString(encoding)); + }); + } else { + fs.readFile(filename, encoding, callback); + } +} + +readFile(options.file, 'utf8', function (error, input) { + var output, isYaml; + + if (error) { + if (error.code === 'ENOENT') { + console.error('File not found: ' + options.file); + process.exit(2); + } + + console.error( + options.trace && error.stack || + error.message || + String(error)); + + process.exit(1); + } + + try { + output = JSON.parse(input); + isYaml = false; + } catch (err) { + if (err instanceof SyntaxError) { + try { + output = []; + yaml.loadAll(input, function (doc) { output.push(doc); }, {}); + isYaml = true; + + if (output.length === 0) output = null; + else if (output.length === 1) output = output[0]; + + } catch (e) { + if (options.trace && err.stack) console.error(e.stack); + else console.error(e.toString(options.compact)); + + process.exit(1); + } + } else { + console.error( + options.trace && err.stack || + err.message || + String(err)); + + process.exit(1); + } + } + + if (isYaml) console.log(JSON.stringify(output, null, ' ')); + else console.log(yaml.dump(output)); +}); diff --git a/website/www/node_modules/.bin/node-which b/website/www/node_modules/.bin/node-which new file mode 100755 index 000000000000..7cee3729eebd --- /dev/null +++ b/website/www/node_modules/.bin/node-which @@ -0,0 +1,52 @@ +#!/usr/bin/env node +var which = require("../") +if (process.argv.length < 3) + usage() + +function usage () { + console.error('usage: which [-as] program ...') + process.exit(1) +} + +var all = false +var silent = false +var dashdash = false +var args = process.argv.slice(2).filter(function (arg) { + if (dashdash || !/^-/.test(arg)) + return true + + if (arg === '--') { + dashdash = true + return false + } + + var flags = arg.substr(1).split('') + for (var f = 0; f < flags.length; f++) { + var flag = flags[f] + switch (flag) { + case 's': + silent = true + break + case 'a': + all = true + break + default: + console.error('which: illegal option -- ' + flag) + usage() + } + } + return false +}) + +process.exit(args.reduce(function (pv, current) { + try { + var f = which.sync(current, { all: all }) + if (all) + f = f.join('\n') + if (!silent) + console.log(f) + return pv; + } catch (e) { + return 1; + } +}, 0)) diff --git a/website/www/node_modules/.bin/postcss b/website/www/node_modules/.bin/postcss new file mode 100755 index 000000000000..d40abef7528a --- /dev/null +++ b/website/www/node_modules/.bin/postcss @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../') diff --git a/website/www/node_modules/.yarn-integrity b/website/www/node_modules/.yarn-integrity new file mode 100644 index 000000000000..b0ae58c4ad3d --- /dev/null +++ b/website/www/node_modules/.yarn-integrity @@ -0,0 +1,156 @@ +{ + "systemParams": "linux-x64-64", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [ + "autoprefixer@^9.7.4", + "cross-env@^7.0.2", + "postcss-cli@^7.1.0" + ], + "lockfileEntries": { + "@nodelib/fs.scandir@2.1.3": "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b", + "@nodelib/fs.stat@2.0.3": "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3", + "@nodelib/fs.stat@^2.0.2": "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3", + "@nodelib/fs.walk@^1.2.3": "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976", + "@types/color-name@^1.1.1": "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0", + "ansi-regex@^5.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75", + "ansi-styles@^3.2.1": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d", + "ansi-styles@^4.0.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359", + "ansi-styles@^4.1.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359", + "anymatch@~3.1.1": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142", + "argparse@^1.0.7": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911", + "array-union@^2.1.0": "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d", + "at-least-node@^1.0.0": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2", + "autoprefixer@^9.7.4": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4", + "binary-extensions@^2.0.0": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c", + "braces@^3.0.1": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107", + "braces@~3.0.2": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107", + "browserslist@^4.11.1": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d", + "caller-callsite@^2.0.0": "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134", + "caller-path@^2.0.0": "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4", + "callsites@^2.0.0": "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50", + "camelcase@^5.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320", + "caniuse-lite@^1.0.30001039": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz#7b52c3537f7a8c0408aca867e83d2b04268b54cd", + "caniuse-lite@^1.0.30001043": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz#7b52c3537f7a8c0408aca867e83d2b04268b54cd", + "chalk@^2.0.1": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424", + "chalk@^2.4.1": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424", + "chalk@^2.4.2": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424", + "chalk@^4.0.0": "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72", + "chokidar@^3.3.0": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8", + "cliui@^6.0.0": "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1", + "color-convert@^1.9.0": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8", + "color-convert@^2.0.1": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3", + "color-name@1.1.3": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25", + "color-name@~1.1.4": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2", + "cosmiconfig@^5.0.0": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a", + "cross-env@^7.0.2": "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9", + "cross-spawn@^7.0.1": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14", + "decamelize@^1.2.0": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290", + "dependency-graph@^0.9.0": "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318", + "dir-glob@^3.0.1": "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f", + "electron-to-chromium@^1.3.413": "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.432.tgz#3bf7b191978ff2e8bc3caf811bb52b1e9f9eab25", + "emoji-regex@^8.0.0": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37", + "error-ex@^1.3.1": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf", + "escape-string-regexp@^1.0.5": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", + "esprima@^4.0.0": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71", + "fast-glob@^3.1.1": "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d", + "fastq@^1.6.0": "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801", + "fill-range@^7.0.1": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40", + "find-up@^2.1.0": "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7", + "find-up@^4.1.0": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19", + "fs-extra@^9.0.0": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3", + "fsevents@~2.1.2": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e", + "get-caller-file@^2.0.1": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e", + "get-stdin@^7.0.0": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6", + "glob-parent@^5.1.0": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229", + "glob-parent@~5.1.0": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229", + "globby@^11.0.0": "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154", + "graceful-fs@^4.1.6": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "graceful-fs@^4.2.0": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb", + "has-flag@^3.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd", + "has-flag@^4.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b", + "ignore@^5.1.4": "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf", + "import-cwd@^2.0.0": "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9", + "import-fresh@^2.0.0": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546", + "import-from@^2.1.0": "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1", + "is-arrayish@^0.2.1": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d", + "is-binary-path@~2.1.0": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09", + "is-directory@^0.3.1": "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1", + "is-extglob@^2.1.1": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2", + "is-fullwidth-code-point@^3.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d", + "is-glob@^4.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc", + "is-glob@~4.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc", + "is-number@^7.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b", + "isexe@^2.0.0": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10", + "js-yaml@^3.13.1": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847", + "json-parse-better-errors@^1.0.1": "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9", + "jsonfile@^6.0.1": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179", + "locate-path@^2.0.0": "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e", + "locate-path@^5.0.0": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0", + "lodash@^4.17.11": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548", + "log-symbols@^2.2.0": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a", + "merge2@^1.3.0": "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81", + "micromatch@^4.0.2": "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259", + "node-releases@^1.1.53": "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee", + "normalize-path@^3.0.0": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "normalize-path@~3.0.0": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65", + "normalize-range@^0.1.2": "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942", + "num2fraction@^1.2.2": "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede", + "p-limit@^1.1.0": "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8", + "p-limit@^2.2.0": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1", + "p-locate@^2.0.0": "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43", + "p-locate@^4.1.0": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07", + "p-try@^1.0.0": "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3", + "p-try@^2.0.0": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6", + "parse-json@^4.0.0": "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0", + "path-exists@^3.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515", + "path-exists@^4.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3", + "path-key@^3.1.0": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375", + "path-type@^4.0.0": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b", + "picomatch@^2.0.4": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad", + "picomatch@^2.0.5": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad", + "picomatch@^2.2.1": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad", + "pify@^2.3.0": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c", + "pkg-up@^2.0.0": "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f", + "postcss-cli@^7.1.0": "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-7.1.1.tgz#260f9546be260b2149bf32e28d785a0d79c9aab8", + "postcss-load-config@^2.0.0": "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003", + "postcss-reporter@^6.0.0": "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f", + "postcss-value-parser@^4.0.3": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb", + "postcss@^7.0.0": "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2", + "postcss@^7.0.27": "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2", + "postcss@^7.0.7": "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2", + "pretty-hrtime@^1.0.3": "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1", + "read-cache@^1.0.0": "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774", + "readdirp@~3.4.0": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada", + "require-directory@^2.1.1": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42", + "require-main-filename@^2.0.0": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b", + "resolve-from@^3.0.0": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748", + "reusify@^1.0.4": "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76", + "run-parallel@^1.1.9": "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679", + "set-blocking@^2.0.0": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7", + "shebang-command@^2.0.0": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea", + "shebang-regex@^3.0.0": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172", + "slash@^3.0.0": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634", + "source-map@^0.6.1": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263", + "sprintf-js@~1.0.2": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c", + "string-width@^4.1.0": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", + "string-width@^4.2.0": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5", + "strip-ansi@^6.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532", + "supports-color@^5.3.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f", + "supports-color@^6.1.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3", + "supports-color@^7.1.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1", + "to-regex-range@^5.0.1": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4", + "universalify@^1.0.0": "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d", + "which-module@^2.0.0": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a", + "which@^2.0.1": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1", + "wrap-ansi@^6.2.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53", + "y18n@^4.0.0": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b", + "yargs-parser@^18.1.1": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0", + "yargs@^15.0.2": "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + }, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/website/www/node_modules/@nodelib/fs.scandir/LICENSE b/website/www/node_modules/@nodelib/fs.scandir/LICENSE new file mode 100644 index 000000000000..65a999460170 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.scandir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Denis Malinochkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/www/node_modules/@nodelib/fs.scandir/README.md b/website/www/node_modules/@nodelib/fs.scandir/README.md new file mode 100644 index 000000000000..e0b218b9f090 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.scandir/README.md @@ -0,0 +1,171 @@ +# @nodelib/fs.scandir + +> List files and directories inside the specified directory. + +## :bulb: Highlights + +The package is aimed at obtaining information about entries in the directory. + +* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). +* :gear: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type. See [`old` and `modern` mode](#old-and-modern-mode). +* :link: Can safely work with broken symbolic links. + +## Install + +```console +npm install @nodelib/fs.scandir +``` + +## Usage + +```ts +import * as fsScandir from '@nodelib/fs.scandir'; + +fsScandir.scandir('path', (error, stats) => { /* … */ }); +``` + +## API + +### .scandir(path, [optionsOrSettings], callback) + +Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path with standard callback-style. + +```ts +fsScandir.scandir('path', (error, entries) => { /* … */ }); +fsScandir.scandir('path', {}, (error, entries) => { /* … */ }); +fsScandir.scandir('path', new fsScandir.Settings(), (error, entries) => { /* … */ }); +``` + +### .scandirSync(path, [optionsOrSettings]) + +Returns an array of plain objects ([`Entry`](#entry)) with information about entry for provided path. + +```ts +const entries = fsScandir.scandirSync('path'); +const entries = fsScandir.scandirSync('path', {}); +const entries = fsScandir.scandirSync(('path', new fsScandir.Settings()); +``` + +#### path + +* Required: `true` +* Type: `string | Buffer | URL` + +A path to a file. If a URL is provided, it must use the `file:` protocol. + +#### optionsOrSettings + +* Required: `false` +* Type: `Options | Settings` +* Default: An instance of `Settings` class + +An [`Options`](#options) object or an instance of [`Settings`](#settingsoptions) class. + +> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. + +### Settings([options]) + +A class of full settings of the package. + +```ts +const settings = new fsScandir.Settings({ followSymbolicLinks: false }); + +const entries = fsScandir.scandirSync('path', settings); +``` + +## Entry + +* `name` — The name of the entry (`unknown.txt`). +* `path` — The path of the entry relative to call directory (`root/unknown.txt`). +* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. On Node.js below 10.10 will be emulated by [`DirentFromStats`](./src/utils/fs.ts) class. +* `stats` (optional) — An instance of `fs.Stats` class. + +For example, the `scandir` call for `tools` directory with one directory inside: + +```ts +{ + dirent: Dirent { name: 'typedoc', /* … */ }, + name: 'typedoc', + path: 'tools/typedoc' +} +``` + +## Options + +### stats + +* Type: `boolean` +* Default: `false` + +Adds an instance of `fs.Stats` class to the [`Entry`](#entry). + +> :book: Always use `fs.readdir` without the `withFileTypes` option. ??TODO?? + +### followSymbolicLinks + +* Type: `boolean` +* Default: `false` + +Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. + +### `throwErrorOnBrokenSymbolicLink` + +* Type: `boolean` +* Default: `true` + +Throw an error when symbolic link is broken if `true` or safely use `lstat` call if `false`. + +### `pathSegmentSeparator` + +* Type: `string` +* Default: `path.sep` + +By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. + +### `fs` + +* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) +* Default: A default FS methods + +By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. + +```ts +interface FileSystemAdapter { + lstat?: typeof fs.lstat; + stat?: typeof fs.stat; + lstatSync?: typeof fs.lstatSync; + statSync?: typeof fs.statSync; + readdir?: typeof fs.readdir; + readdirSync?: typeof fs.readdirSync; +} + +const settings = new fsScandir.Settings({ + fs: { lstat: fakeLstat } +}); +``` + +## `old` and `modern` mode + +This package has two modes that are used depending on the environment and parameters of use. + +### old + +* Node.js below `10.10` or when the `stats` option is enabled + +When working in the old mode, the directory is read first (`fs.readdir`), then the type of entries is determined (`fs.lstat` and/or `fs.stat` for symbolic links). + +### modern + +* Node.js 10.10+ and the `stats` option is disabled + +In the modern mode, reading the directory (`fs.readdir` with the `withFileTypes` option) is combined with obtaining information about its entries. An additional call for symbolic links (`fs.stat`) is still present. + +This mode makes fewer calls to the file system. It's faster. + +## Changelog + +See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. + +## License + +This software is released under the terms of the MIT license. diff --git a/website/www/node_modules/@nodelib/fs.scandir/package.json b/website/www/node_modules/@nodelib/fs.scandir/package.json new file mode 100644 index 000000000000..95723d58fd1b --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.scandir/package.json @@ -0,0 +1,35 @@ +{ + "name": "@nodelib/fs.scandir", + "version": "2.1.3", + "description": "List files and directories inside the specified directory", + "license": "MIT", + "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir", + "keywords": [ + "NodeLib", + "fs", + "FileSystem", + "file system", + "scandir", + "readdir", + "dirent" + ], + "engines": { + "node": ">= 8" + }, + "main": "out/index.js", + "typings": "out/index.d.ts", + "scripts": { + "clean": "rimraf {tsconfig.tsbuildinfo,out}", + "lint": "eslint \"src/**/*.ts\" --cache", + "compile": "tsc -b .", + "compile:watch": "tsc -p . --watch --sourceMap", + "test": "mocha \"out/**/*.spec.js\" -s 0", + "build": "npm run clean && npm run compile && npm run lint && npm test", + "watch": "npm run clean && npm run compile:watch" + }, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "gitHead": "3b1ef7554ad7c061b3580858101d483fba847abf" +} diff --git a/website/www/node_modules/@nodelib/fs.stat/LICENSE b/website/www/node_modules/@nodelib/fs.stat/LICENSE new file mode 100644 index 000000000000..65a999460170 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.stat/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Denis Malinochkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/www/node_modules/@nodelib/fs.stat/README.md b/website/www/node_modules/@nodelib/fs.stat/README.md new file mode 100644 index 000000000000..686f0471d40f --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.stat/README.md @@ -0,0 +1,126 @@ +# @nodelib/fs.stat + +> Get the status of a file with some features. + +## :bulb: Highlights + +Wrapper around standard method `fs.lstat` and `fs.stat` with some features. + +* :beginner: Normally follows symbolic link. +* :gear: Can safely work with broken symbolic link. + +## Install + +```console +npm install @nodelib/fs.stat +``` + +## Usage + +```ts +import * as fsStat from '@nodelib/fs.stat'; + +fsStat.stat('path', (error, stats) => { /* … */ }); +``` + +## API + +### .stat(path, [optionsOrSettings], callback) + +Returns an instance of `fs.Stats` class for provided path with standard callback-style. + +```ts +fsStat.stat('path', (error, stats) => { /* … */ }); +fsStat.stat('path', {}, (error, stats) => { /* … */ }); +fsStat.stat('path', new fsStat.Settings(), (error, stats) => { /* … */ }); +``` + +### .statSync(path, [optionsOrSettings]) + +Returns an instance of `fs.Stats` class for provided path. + +```ts +const stats = fsStat.stat('path'); +const stats = fsStat.stat('path', {}); +const stats = fsStat.stat('path', new fsStat.Settings()); +``` + +#### path + +* Required: `true` +* Type: `string | Buffer | URL` + +A path to a file. If a URL is provided, it must use the `file:` protocol. + +#### optionsOrSettings + +* Required: `false` +* Type: `Options | Settings` +* Default: An instance of `Settings` class + +An [`Options`](#options) object or an instance of [`Settings`](#settings) class. + +> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. + +### Settings([options]) + +A class of full settings of the package. + +```ts +const settings = new fsStat.Settings({ followSymbolicLink: false }); + +const stats = fsStat.stat('path', settings); +``` + +## Options + +### `followSymbolicLink` + +* Type: `boolean` +* Default: `true` + +Follow symbolic link or not. Call `fs.stat` on symbolic link if `true`. + +### `markSymbolicLink` + +* Type: `boolean` +* Default: `false` + +Mark symbolic link by setting the return value of `isSymbolicLink` function to always `true` (even after `fs.stat`). + +> :book: Can be used if you want to know what is hidden behind a symbolic link, but still continue to know that it is a symbolic link. + +### `throwErrorOnBrokenSymbolicLink` + +* Type: `boolean` +* Default: `true` + +Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. + +### `fs` + +* Type: [`FileSystemAdapter`](./src/adapters/fs.ts) +* Default: A default FS methods + +By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. + +```ts +interface FileSystemAdapter { + lstat?: typeof fs.lstat; + stat?: typeof fs.stat; + lstatSync?: typeof fs.lstatSync; + statSync?: typeof fs.statSync; +} + +const settings = new fsStat.Settings({ + fs: { lstat: fakeLstat } +}); +``` + +## Changelog + +See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. + +## License + +This software is released under the terms of the MIT license. diff --git a/website/www/node_modules/@nodelib/fs.stat/package.json b/website/www/node_modules/@nodelib/fs.stat/package.json new file mode 100644 index 000000000000..8c79d19a0bd3 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.stat/package.json @@ -0,0 +1,29 @@ +{ + "name": "@nodelib/fs.stat", + "version": "2.0.3", + "description": "Get the status of a file with some features", + "license": "MIT", + "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat", + "keywords": [ + "NodeLib", + "fs", + "FileSystem", + "file system", + "stat" + ], + "engines": { + "node": ">= 8" + }, + "main": "out/index.js", + "typings": "out/index.d.ts", + "scripts": { + "clean": "rimraf {tsconfig.tsbuildinfo,out}", + "lint": "eslint \"src/**/*.ts\" --cache", + "compile": "tsc -b .", + "compile:watch": "tsc -p . --watch --sourceMap", + "test": "mocha \"out/**/*.spec.js\" -s 0", + "build": "npm run clean && npm run compile && npm run lint && npm test", + "watch": "npm run clean && npm run compile:watch" + }, + "gitHead": "3b1ef7554ad7c061b3580858101d483fba847abf" +} diff --git a/website/www/node_modules/@nodelib/fs.walk/LICENSE b/website/www/node_modules/@nodelib/fs.walk/LICENSE new file mode 100644 index 000000000000..65a999460170 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.walk/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Denis Malinochkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/www/node_modules/@nodelib/fs.walk/README.md b/website/www/node_modules/@nodelib/fs.walk/README.md new file mode 100644 index 000000000000..6ccc08db4a10 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.walk/README.md @@ -0,0 +1,215 @@ +# @nodelib/fs.walk + +> A library for efficiently walking a directory recursively. + +## :bulb: Highlights + +* :moneybag: Returns useful information: `name`, `path`, `dirent` and `stats` (optional). +* :rocket: On Node.js 10.10+ uses the mechanism without additional calls to determine the entry type for performance reasons. See [`old` and `modern` mode](https://github.com/nodelib/nodelib/blob/master/packages/fs/fs.scandir/README.md#old-and-modern-mode). +* :gear: Built-in directories/files and error filtering system. +* :link: Can safely work with broken symbolic links. + +## Install + +```console +npm install @nodelib/fs.walk +``` + +## Usage + +```ts +import * as fsWalk from '@nodelib/fs.walk'; + +fsWalk.walk('path', (error, entries) => { /* … */ }); +``` + +## API + +### .walk(path, [optionsOrSettings], callback) + +Reads the directory recursively and asynchronously. Requires a callback function. + +> :book: If you want to use the Promise API, use `util.promisify`. + +```ts +fsWalk.walk('path', (error, entries) => { /* … */ }); +fsWalk.walk('path', {}, (error, entries) => { /* … */ }); +fsWalk.walk('path', new fsWalk.Settings(), (error, entries) => { /* … */ }); +``` + +### .walkStream(path, [optionsOrSettings]) + +Reads the directory recursively and asynchronously. [Readable Stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_readable_streams) is used as a provider. + +```ts +const stream = fsWalk.walkStream('path'); +const stream = fsWalk.walkStream('path', {}); +const stream = fsWalk.walkStream('path', new fsWalk.Settings()); +``` + +### .walkSync(path, [optionsOrSettings]) + +Reads the directory recursively and synchronously. Returns an array of entries. + +```ts +const entries = fsWalk.walkSync('path'); +const entries = fsWalk.walkSync('path', {}); +const entries = fsWalk.walkSync('path', new fsWalk.Settings()); +``` + +#### path + +* Required: `true` +* Type: `string | Buffer | URL` + +A path to a file. If a URL is provided, it must use the `file:` protocol. + +#### optionsOrSettings + +* Required: `false` +* Type: `Options | Settings` +* Default: An instance of `Settings` class + +An [`Options`](#options) object or an instance of [`Settings`](#settings) class. + +> :book: When you pass a plain object, an instance of the `Settings` class will be created automatically. If you plan to call the method frequently, use a pre-created instance of the `Settings` class. + +### Settings([options]) + +A class of full settings of the package. + +```ts +const settings = new fsWalk.Settings({ followSymbolicLinks: true }); + +const entries = fsWalk.walkSync('path', settings); +``` + +## Entry + +* `name` — The name of the entry (`unknown.txt`). +* `path` — The path of the entry relative to call directory (`root/unknown.txt`). +* `dirent` — An instance of [`fs.Dirent`](./src/types/index.ts) class. +* [`stats`] — An instance of `fs.Stats` class. + +## Options + +### basePath + +* Type: `string` +* Default: `undefined` + +By default, all paths are built relative to the root path. You can use this option to set custom root path. + +In the example below we read the files from the `root` directory, but in the results the root path will be `custom`. + +```ts +fsWalk.walkSync('root'); // → ['root/file.txt'] +fsWalk.walkSync('root', { basePath: 'custom' }); // → ['custom/file.txt'] +``` + +### concurrency + +* Type: `number` +* Default: `Infinity` + +The maximum number of concurrent calls to `fs.readdir`. + +> :book: The higher the number, the higher performance and the load on the File System. If you want to read in quiet mode, set the value to `4 * os.cpus().length` (4 is default size of [thread pool work scheduling](http://docs.libuv.org/en/v1.x/threadpool.html#thread-pool-work-scheduling)). + +### deepFilter + +* Type: [`DeepFilterFunction`](./src/settings.ts) +* Default: `undefined` + +A function that indicates whether the directory will be read deep or not. + +```ts +// Skip all directories that starts with `node_modules` +const filter: DeepFilterFunction = (entry) => !entry.path.startsWith('node_modules'); +``` + +### entryFilter + +* Type: [`EntryFilterFunction`](./src/settings.ts) +* Default: `undefined` + +A function that indicates whether the entry will be included to results or not. + +```ts +// Exclude all `.js` files from results +const filter: EntryFilterFunction = (entry) => !entry.name.endsWith('.js'); +``` + +### errorFilter + +* Type: [`ErrorFilterFunction`](./src/settings.ts) +* Default: `undefined` + +A function that allows you to skip errors that occur when reading directories. + +For example, you can skip `ENOENT` errors if required: + +```ts +// Skip all ENOENT errors +const filter: ErrorFilterFunction = (error) => error.code == 'ENOENT'; +``` + +### stats + +* Type: `boolean` +* Default: `false` + +Adds an instance of `fs.Stats` class to the [`Entry`](#entry). + +> :book: Always use `fs.readdir` with additional `fs.lstat/fs.stat` calls to determine the entry type. + +### followSymbolicLinks + +* Type: `boolean` +* Default: `false` + +Follow symbolic links or not. Call `fs.stat` on symbolic link if `true`. + +### `throwErrorOnBrokenSymbolicLink` + +* Type: `boolean` +* Default: `true` + +Throw an error when symbolic link is broken if `true` or safely return `lstat` call if `false`. + +### `pathSegmentSeparator` + +* Type: `string` +* Default: `path.sep` + +By default, this package uses the correct path separator for your OS (`\` on Windows, `/` on Unix-like systems). But you can set this option to any separator character(s) that you want to use instead. + +### `fs` + +* Type: `FileSystemAdapter` +* Default: A default FS methods + +By default, the built-in Node.js module (`fs`) is used to work with the file system. You can replace any method with your own. + +```ts +interface FileSystemAdapter { + lstat: typeof fs.lstat; + stat: typeof fs.stat; + lstatSync: typeof fs.lstatSync; + statSync: typeof fs.statSync; + readdir: typeof fs.readdir; + readdirSync: typeof fs.readdirSync; +} + +const settings = new fsWalk.Settings({ + fs: { lstat: fakeLstat } +}); +``` + +## Changelog + +See the [Releases section of our GitHub project](https://github.com/nodelib/nodelib/releases) for changelog for each release version. + +## License + +This software is released under the terms of the MIT license. diff --git a/website/www/node_modules/@nodelib/fs.walk/package.json b/website/www/node_modules/@nodelib/fs.walk/package.json new file mode 100644 index 000000000000..82fa491ef231 --- /dev/null +++ b/website/www/node_modules/@nodelib/fs.walk/package.json @@ -0,0 +1,35 @@ +{ + "name": "@nodelib/fs.walk", + "version": "1.2.4", + "description": "A library for efficiently walking a directory recursively", + "license": "MIT", + "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk", + "keywords": [ + "NodeLib", + "fs", + "FileSystem", + "file system", + "walk", + "scanner", + "crawler" + ], + "engines": { + "node": ">= 8" + }, + "main": "out/index.js", + "typings": "out/index.d.ts", + "scripts": { + "clean": "rimraf {tsconfig.tsbuildinfo,out}", + "lint": "eslint \"src/**/*.ts\" --cache", + "compile": "tsc -b .", + "compile:watch": "tsc -p . --watch --sourceMap", + "test": "mocha \"out/**/*.spec.js\" -s 0", + "build": "npm run clean && npm run compile && npm run lint && npm test", + "watch": "npm run clean && npm run compile:watch" + }, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "gitHead": "3b1ef7554ad7c061b3580858101d483fba847abf" +} diff --git a/website/www/node_modules/@types/color-name/LICENSE b/website/www/node_modules/@types/color-name/LICENSE new file mode 100644 index 000000000000..21071075c245 --- /dev/null +++ b/website/www/node_modules/@types/color-name/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/website/www/node_modules/@types/color-name/README.md b/website/www/node_modules/@types/color-name/README.md new file mode 100644 index 000000000000..d08d108b2b5b --- /dev/null +++ b/website/www/node_modules/@types/color-name/README.md @@ -0,0 +1,16 @@ +# Installation +> `npm install --save @types/color-name` + +# Summary +This package contains type definitions for color-name ( https://github.com/colorjs/color-name ). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/color-name + +Additional Details + * Last updated: Wed, 13 Feb 2019 16:16:48 GMT + * Dependencies: none + * Global values: none + +# Credits +These definitions were written by Junyoung Clare Jang . diff --git a/website/www/node_modules/@types/color-name/index.d.ts b/website/www/node_modules/@types/color-name/index.d.ts new file mode 100644 index 000000000000..b5bff4717a3b --- /dev/null +++ b/website/www/node_modules/@types/color-name/index.d.ts @@ -0,0 +1,161 @@ +// Type definitions for color-name 1.1 +// Project: https://github.com/colorjs/color-name +// Definitions by: Junyoung Clare Jang +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/** + * Tuple of Red, Green, and Blue + * @example + * // Red = 55, Green = 70, Blue = 0 + * const rgb: RGB = [55, 70, 0]; + */ +export type RGB = [number, number, number]; + +export const aliceblue: RGB; +export const antiquewhite: RGB; +export const aqua: RGB; +export const aquamarine: RGB; +export const azure: RGB; +export const beige: RGB; +export const bisque: RGB; +export const black: RGB; +export const blanchedalmond: RGB; +export const blue: RGB; +export const blueviolet: RGB; +export const brown: RGB; +export const burlywood: RGB; +export const cadetblue: RGB; +export const chartreuse: RGB; +export const chocolate: RGB; +export const coral: RGB; +export const cornflowerblue: RGB; +export const cornsilk: RGB; +export const crimson: RGB; +export const cyan: RGB; +export const darkblue: RGB; +export const darkcyan: RGB; +export const darkgoldenrod: RGB; +export const darkgray: RGB; +export const darkgreen: RGB; +export const darkgrey: RGB; +export const darkkhaki: RGB; +export const darkmagenta: RGB; +export const darkolivegreen: RGB; +export const darkorange: RGB; +export const darkorchid: RGB; +export const darkred: RGB; +export const darksalmon: RGB; +export const darkseagreen: RGB; +export const darkslateblue: RGB; +export const darkslategray: RGB; +export const darkslategrey: RGB; +export const darkturquoise: RGB; +export const darkviolet: RGB; +export const deeppink: RGB; +export const deepskyblue: RGB; +export const dimgray: RGB; +export const dimgrey: RGB; +export const dodgerblue: RGB; +export const firebrick: RGB; +export const floralwhite: RGB; +export const forestgreen: RGB; +export const fuchsia: RGB; +export const gainsboro: RGB; +export const ghostwhite: RGB; +export const gold: RGB; +export const goldenrod: RGB; +export const gray: RGB; +export const green: RGB; +export const greenyellow: RGB; +export const grey: RGB; +export const honeydew: RGB; +export const hotpink: RGB; +export const indianred: RGB; +export const indigo: RGB; +export const ivory: RGB; +export const khaki: RGB; +export const lavender: RGB; +export const lavenderblush: RGB; +export const lawngreen: RGB; +export const lemonchiffon: RGB; +export const lightblue: RGB; +export const lightcoral: RGB; +export const lightcyan: RGB; +export const lightgoldenrodyellow: RGB; +export const lightgray: RGB; +export const lightgreen: RGB; +export const lightgrey: RGB; +export const lightpink: RGB; +export const lightsalmon: RGB; +export const lightseagreen: RGB; +export const lightskyblue: RGB; +export const lightslategray: RGB; +export const lightslategrey: RGB; +export const lightsteelblue: RGB; +export const lightyellow: RGB; +export const lime: RGB; +export const limegreen: RGB; +export const linen: RGB; +export const magenta: RGB; +export const maroon: RGB; +export const mediumaquamarine: RGB; +export const mediumblue: RGB; +export const mediumorchid: RGB; +export const mediumpurple: RGB; +export const mediumseagreen: RGB; +export const mediumslateblue: RGB; +export const mediumspringgreen: RGB; +export const mediumturquoise: RGB; +export const mediumvioletred: RGB; +export const midnightblue: RGB; +export const mintcream: RGB; +export const mistyrose: RGB; +export const moccasin: RGB; +export const navajowhite: RGB; +export const navy: RGB; +export const oldlace: RGB; +export const olive: RGB; +export const olivedrab: RGB; +export const orange: RGB; +export const orangered: RGB; +export const orchid: RGB; +export const palegoldenrod: RGB; +export const palegreen: RGB; +export const paleturquoise: RGB; +export const palevioletred: RGB; +export const papayawhip: RGB; +export const peachpuff: RGB; +export const peru: RGB; +export const pink: RGB; +export const plum: RGB; +export const powderblue: RGB; +export const purple: RGB; +export const rebeccapurple: RGB; +export const red: RGB; +export const rosybrown: RGB; +export const royalblue: RGB; +export const saddlebrown: RGB; +export const salmon: RGB; +export const sandybrown: RGB; +export const seagreen: RGB; +export const seashell: RGB; +export const sienna: RGB; +export const silver: RGB; +export const skyblue: RGB; +export const slateblue: RGB; +export const slategray: RGB; +export const slategrey: RGB; +export const snow: RGB; +export const springgreen: RGB; +export const steelblue: RGB; +export const tan: RGB; +export const teal: RGB; +export const thistle: RGB; +export const tomato: RGB; +export const turquoise: RGB; +export const violet: RGB; +export const wheat: RGB; +export const white: RGB; +export const whitesmoke: RGB; +export const yellow: RGB; +export const yellowgreen: RGB; diff --git a/website/www/node_modules/@types/color-name/package.json b/website/www/node_modules/@types/color-name/package.json new file mode 100644 index 000000000000..d5e367e14037 --- /dev/null +++ b/website/www/node_modules/@types/color-name/package.json @@ -0,0 +1,23 @@ +{ + "name": "@types/color-name", + "version": "1.1.1", + "description": "TypeScript definitions for color-name", + "license": "MIT", + "contributors": [ + { + "name": "Junyoung Clare Jang", + "url": "https://github.com/Ailrun", + "githubUsername": "Ailrun" + } + ], + "main": "", + "types": "index", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git" + }, + "scripts": {}, + "dependencies": {}, + "typesPublisherContentHash": "e22c6881e2dcf766e32142cbb82d9acf9c08258bdf0da8e76c8a448d1be44ac7", + "typeScriptVersion": "2.0" +} \ No newline at end of file diff --git a/website/www/node_modules/ansi-regex/index.d.ts b/website/www/node_modules/ansi-regex/index.d.ts new file mode 100644 index 000000000000..2dbf6af2b6f3 --- /dev/null +++ b/website/www/node_modules/ansi-regex/index.d.ts @@ -0,0 +1,37 @@ +declare namespace ansiRegex { + interface Options { + /** + Match only the first ANSI escape. + + @default false + */ + onlyFirst: boolean; + } +} + +/** +Regular expression for matching ANSI escape codes. + +@example +``` +import ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` +*/ +declare function ansiRegex(options?: ansiRegex.Options): RegExp; + +export = ansiRegex; diff --git a/website/www/node_modules/ansi-regex/index.js b/website/www/node_modules/ansi-regex/index.js new file mode 100644 index 000000000000..35054aa6774a --- /dev/null +++ b/website/www/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = ({onlyFirst = false} = {}) => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, onlyFirst ? undefined : 'g'); +}; diff --git a/website/www/node_modules/ansi-regex/license b/website/www/node_modules/ansi-regex/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/ansi-regex/package.json b/website/www/node_modules/ansi-regex/package.json new file mode 100644 index 000000000000..7af801f35222 --- /dev/null +++ b/website/www/node_modules/ansi-regex/package.json @@ -0,0 +1,55 @@ +{ + "name": "ansi-regex", + "version": "5.0.0", + "description": "Regular expression for matching ANSI escape codes", + "license": "MIT", + "repository": "chalk/ansi-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd", + "view-supported": "node fixtures/view-codes.js" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "devDependencies": { + "ava": "^2.4.0", + "tsd": "^0.9.0", + "xo": "^0.25.3" + } +} diff --git a/website/www/node_modules/ansi-regex/readme.md b/website/www/node_modules/ansi-regex/readme.md new file mode 100644 index 000000000000..3c2b77c4354b --- /dev/null +++ b/website/www/node_modules/ansi-regex/readme.md @@ -0,0 +1,78 @@ +# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex) + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` + + +## API + +### ansiRegex(options?) + +Returns a regex for matching ANSI escape codes. + +#### options + +Type: `object` + +##### onlyFirst + +Type: `boolean`
    +Default: `false` *(Matches any ANSI escape codes in a string)* + +Match only the first ANSI escape. + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +--- + +

    + + Get professional support for this package with a Tidelift subscription + +
    + + Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. +
    +
    diff --git a/website/www/node_modules/ansi-styles/index.d.ts b/website/www/node_modules/ansi-styles/index.d.ts new file mode 100644 index 000000000000..7e9b2b71b9cd --- /dev/null +++ b/website/www/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,197 @@ +import * as cssColors from 'color-name'; + +declare namespace ansiStyles { + interface ColorConvert { + /** + The RGB color space. + + @param red - (`0`-`255`) + @param green - (`0`-`255`) + @param blue - (`0`-`255`) + */ + rgb(red: number, green: number, blue: number): string; + + /** + The RGB HEX color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hex(hex: string): string; + + /** + @param keyword - A CSS color name. + */ + keyword(keyword: keyof typeof cssColors): string; + + /** + The HSL color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param lightness - (`0`-`100`) + */ + hsl(hue: number, saturation: number, lightness: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param value - (`0`-`100`) + */ + hsv(hue: number, saturation: number, value: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param whiteness - (`0`-`100`) + @param blackness - (`0`-`100`) + */ + hwb(hue: number, whiteness: number, blackness: number): string; + + /** + Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color. + */ + ansi(ansi: number): string; + + /** + Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256(ansi: number): string; + } + + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + readonly ansi: ColorConvert; + readonly ansi256: ColorConvert; + readonly ansi16m: ColorConvert; + + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; + +export = ansiStyles; diff --git a/website/www/node_modules/ansi-styles/index.js b/website/www/node_modules/ansi-styles/index.js new file mode 100644 index 000000000000..5d82581a13f9 --- /dev/null +++ b/website/www/node_modules/ansi-styles/index.js @@ -0,0 +1,163 @@ +'use strict'; + +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; + +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; + +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; + +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); + + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); + + return value; + }, + enumerable: true, + configurable: true + }); +}; + +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = require('color-convert'); + } + + const offset = isBackground ? 10 : 0; + const styles = {}; + + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } + + return styles; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/website/www/node_modules/ansi-styles/license b/website/www/node_modules/ansi-styles/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/ansi-styles/package.json b/website/www/node_modules/ansi-styles/package.json new file mode 100644 index 000000000000..347b035e1da7 --- /dev/null +++ b/website/www/node_modules/ansi-styles/package.json @@ -0,0 +1,57 @@ +{ + "name": "ansi-styles", + "version": "4.2.1", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "devDependencies": { + "@types/color-convert": "^1.9.0", + "ava": "^2.3.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.11.0", + "xo": "^0.25.3" + } +} diff --git a/website/www/node_modules/ansi-styles/readme.md b/website/www/node_modules/ansi-styles/readme.md new file mode 100644 index 000000000000..2a1ef654667d --- /dev/null +++ b/website/www/node_modules/ansi-styles/readme.md @@ -0,0 +1,158 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 16/256/truecolor +// NOTE: If conversion goes to 16 colors or 256 colors, the original color +// may be degraded to fit that color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); +console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); +console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close); +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `keyword` +- `hsl` +- `hsv` +- `hwb` +- `ansi` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code +style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code + +style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code +style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code + +style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code +style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +--- + +
    + + Get professional support for this package with a Tidelift subscription + +
    + + Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. +
    +
    diff --git a/website/www/node_modules/anymatch/LICENSE b/website/www/node_modules/anymatch/LICENSE new file mode 100644 index 000000000000..491766ca79a0 --- /dev/null +++ b/website/www/node_modules/anymatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/website/www/node_modules/anymatch/README.md b/website/www/node_modules/anymatch/README.md new file mode 100644 index 000000000000..1dd67f53446c --- /dev/null +++ b/website/www/node_modules/anymatch/README.md @@ -0,0 +1,87 @@ +anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) +====== +Javascript module to match a string against a regular expression, glob, string, +or function that takes the string as an argument and returns a truthy or falsy +value. The matcher can also be an array of any or all of these. Useful for +allowing a very flexible user-defined config to define things like file paths. + +__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ + + +Usage +----- +```sh +npm install anymatch +``` + +#### anymatch(matchers, testString, [returnIndex], [options]) +* __matchers__: (_Array|String|RegExp|Function_) +String to be directly matched, string with glob patterns, regular expression +test, function that takes the testString as an argument and returns a truthy +value if it should be matched, or an array of any number and mix of these types. +* __testString__: (_String|Array_) The string to test against the matchers. If +passed as an array, the first element of the array will be used as the +`testString` for non-function matchers, while the entire array will be applied +as the arguments for function matchers. +* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. + * __returnIndex__: (_Boolean [optional]_) If true, return the array index of +the first matcher that that testString matched, or -1 if no match, instead of a +boolean result. + +```js +const anymatch = require('anymatch'); + +const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; + +anymatch(matchers, 'path/to/file.js'); // true +anymatch(matchers, 'path/anyjs/baz.js'); // true +anymatch(matchers, 'path/to/foo.js'); // true +anymatch(matchers, 'path/to/bar.js'); // true +anymatch(matchers, 'bar.js'); // false + +// returnIndex = true +anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 +anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 + +// any picomatc + +// using globs to match directories and their children +anymatch('node_modules', 'node_modules'); // true +anymatch('node_modules', 'node_modules/somelib/index.js'); // false +anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true +anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false +anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true + +const matcher = anymatch(matchers); +['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] +anymatch master* ❯ + +``` + +#### anymatch(matchers) +You can also pass in only your matcher(s) to get a curried function that has +already been bound to the provided matching criteria. This can be used as an +`Array#filter` callback. + +```js +var matcher = anymatch(matchers); + +matcher('path/to/file.js'); // true +matcher('path/anyjs/baz.js', true); // 1 + +['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] +``` + +Changelog +---------- +[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) + +- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. +- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). +- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) +for glob pattern matching. Issues with glob pattern matching should be +reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). + +License +------- +[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/website/www/node_modules/anymatch/index.d.ts b/website/www/node_modules/anymatch/index.d.ts new file mode 100644 index 000000000000..196d061784e9 --- /dev/null +++ b/website/www/node_modules/anymatch/index.d.ts @@ -0,0 +1,19 @@ +type AnymatchFn = (testString: string) => boolean; +type AnymatchPattern = string|RegExp|AnymatchFn; +type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] +type AnymatchTester = { + (testString: string|any[], returnIndex: true): number; + (testString: string|any[]): boolean; +} + +type PicomatchOptions = {dot: boolean}; + +declare const anymatch: { + (matchers: AnymatchMatcher): AnymatchTester; + (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; + (matchers: AnymatchMatcher, testString: string|any[]): boolean; +} + +export {AnymatchMatcher as Matcher} +export {AnymatchTester as Tester} +export default anymatch diff --git a/website/www/node_modules/anymatch/index.js b/website/www/node_modules/anymatch/index.js new file mode 100644 index 000000000000..24529c8a423c --- /dev/null +++ b/website/www/node_modules/anymatch/index.js @@ -0,0 +1,102 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { value: true }); + +const picomatch = require('picomatch'); +const normalizePath = require('normalize-path'); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const DEFAULT_OPTIONS = {returnIndex: false}; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @param {object} options + * @returns {AnymatchFn} + */ +const createPattern = (matcher, options) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negPatterns + * @param {String|Array} args + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(_path)) + } + const path = normalizePath(_path); + + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {object} options + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + const opts = typeof options === 'boolean' ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, opts)); + const patterns = mtchers.map(matcher => createPattern(matcher, opts)); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +anymatch.default = anymatch; +module.exports = anymatch; diff --git a/website/www/node_modules/anymatch/package.json b/website/www/node_modules/anymatch/package.json new file mode 100644 index 000000000000..479ecc23857f --- /dev/null +++ b/website/www/node_modules/anymatch/package.json @@ -0,0 +1,48 @@ +{ + "name": "anymatch", + "version": "3.1.1", + "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", + "files": [ + "index.js", + "index.d.ts" + ], + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "author": { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + "license": "ISC", + "homepage": "https://github.com/micromatch/anymatch", + "repository": { + "type": "git", + "url": "https://github.com/micromatch/anymatch" + }, + "keywords": [ + "match", + "any", + "string", + "file", + "fs", + "list", + "glob", + "regex", + "regexp", + "regular", + "expression", + "function" + ], + "scripts": { + "test": "nyc mocha", + "mocha": "mocha" + }, + "devDependencies": { + "mocha": "^6.1.3", + "nyc": "^14.0.0" + }, + "engines": { + "node": ">= 8" + } +} diff --git a/website/www/node_modules/argparse/CHANGELOG.md b/website/www/node_modules/argparse/CHANGELOG.md new file mode 100644 index 000000000000..a43c628ccc2e --- /dev/null +++ b/website/www/node_modules/argparse/CHANGELOG.md @@ -0,0 +1,185 @@ +1.0.10 / 2018-02-15 +------------------ + +- Use .concat instead of + for arrays, #122. + + +1.0.9 / 2016-09-29 +------------------ + +- Rerelease after 1.0.8 - deps cleanup. + + +1.0.8 / 2016-09-29 +------------------ + +- Maintenance (deps bump, fix node 6.5+ tests, coverage report). + + +1.0.7 / 2016-03-17 +------------------ + +- Teach `addArgument` to accept string arg names. #97, @tomxtobin. + + +1.0.6 / 2016-02-06 +------------------ + +- Maintenance: moved to eslint & updated CS. + + +1.0.5 / 2016-02-05 +------------------ + +- Removed lodash dependency to significantly reduce install size. + Thanks to @mourner. + + +1.0.4 / 2016-01-17 +------------------ + +- Maintenance: lodash update to 4.0.0. + + +1.0.3 / 2015-10-27 +------------------ + +- Fix parse `=` in args: `--examplepath="C:\myfolder\env=x64"`. #84, @CatWithApple. + + +1.0.2 / 2015-03-22 +------------------ + +- Relaxed lodash version dependency. + + +1.0.1 / 2015-02-20 +------------------ + +- Changed dependencies to be compatible with ancient nodejs. + + +1.0.0 / 2015-02-19 +------------------ + +- Maintenance release. +- Replaced `underscore` with `lodash`. +- Bumped version to 1.0.0 to better reflect semver meaning. +- HISTORY.md -> CHANGELOG.md + + +0.1.16 / 2013-12-01 +------------------- + +- Maintenance release. Updated dependencies and docs. + + +0.1.15 / 2013-05-13 +------------------- + +- Fixed #55, @trebor89 + + +0.1.14 / 2013-05-12 +------------------- + +- Fixed #62, @maxtaco + + +0.1.13 / 2013-04-08 +------------------- + +- Added `.npmignore` to reduce package size + + +0.1.12 / 2013-02-10 +------------------- + +- Fixed conflictHandler (#46), @hpaulj + + +0.1.11 / 2013-02-07 +------------------- + +- Multiple bugfixes, @hpaulj +- Added 70+ tests (ported from python), @hpaulj +- Added conflictHandler, @applepicke +- Added fromfilePrefixChar, @hpaulj + + +0.1.10 / 2012-12-30 +------------------- + +- Added [mutual exclusion](http://docs.python.org/dev/library/argparse.html#mutual-exclusion) + support, thanks to @hpaulj +- Fixed options check for `storeConst` & `appendConst` actions, thanks to @hpaulj + + +0.1.9 / 2012-12-27 +------------------ + +- Fixed option dest interferens with other options (issue #23), thanks to @hpaulj +- Fixed default value behavior with `*` positionals, thanks to @hpaulj +- Improve `getDefault()` behavior, thanks to @hpaulj +- Imrove negative argument parsing, thanks to @hpaulj + + +0.1.8 / 2012-12-01 +------------------ + +- Fixed parser parents (issue #19), thanks to @hpaulj +- Fixed negative argument parse (issue #20), thanks to @hpaulj + + +0.1.7 / 2012-10-14 +------------------ + +- Fixed 'choices' argument parse (issue #16) +- Fixed stderr output (issue #15) + + +0.1.6 / 2012-09-09 +------------------ + +- Fixed check for conflict of options (thanks to @tomxtobin) + + +0.1.5 / 2012-09-03 +------------------ + +- Fix parser #setDefaults method (thanks to @tomxtobin) + + +0.1.4 / 2012-07-30 +------------------ + +- Fixed pseudo-argument support (thanks to @CGamesPlay) +- Fixed addHelp default (should be true), if not set (thanks to @benblank) + + +0.1.3 / 2012-06-27 +------------------ + +- Fixed formatter api name: Formatter -> HelpFormatter + + +0.1.2 / 2012-05-29 +------------------ + +- Added basic tests +- Removed excess whitespace in help +- Fixed error reporting, when parcer with subcommands + called with empty arguments + + +0.1.1 / 2012-05-23 +------------------ + +- Fixed line wrapping in help formatter +- Added better error reporting on invalid arguments + + +0.1.0 / 2012-05-16 +------------------ + +- First release. diff --git a/website/www/node_modules/argparse/LICENSE b/website/www/node_modules/argparse/LICENSE new file mode 100644 index 000000000000..1afdae558405 --- /dev/null +++ b/website/www/node_modules/argparse/LICENSE @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (C) 2012 by Vitaly Puzrin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/website/www/node_modules/argparse/README.md b/website/www/node_modules/argparse/README.md new file mode 100644 index 000000000000..7fa6c40503e5 --- /dev/null +++ b/website/www/node_modules/argparse/README.md @@ -0,0 +1,257 @@ +argparse +======== + +[![Build Status](https://secure.travis-ci.org/nodeca/argparse.svg?branch=master)](http://travis-ci.org/nodeca/argparse) +[![NPM version](https://img.shields.io/npm/v/argparse.svg)](https://www.npmjs.org/package/argparse) + +CLI arguments parser for node.js. Javascript port of python's +[argparse](http://docs.python.org/dev/library/argparse.html) module +(original version 3.2). That's a full port, except some very rare options, +recorded in issue tracker. + +**NB. Difference with original.** + +- Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/). +- Use `defaultValue` instead of `default`. +- Use `argparse.Const.REMAINDER` instead of `argparse.REMAINDER`, and + similarly for constant values `OPTIONAL`, `ZERO_OR_MORE`, and `ONE_OR_MORE` + (aliases for `nargs` values `'?'`, `'*'`, `'+'`, respectively), and + `SUPPRESS`. + + +Example +======= + +test.js file: + +```javascript +#!/usr/bin/env node +'use strict'; + +var ArgumentParser = require('../lib/argparse').ArgumentParser; +var parser = new ArgumentParser({ + version: '0.0.1', + addHelp:true, + description: 'Argparse example' +}); +parser.addArgument( + [ '-f', '--foo' ], + { + help: 'foo bar' + } +); +parser.addArgument( + [ '-b', '--bar' ], + { + help: 'bar foo' + } +); +parser.addArgument( + '--baz', + { + help: 'baz bar' + } +); +var args = parser.parseArgs(); +console.dir(args); +``` + +Display help: + +``` +$ ./test.js -h +usage: example.js [-h] [-v] [-f FOO] [-b BAR] [--baz BAZ] + +Argparse example + +Optional arguments: + -h, --help Show this help message and exit. + -v, --version Show program's version number and exit. + -f FOO, --foo FOO foo bar + -b BAR, --bar BAR bar foo + --baz BAZ baz bar +``` + +Parse arguments: + +``` +$ ./test.js -f=3 --bar=4 --baz 5 +{ foo: '3', bar: '4', baz: '5' } +``` + +More [examples](https://github.com/nodeca/argparse/tree/master/examples). + + +ArgumentParser objects +====================== + +``` +new ArgumentParser({parameters hash}); +``` + +Creates a new ArgumentParser object. + +**Supported params:** + +- ```description``` - Text to display before the argument help. +- ```epilog``` - Text to display after the argument help. +- ```addHelp``` - Add a -h/–help option to the parser. (default: true) +- ```argumentDefault``` - Set the global default value for arguments. (default: null) +- ```parents``` - A list of ArgumentParser objects whose arguments should also be included. +- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘) +- ```formatterClass``` - A class for customizing the help output. +- ```prog``` - The name of the program (default: `path.basename(process.argv[1])`) +- ```usage``` - The string describing the program usage (default: generated) +- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals. + +**Not supported yet** + +- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read. + + +Details in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects) + + +addArgument() method +==================== + +``` +ArgumentParser.addArgument(name or flag or [name] or [flags...], {options}) +``` + +Defines how a single command-line argument should be parsed. + +- ```name or flag or [name] or [flags...]``` - Either a positional name + (e.g., `'foo'`), a single option (e.g., `'-f'` or `'--foo'`), an array + of a single positional name (e.g., `['foo']`), or an array of options + (e.g., `['-f', '--foo']`). + +Options: + +- ```action``` - The basic type of action to be taken when this argument is encountered at the command line. +- ```nargs```- The number of command-line arguments that should be consumed. +- ```constant``` - A constant value required by some action and nargs selections. +- ```defaultValue``` - The value produced if the argument is absent from the command line. +- ```type``` - The type to which the command-line argument should be converted. +- ```choices``` - A container of the allowable values for the argument. +- ```required``` - Whether or not the command-line option may be omitted (optionals only). +- ```help``` - A brief description of what the argument does. +- ```metavar``` - A name for the argument in usage messages. +- ```dest``` - The name of the attribute to be added to the object returned by parseArgs(). + +Details in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method) + + +Action (some details) +================ + +ArgumentParser objects associate command-line arguments with actions. +These actions can do just about anything with the command-line arguments associated +with them, though most actions simply add an attribute to the object returned by +parseArgs(). The action keyword argument specifies how the command-line arguments +should be handled. The supported actions are: + +- ```store``` - Just stores the argument’s value. This is the default action. +- ```storeConst``` - Stores value, specified by the const keyword argument. + (Note that the const keyword argument defaults to the rather unhelpful None.) + The 'storeConst' action is most commonly used with optional arguments, that + specify some sort of flag. +- ```storeTrue``` and ```storeFalse``` - Stores values True and False + respectively. These are special cases of 'storeConst'. +- ```append``` - Stores a list, and appends each argument value to the list. + This is useful to allow an option to be specified multiple times. +- ```appendConst``` - Stores a list, and appends value, specified by the + const keyword argument to the list. (Note, that the const keyword argument defaults + is None.) The 'appendConst' action is typically used when multiple arguments need + to store constants to the same list. +- ```count``` - Counts the number of times a keyword argument occurs. For example, + used for increasing verbosity levels. +- ```help``` - Prints a complete help message for all the options in the current + parser and then exits. By default a help action is automatically added to the parser. + See ArgumentParser for details of how the output is created. +- ```version``` - Prints version information and exit. Expects a `version=` + keyword argument in the addArgument() call. + +Details in [original action guide](http://docs.python.org/dev/library/argparse.html#action) + + +Sub-commands +============ + +ArgumentParser.addSubparsers() + +Many programs split their functionality into a number of sub-commands, for +example, the svn program can invoke sub-commands like `svn checkout`, `svn update`, +and `svn commit`. Splitting up functionality this way can be a particularly good +idea when a program performs several different functions which require different +kinds of command-line arguments. `ArgumentParser` supports creation of such +sub-commands with `addSubparsers()` method. The `addSubparsers()` method is +normally called with no arguments and returns an special action object. +This object has a single method `addParser()`, which takes a command name and +any `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object +that can be modified as usual. + +Example: + +sub_commands.js +```javascript +#!/usr/bin/env node +'use strict'; + +var ArgumentParser = require('../lib/argparse').ArgumentParser; +var parser = new ArgumentParser({ + version: '0.0.1', + addHelp:true, + description: 'Argparse examples: sub-commands', +}); + +var subparsers = parser.addSubparsers({ + title:'subcommands', + dest:"subcommand_name" +}); + +var bar = subparsers.addParser('c1', {addHelp:true}); +bar.addArgument( + [ '-f', '--foo' ], + { + action: 'store', + help: 'foo3 bar3' + } +); +var bar = subparsers.addParser( + 'c2', + {aliases:['co'], addHelp:true} +); +bar.addArgument( + [ '-b', '--bar' ], + { + action: 'store', + type: 'int', + help: 'foo3 bar3' + } +); + +var args = parser.parseArgs(); +console.dir(args); + +``` + +Details in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands) + + +Contributors +============ + +- [Eugene Shkuropat](https://github.com/shkuropat) +- [Paul Jacobson](https://github.com/hpaulj) + +[others](https://github.com/nodeca/argparse/graphs/contributors) + +License +======= + +Copyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin). +Released under the MIT license. See +[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details. + + diff --git a/website/www/node_modules/argparse/index.js b/website/www/node_modules/argparse/index.js new file mode 100644 index 000000000000..3bbc14320048 --- /dev/null +++ b/website/www/node_modules/argparse/index.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/argparse'); diff --git a/website/www/node_modules/argparse/lib/action.js b/website/www/node_modules/argparse/lib/action.js new file mode 100644 index 000000000000..1483c79ffa53 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action.js @@ -0,0 +1,146 @@ +/** + * class Action + * + * Base class for all actions + * Do not call in your code, use this class only for inherits your own action + * + * Information about how to convert command line strings to Javascript objects. + * Action objects are used by an ArgumentParser to represent the information + * needed to parse a single argument from one or more strings from the command + * line. The keyword arguments to the Action constructor are also all attributes + * of Action instances. + * + * ##### Allowed keywords: + * + * - `store` + * - `storeConstant` + * - `storeTrue` + * - `storeFalse` + * - `append` + * - `appendConstant` + * - `count` + * - `help` + * - `version` + * + * Information about action options see [[Action.new]] + * + * See also [original guide](http://docs.python.org/dev/library/argparse.html#action) + * + **/ + +'use strict'; + + +// Constants +var c = require('./const'); + + +/** + * new Action(options) + * + * Base class for all actions. Used only for inherits + * + * + * ##### Options: + * + * - `optionStrings` A list of command-line option strings for the action. + * - `dest` Attribute to hold the created object(s) + * - `nargs` The number of command-line arguments that should be consumed. + * By default, one argument will be consumed and a single value will be + * produced. + * - `constant` Default value for an action with no value. + * - `defaultValue` The value to be produced if the option is not specified. + * - `type` Cast to 'string'|'int'|'float'|'complex'|function (string). If + * None, 'string'. + * - `choices` The choices available. + * - `required` True if the action must always be specified at the command + * line. + * - `help` The help describing the argument. + * - `metavar` The name to be used for the option's argument with the help + * string. If None, the 'dest' value will be used as the name. + * + * ##### nargs supported values: + * + * - `N` (an integer) consumes N arguments (and produces a list) + * - `?` consumes zero or one arguments + * - `*` consumes zero or more arguments (and produces a list) + * - `+` consumes one or more arguments (and produces a list) + * + * Note: that the difference between the default and nargs=1 is that with the + * default, a single value will be produced, while with nargs=1, a list + * containing a single value will be produced. + **/ +var Action = module.exports = function Action(options) { + options = options || {}; + this.optionStrings = options.optionStrings || []; + this.dest = options.dest; + this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null; + this.constant = typeof options.constant !== 'undefined' ? options.constant : null; + this.defaultValue = options.defaultValue; + this.type = typeof options.type !== 'undefined' ? options.type : null; + this.choices = typeof options.choices !== 'undefined' ? options.choices : null; + this.required = typeof options.required !== 'undefined' ? options.required : false; + this.help = typeof options.help !== 'undefined' ? options.help : null; + this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null; + + if (!(this.optionStrings instanceof Array)) { + throw new Error('optionStrings should be an array'); + } + if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') { + throw new Error('required should be a boolean'); + } +}; + +/** + * Action#getName -> String + * + * Tells action name + **/ +Action.prototype.getName = function () { + if (this.optionStrings.length > 0) { + return this.optionStrings.join('/'); + } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) { + return this.metavar; + } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) { + return this.dest; + } + return null; +}; + +/** + * Action#isOptional -> Boolean + * + * Return true if optional + **/ +Action.prototype.isOptional = function () { + return !this.isPositional(); +}; + +/** + * Action#isPositional -> Boolean + * + * Return true if positional + **/ +Action.prototype.isPositional = function () { + return (this.optionStrings.length === 0); +}; + +/** + * Action#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Should be implemented in inherited classes + * + * ##### Example + * + * ActionCount.prototype.call = function (parser, namespace, values, optionString) { + * namespace.set(this.dest, (namespace[this.dest] || 0) + 1); + * }; + * + **/ +Action.prototype.call = function () { + throw new Error('.call() not defined');// Not Implemented error +}; diff --git a/website/www/node_modules/argparse/lib/action/append.js b/website/www/node_modules/argparse/lib/action/append.js new file mode 100644 index 000000000000..b5da0de23275 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/append.js @@ -0,0 +1,53 @@ +/*:nodoc:* + * class ActionAppend + * + * This action stores a list, and appends each argument value to the list. + * This is useful to allow an option to be specified multiple times. + * This class inherided from [[Action]] + * + **/ + +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +/*:nodoc:* + * new ActionAppend(options) + * - options (object): options hash see [[Action.new]] + * + * Note: options.nargs should be optional for constants + * and more then zero for other + **/ +var ActionAppend = module.exports = function ActionAppend(options) { + options = options || {}; + if (this.nargs <= 0) { + throw new Error('nargs for append actions must be > 0; if arg ' + + 'strings are not supplying the value to append, ' + + 'the append const action may be more appropriate'); + } + if (!!this.constant && this.nargs !== c.OPTIONAL) { + throw new Error('nargs must be OPTIONAL to supply const'); + } + Action.call(this, options); +}; +util.inherits(ActionAppend, Action); + +/*:nodoc:* + * ActionAppend#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionAppend.prototype.call = function (parser, namespace, values) { + var items = (namespace[this.dest] || []).slice(); + items.push(values); + namespace.set(this.dest, items); +}; diff --git a/website/www/node_modules/argparse/lib/action/append/constant.js b/website/www/node_modules/argparse/lib/action/append/constant.js new file mode 100644 index 000000000000..313f5d2efcb0 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/append/constant.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionAppendConstant + * + * This stores a list, and appends the value specified by + * the const keyword argument to the list. + * (Note that the const keyword argument defaults to null.) + * The 'appendConst' action is typically useful when multiple + * arguments need to store constants to the same list. + * + * This class inherited from [[Action]] + **/ + +'use strict'; + +var util = require('util'); + +var Action = require('../../action'); + +/*:nodoc:* + * new ActionAppendConstant(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionAppendConstant = module.exports = function ActionAppendConstant(options) { + options = options || {}; + options.nargs = 0; + if (typeof options.constant === 'undefined') { + throw new Error('constant option is required for appendAction'); + } + Action.call(this, options); +}; +util.inherits(ActionAppendConstant, Action); + +/*:nodoc:* + * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionAppendConstant.prototype.call = function (parser, namespace) { + var items = [].concat(namespace[this.dest] || []); + items.push(this.constant); + namespace.set(this.dest, items); +}; diff --git a/website/www/node_modules/argparse/lib/action/count.js b/website/www/node_modules/argparse/lib/action/count.js new file mode 100644 index 000000000000..d6a5899d07ef --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/count.js @@ -0,0 +1,40 @@ +/*:nodoc:* + * class ActionCount + * + * This counts the number of times a keyword argument occurs. + * For example, this is useful for increasing verbosity levels + * + * This class inherided from [[Action]] + * + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +/*:nodoc:* + * new ActionCount(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionCount = module.exports = function ActionCount(options) { + options = options || {}; + options.nargs = 0; + + Action.call(this, options); +}; +util.inherits(ActionCount, Action); + +/*:nodoc:* + * ActionCount#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionCount.prototype.call = function (parser, namespace) { + namespace.set(this.dest, (namespace[this.dest] || 0) + 1); +}; diff --git a/website/www/node_modules/argparse/lib/action/help.js b/website/www/node_modules/argparse/lib/action/help.js new file mode 100644 index 000000000000..b40e05a6f0b3 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/help.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionHelp + * + * Support action for printing help + * This class inherided from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +/*:nodoc:* + * new ActionHelp(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionHelp = module.exports = function ActionHelp(options) { + options = options || {}; + if (options.defaultValue !== null) { + options.defaultValue = options.defaultValue; + } else { + options.defaultValue = c.SUPPRESS; + } + options.dest = (options.dest !== null ? options.dest : c.SUPPRESS); + options.nargs = 0; + Action.call(this, options); + +}; +util.inherits(ActionHelp, Action); + +/*:nodoc:* + * ActionHelp#call(parser, namespace, values, optionString) + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Print help and exit + **/ +ActionHelp.prototype.call = function (parser) { + parser.printHelp(); + parser.exit(); +}; diff --git a/website/www/node_modules/argparse/lib/action/store.js b/website/www/node_modules/argparse/lib/action/store.js new file mode 100644 index 000000000000..283b86092175 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/store.js @@ -0,0 +1,50 @@ +/*:nodoc:* + * class ActionStore + * + * This action just stores the argument’s value. This is the default action. + * + * This class inherited from [[Action]] + * + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + + +/*:nodoc:* + * new ActionStore(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStore = module.exports = function ActionStore(options) { + options = options || {}; + if (this.nargs <= 0) { + throw new Error('nargs for store actions must be > 0; if you ' + + 'have nothing to store, actions such as store ' + + 'true or store const may be more appropriate'); + + } + if (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) { + throw new Error('nargs must be OPTIONAL to supply const'); + } + Action.call(this, options); +}; +util.inherits(ActionStore, Action); + +/*:nodoc:* + * ActionStore#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionStore.prototype.call = function (parser, namespace, values) { + namespace.set(this.dest, values); +}; diff --git a/website/www/node_modules/argparse/lib/action/store/constant.js b/website/www/node_modules/argparse/lib/action/store/constant.js new file mode 100644 index 000000000000..23caa897b375 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/store/constant.js @@ -0,0 +1,43 @@ +/*:nodoc:* + * class ActionStoreConstant + * + * This action stores the value specified by the const keyword argument. + * (Note that the const keyword argument defaults to the rather unhelpful null.) + * The 'store_const' action is most commonly used with optional + * arguments that specify some sort of flag. + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../../action'); + +/*:nodoc:* + * new ActionStoreConstant(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStoreConstant = module.exports = function ActionStoreConstant(options) { + options = options || {}; + options.nargs = 0; + if (typeof options.constant === 'undefined') { + throw new Error('constant option is required for storeAction'); + } + Action.call(this, options); +}; +util.inherits(ActionStoreConstant, Action); + +/*:nodoc:* + * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionStoreConstant.prototype.call = function (parser, namespace) { + namespace.set(this.dest, this.constant); +}; diff --git a/website/www/node_modules/argparse/lib/action/store/false.js b/website/www/node_modules/argparse/lib/action/store/false.js new file mode 100644 index 000000000000..9924f461dadf --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/store/false.js @@ -0,0 +1,27 @@ +/*:nodoc:* + * class ActionStoreFalse + * + * This action store the values False respectively. + * This is special cases of 'storeConst' + * + * This class inherited from [[Action]] + **/ + +'use strict'; + +var util = require('util'); + +var ActionStoreConstant = require('./constant'); + +/*:nodoc:* + * new ActionStoreFalse(options) + * - options (object): hash of options see [[Action.new]] + * + **/ +var ActionStoreFalse = module.exports = function ActionStoreFalse(options) { + options = options || {}; + options.constant = false; + options.defaultValue = options.defaultValue !== null ? options.defaultValue : true; + ActionStoreConstant.call(this, options); +}; +util.inherits(ActionStoreFalse, ActionStoreConstant); diff --git a/website/www/node_modules/argparse/lib/action/store/true.js b/website/www/node_modules/argparse/lib/action/store/true.js new file mode 100644 index 000000000000..9e22f7d4419e --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/store/true.js @@ -0,0 +1,26 @@ +/*:nodoc:* + * class ActionStoreTrue + * + * This action store the values True respectively. + * This isspecial cases of 'storeConst' + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var ActionStoreConstant = require('./constant'); + +/*:nodoc:* + * new ActionStoreTrue(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStoreTrue = module.exports = function ActionStoreTrue(options) { + options = options || {}; + options.constant = true; + options.defaultValue = options.defaultValue !== null ? options.defaultValue : false; + ActionStoreConstant.call(this, options); +}; +util.inherits(ActionStoreTrue, ActionStoreConstant); diff --git a/website/www/node_modules/argparse/lib/action/subparsers.js b/website/www/node_modules/argparse/lib/action/subparsers.js new file mode 100644 index 000000000000..99dfedd0f1aa --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/subparsers.js @@ -0,0 +1,149 @@ +/** internal + * class ActionSubparsers + * + * Support the creation of such sub-commands with the addSubparsers() + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); +var format = require('util').format; + + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +// Errors +var argumentErrorHelper = require('../argument/error'); + + +/*:nodoc:* + * new ChoicesPseudoAction(name, help) + * + * Create pseudo action for correct help text + * + **/ +function ChoicesPseudoAction(name, help) { + var options = { + optionStrings: [], + dest: name, + help: help + }; + + Action.call(this, options); +} + +util.inherits(ChoicesPseudoAction, Action); + +/** + * new ActionSubparsers(options) + * - options (object): options hash see [[Action.new]] + * + **/ +function ActionSubparsers(options) { + options = options || {}; + options.dest = options.dest || c.SUPPRESS; + options.nargs = c.PARSER; + + this.debug = (options.debug === true); + + this._progPrefix = options.prog; + this._parserClass = options.parserClass; + this._nameParserMap = {}; + this._choicesActions = []; + + options.choices = this._nameParserMap; + Action.call(this, options); +} + +util.inherits(ActionSubparsers, Action); + +/*:nodoc:* + * ActionSubparsers#addParser(name, options) -> ArgumentParser + * - name (string): sub-command name + * - options (object): see [[ArgumentParser.new]] + * + * Note: + * addParser supports an additional aliases option, + * which allows multiple strings to refer to the same subparser. + * This example, like svn, aliases co as a shorthand for checkout + * + **/ +ActionSubparsers.prototype.addParser = function (name, options) { + var parser; + + var self = this; + + options = options || {}; + + options.debug = (this.debug === true); + + // set program from the existing prefix + if (!options.prog) { + options.prog = this._progPrefix + ' ' + name; + } + + var aliases = options.aliases || []; + + // create a pseudo-action to hold the choice help + if (!!options.help || typeof options.help === 'string') { + var help = options.help; + delete options.help; + + var choiceAction = new ChoicesPseudoAction(name, help); + this._choicesActions.push(choiceAction); + } + + // create the parser and add it to the map + parser = new this._parserClass(options); + this._nameParserMap[name] = parser; + + // make parser available under aliases also + aliases.forEach(function (alias) { + self._nameParserMap[alias] = parser; + }); + + return parser; +}; + +ActionSubparsers.prototype._getSubactions = function () { + return this._choicesActions; +}; + +/*:nodoc:* + * ActionSubparsers#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Parse input aguments + **/ +ActionSubparsers.prototype.call = function (parser, namespace, values) { + var parserName = values[0]; + var argStrings = values.slice(1); + + // set the parser name if requested + if (this.dest !== c.SUPPRESS) { + namespace[this.dest] = parserName; + } + + // select the parser + if (this._nameParserMap[parserName]) { + parser = this._nameParserMap[parserName]; + } else { + throw argumentErrorHelper(format( + 'Unknown parser "%s" (choices: [%s]).', + parserName, + Object.keys(this._nameParserMap).join(', ') + )); + } + + // parse all the remaining options into the namespace + parser.parseArgs(argStrings, namespace); +}; + +module.exports = ActionSubparsers; diff --git a/website/www/node_modules/argparse/lib/action/version.js b/website/www/node_modules/argparse/lib/action/version.js new file mode 100644 index 000000000000..8053328cdef4 --- /dev/null +++ b/website/www/node_modules/argparse/lib/action/version.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionVersion + * + * Support action for printing program version + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// +// Constants +// +var c = require('../const'); + +/*:nodoc:* + * new ActionVersion(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionVersion = module.exports = function ActionVersion(options) { + options = options || {}; + options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS); + options.dest = (options.dest || c.SUPPRESS); + options.nargs = 0; + this.version = options.version; + Action.call(this, options); +}; +util.inherits(ActionVersion, Action); + +/*:nodoc:* + * ActionVersion#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Print version and exit + **/ +ActionVersion.prototype.call = function (parser) { + var version = this.version || parser.version; + var formatter = parser._getFormatter(); + formatter.addText(version); + parser.exit(0, formatter.formatHelp()); +}; diff --git a/website/www/node_modules/argparse/lib/action_container.js b/website/www/node_modules/argparse/lib/action_container.js new file mode 100644 index 000000000000..6f1237bea23d --- /dev/null +++ b/website/www/node_modules/argparse/lib/action_container.js @@ -0,0 +1,482 @@ +/** internal + * class ActionContainer + * + * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] + **/ + +'use strict'; + +var format = require('util').format; + +// Constants +var c = require('./const'); + +var $$ = require('./utils'); + +//Actions +var ActionHelp = require('./action/help'); +var ActionAppend = require('./action/append'); +var ActionAppendConstant = require('./action/append/constant'); +var ActionCount = require('./action/count'); +var ActionStore = require('./action/store'); +var ActionStoreConstant = require('./action/store/constant'); +var ActionStoreTrue = require('./action/store/true'); +var ActionStoreFalse = require('./action/store/false'); +var ActionVersion = require('./action/version'); +var ActionSubparsers = require('./action/subparsers'); + +// Errors +var argumentErrorHelper = require('./argument/error'); + +/** + * new ActionContainer(options) + * + * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] + * + * ##### Options: + * + * - `description` -- A description of what the program does + * - `prefixChars` -- Characters that prefix optional arguments + * - `argumentDefault` -- The default value for all arguments + * - `conflictHandler` -- The conflict handler to use for duplicate arguments + **/ +var ActionContainer = module.exports = function ActionContainer(options) { + options = options || {}; + + this.description = options.description; + this.argumentDefault = options.argumentDefault; + this.prefixChars = options.prefixChars || ''; + this.conflictHandler = options.conflictHandler; + + // set up registries + this._registries = {}; + + // register actions + this.register('action', null, ActionStore); + this.register('action', 'store', ActionStore); + this.register('action', 'storeConst', ActionStoreConstant); + this.register('action', 'storeTrue', ActionStoreTrue); + this.register('action', 'storeFalse', ActionStoreFalse); + this.register('action', 'append', ActionAppend); + this.register('action', 'appendConst', ActionAppendConstant); + this.register('action', 'count', ActionCount); + this.register('action', 'help', ActionHelp); + this.register('action', 'version', ActionVersion); + this.register('action', 'parsers', ActionSubparsers); + + // raise an exception if the conflict handler is invalid + this._getHandler(); + + // action storage + this._actions = []; + this._optionStringActions = {}; + + // groups + this._actionGroups = []; + this._mutuallyExclusiveGroups = []; + + // defaults storage + this._defaults = {}; + + // determines whether an "option" looks like a negative number + // -1, -1.5 -5e+4 + this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$'); + + // whether or not there are any optionals that look like negative + // numbers -- uses a list so it can be shared and edited + this._hasNegativeNumberOptionals = []; +}; + +// Groups must be required, then ActionContainer already defined +var ArgumentGroup = require('./argument/group'); +var MutuallyExclusiveGroup = require('./argument/exclusive'); + +// +// Registration methods +// + +/** + * ActionContainer#register(registryName, value, object) -> Void + * - registryName (String) : object type action|type + * - value (string) : keyword + * - object (Object|Function) : handler + * + * Register handlers + **/ +ActionContainer.prototype.register = function (registryName, value, object) { + this._registries[registryName] = this._registries[registryName] || {}; + this._registries[registryName][value] = object; +}; + +ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) { + if (arguments.length < 3) { + defaultValue = null; + } + return this._registries[registryName][value] || defaultValue; +}; + +// +// Namespace default accessor methods +// + +/** + * ActionContainer#setDefaults(options) -> Void + * - options (object):hash of options see [[Action.new]] + * + * Set defaults + **/ +ActionContainer.prototype.setDefaults = function (options) { + options = options || {}; + for (var property in options) { + if ($$.has(options, property)) { + this._defaults[property] = options[property]; + } + } + + // if these defaults match any existing arguments, replace the previous + // default on the object with the new one + this._actions.forEach(function (action) { + if ($$.has(options, action.dest)) { + action.defaultValue = options[action.dest]; + } + }); +}; + +/** + * ActionContainer#getDefault(dest) -> Mixed + * - dest (string): action destination + * + * Return action default value + **/ +ActionContainer.prototype.getDefault = function (dest) { + var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null; + + this._actions.forEach(function (action) { + if (action.dest === dest && $$.has(action, 'defaultValue')) { + result = action.defaultValue; + } + }); + + return result; +}; +// +// Adding argument actions +// + +/** + * ActionContainer#addArgument(args, options) -> Object + * - args (String|Array): argument key, or array of argument keys + * - options (Object): action objects see [[Action.new]] + * + * #### Examples + * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... }) + * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... }) + * - addArgument('--baz', { action: 'store', nargs: 1, ... }) + **/ +ActionContainer.prototype.addArgument = function (args, options) { + args = args; + options = options || {}; + + if (typeof args === 'string') { + args = [ args ]; + } + if (!Array.isArray(args)) { + throw new TypeError('addArgument first argument should be a string or an array'); + } + if (typeof options !== 'object' || Array.isArray(options)) { + throw new TypeError('addArgument second argument should be a hash'); + } + + // if no positional args are supplied or only one is supplied and + // it doesn't look like an option string, parse a positional argument + if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) { + if (args && !!options.dest) { + throw new Error('dest supplied twice for positional argument'); + } + options = this._getPositional(args, options); + + // otherwise, we're adding an optional argument + } else { + options = this._getOptional(args, options); + } + + // if no default was supplied, use the parser-level default + if (typeof options.defaultValue === 'undefined') { + var dest = options.dest; + if ($$.has(this._defaults, dest)) { + options.defaultValue = this._defaults[dest]; + } else if (typeof this.argumentDefault !== 'undefined') { + options.defaultValue = this.argumentDefault; + } + } + + // create the action object, and add it to the parser + var ActionClass = this._popActionClass(options); + if (typeof ActionClass !== 'function') { + throw new Error(format('Unknown action "%s".', ActionClass)); + } + var action = new ActionClass(options); + + // throw an error if the action type is not callable + var typeFunction = this._registryGet('type', action.type, action.type); + if (typeof typeFunction !== 'function') { + throw new Error(format('"%s" is not callable', typeFunction)); + } + + return this._addAction(action); +}; + +/** + * ActionContainer#addArgumentGroup(options) -> ArgumentGroup + * - options (Object): hash of options see [[ArgumentGroup.new]] + * + * Create new arguments groups + **/ +ActionContainer.prototype.addArgumentGroup = function (options) { + var group = new ArgumentGroup(this, options); + this._actionGroups.push(group); + return group; +}; + +/** + * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup + * - options (Object): {required: false} + * + * Create new mutual exclusive groups + **/ +ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) { + var group = new MutuallyExclusiveGroup(this, options); + this._mutuallyExclusiveGroups.push(group); + return group; +}; + +ActionContainer.prototype._addAction = function (action) { + var self = this; + + // resolve any conflicts + this._checkConflict(action); + + // add to actions list + this._actions.push(action); + action.container = this; + + // index the action by any option strings it has + action.optionStrings.forEach(function (optionString) { + self._optionStringActions[optionString] = action; + }); + + // set the flag if any option strings look like negative numbers + action.optionStrings.forEach(function (optionString) { + if (optionString.match(self._regexpNegativeNumber)) { + if (!self._hasNegativeNumberOptionals.some(Boolean)) { + self._hasNegativeNumberOptionals.push(true); + } + } + }); + + // return the created action + return action; +}; + +ActionContainer.prototype._removeAction = function (action) { + var actionIndex = this._actions.indexOf(action); + if (actionIndex >= 0) { + this._actions.splice(actionIndex, 1); + } +}; + +ActionContainer.prototype._addContainerActions = function (container) { + // collect groups by titles + var titleGroupMap = {}; + this._actionGroups.forEach(function (group) { + if (titleGroupMap[group.title]) { + throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title)); + } + titleGroupMap[group.title] = group; + }); + + // map each action to its group + var groupMap = {}; + function actionHash(action) { + // unique (hopefully?) string suitable as dictionary key + return action.getName(); + } + container._actionGroups.forEach(function (group) { + // if a group with the title exists, use that, otherwise + // create a new group matching the container's group + if (!titleGroupMap[group.title]) { + titleGroupMap[group.title] = this.addArgumentGroup({ + title: group.title, + description: group.description + }); + } + + // map the actions to their new group + group._groupActions.forEach(function (action) { + groupMap[actionHash(action)] = titleGroupMap[group.title]; + }); + }, this); + + // add container's mutually exclusive groups + // NOTE: if add_mutually_exclusive_group ever gains title= and + // description= then this code will need to be expanded as above + var mutexGroup; + container._mutuallyExclusiveGroups.forEach(function (group) { + mutexGroup = this.addMutuallyExclusiveGroup({ + required: group.required + }); + // map the actions to their new mutex group + group._groupActions.forEach(function (action) { + groupMap[actionHash(action)] = mutexGroup; + }); + }, this); // forEach takes a 'this' argument + + // add all actions to this container or their group + container._actions.forEach(function (action) { + var key = actionHash(action); + if (groupMap[key]) { + groupMap[key]._addAction(action); + } else { + this._addAction(action); + } + }); +}; + +ActionContainer.prototype._getPositional = function (dest, options) { + if (Array.isArray(dest)) { + dest = dest[0]; + } + // make sure required is not specified + if (options.required) { + throw new Error('"required" is an invalid argument for positionals.'); + } + + // mark positional arguments as required if at least one is + // always required + if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) { + options.required = true; + } + if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') { + options.required = true; + } + + // return the keyword arguments with no option strings + options.dest = dest; + options.optionStrings = []; + return options; +}; + +ActionContainer.prototype._getOptional = function (args, options) { + var prefixChars = this.prefixChars; + var optionStrings = []; + var optionStringsLong = []; + + // determine short and long option strings + args.forEach(function (optionString) { + // error on strings that don't start with an appropriate prefix + if (prefixChars.indexOf(optionString[0]) < 0) { + throw new Error(format('Invalid option string "%s": must start with a "%s".', + optionString, + prefixChars + )); + } + + // strings starting with two prefix characters are long options + optionStrings.push(optionString); + if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) { + optionStringsLong.push(optionString); + } + }); + + // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' + var dest = options.dest || null; + delete options.dest; + + if (!dest) { + var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0]; + dest = $$.trimChars(optionStringDest, this.prefixChars); + + if (dest.length === 0) { + throw new Error( + format('dest= is required for options like "%s"', optionStrings.join(', ')) + ); + } + dest = dest.replace(/-/g, '_'); + } + + // return the updated keyword arguments + options.dest = dest; + options.optionStrings = optionStrings; + + return options; +}; + +ActionContainer.prototype._popActionClass = function (options, defaultValue) { + defaultValue = defaultValue || null; + + var action = (options.action || defaultValue); + delete options.action; + + var actionClass = this._registryGet('action', action, action); + return actionClass; +}; + +ActionContainer.prototype._getHandler = function () { + var handlerString = this.conflictHandler; + var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString); + var func = this[handlerFuncName]; + if (typeof func === 'undefined') { + var msg = 'invalid conflict resolution value: ' + handlerString; + throw new Error(msg); + } else { + return func; + } +}; + +ActionContainer.prototype._checkConflict = function (action) { + var optionStringActions = this._optionStringActions; + var conflictOptionals = []; + + // find all options that conflict with this option + // collect pairs, the string, and an existing action that it conflicts with + action.optionStrings.forEach(function (optionString) { + var conflOptional = optionStringActions[optionString]; + if (typeof conflOptional !== 'undefined') { + conflictOptionals.push([ optionString, conflOptional ]); + } + }); + + if (conflictOptionals.length > 0) { + var conflictHandler = this._getHandler(); + conflictHandler.call(this, action, conflictOptionals); + } +}; + +ActionContainer.prototype._handleConflictError = function (action, conflOptionals) { + var conflicts = conflOptionals.map(function (pair) { return pair[0]; }); + conflicts = conflicts.join(', '); + throw argumentErrorHelper( + action, + format('Conflicting option string(s): %s', conflicts) + ); +}; + +ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) { + // remove all conflicting options + var self = this; + conflOptionals.forEach(function (pair) { + var optionString = pair[0]; + var conflictingAction = pair[1]; + // remove the conflicting option string + var i = conflictingAction.optionStrings.indexOf(optionString); + if (i >= 0) { + conflictingAction.optionStrings.splice(i, 1); + } + delete self._optionStringActions[optionString]; + // if the option now has no option string, remove it from the + // container holding it + if (conflictingAction.optionStrings.length === 0) { + conflictingAction.container._removeAction(conflictingAction); + } + }); +}; diff --git a/website/www/node_modules/argparse/lib/argparse.js b/website/www/node_modules/argparse/lib/argparse.js new file mode 100644 index 000000000000..f2a2c51d9a89 --- /dev/null +++ b/website/www/node_modules/argparse/lib/argparse.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports.ArgumentParser = require('./argument_parser.js'); +module.exports.Namespace = require('./namespace'); +module.exports.Action = require('./action'); +module.exports.HelpFormatter = require('./help/formatter.js'); +module.exports.Const = require('./const.js'); + +module.exports.ArgumentDefaultsHelpFormatter = + require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter; +module.exports.RawDescriptionHelpFormatter = + require('./help/added_formatters.js').RawDescriptionHelpFormatter; +module.exports.RawTextHelpFormatter = + require('./help/added_formatters.js').RawTextHelpFormatter; diff --git a/website/www/node_modules/argparse/lib/argument/error.js b/website/www/node_modules/argparse/lib/argument/error.js new file mode 100644 index 000000000000..c8a02a08b8fb --- /dev/null +++ b/website/www/node_modules/argparse/lib/argument/error.js @@ -0,0 +1,50 @@ +'use strict'; + + +var format = require('util').format; + + +var ERR_CODE = 'ARGError'; + +/*:nodoc:* + * argumentError(argument, message) -> TypeError + * - argument (Object): action with broken argument + * - message (String): error message + * + * Error format helper. An error from creating or using an argument + * (optional or positional). The string value of this exception + * is the message, augmented with information + * about the argument that caused it. + * + * #####Example + * + * var argumentErrorHelper = require('./argument/error'); + * if (conflictOptionals.length > 0) { + * throw argumentErrorHelper( + * action, + * format('Conflicting option string(s): %s', conflictOptionals.join(', ')) + * ); + * } + * + **/ +module.exports = function (argument, message) { + var argumentName = null; + var errMessage; + var err; + + if (argument.getName) { + argumentName = argument.getName(); + } else { + argumentName = '' + argument; + } + + if (!argumentName) { + errMessage = message; + } else { + errMessage = format('argument "%s": %s', argumentName, message); + } + + err = new TypeError(errMessage); + err.code = ERR_CODE; + return err; +}; diff --git a/website/www/node_modules/argparse/lib/argument/exclusive.js b/website/www/node_modules/argparse/lib/argument/exclusive.js new file mode 100644 index 000000000000..8287e00d0464 --- /dev/null +++ b/website/www/node_modules/argparse/lib/argument/exclusive.js @@ -0,0 +1,54 @@ +/** internal + * class MutuallyExclusiveGroup + * + * Group arguments. + * By default, ArgumentParser groups command-line arguments + * into “positional arguments” and “optional arguments” + * when displaying help messages. When there is a better + * conceptual grouping of arguments than this default one, + * appropriate groups can be created using the addArgumentGroup() method + * + * This class inherited from [[ArgumentContainer]] + **/ +'use strict'; + +var util = require('util'); + +var ArgumentGroup = require('./group'); + +/** + * new MutuallyExclusiveGroup(container, options) + * - container (object): main container + * - options (object): options.required -> true/false + * + * `required` could be an argument itself, but making it a property of + * the options argument is more consistent with the JS adaptation of the Python) + **/ +var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) { + var required; + options = options || {}; + required = options.required || false; + ArgumentGroup.call(this, container); + this.required = required; + +}; +util.inherits(MutuallyExclusiveGroup, ArgumentGroup); + + +MutuallyExclusiveGroup.prototype._addAction = function (action) { + var msg; + if (action.required) { + msg = 'mutually exclusive arguments must be optional'; + throw new Error(msg); + } + action = this._container._addAction(action); + this._groupActions.push(action); + return action; +}; + + +MutuallyExclusiveGroup.prototype._removeAction = function (action) { + this._container._removeAction(action); + this._groupActions.remove(action); +}; + diff --git a/website/www/node_modules/argparse/lib/argument/group.js b/website/www/node_modules/argparse/lib/argument/group.js new file mode 100644 index 000000000000..58b271f2fec8 --- /dev/null +++ b/website/www/node_modules/argparse/lib/argument/group.js @@ -0,0 +1,75 @@ +/** internal + * class ArgumentGroup + * + * Group arguments. + * By default, ArgumentParser groups command-line arguments + * into “positional arguments” and “optional arguments” + * when displaying help messages. When there is a better + * conceptual grouping of arguments than this default one, + * appropriate groups can be created using the addArgumentGroup() method + * + * This class inherited from [[ArgumentContainer]] + **/ +'use strict'; + +var util = require('util'); + +var ActionContainer = require('../action_container'); + + +/** + * new ArgumentGroup(container, options) + * - container (object): main container + * - options (object): hash of group options + * + * #### options + * - **prefixChars** group name prefix + * - **argumentDefault** default argument value + * - **title** group title + * - **description** group description + * + **/ +var ArgumentGroup = module.exports = function ArgumentGroup(container, options) { + + options = options || {}; + + // add any missing keyword arguments by checking the container + options.conflictHandler = (options.conflictHandler || container.conflictHandler); + options.prefixChars = (options.prefixChars || container.prefixChars); + options.argumentDefault = (options.argumentDefault || container.argumentDefault); + + ActionContainer.call(this, options); + + // group attributes + this.title = options.title; + this._groupActions = []; + + // share most attributes with the container + this._container = container; + this._registries = container._registries; + this._actions = container._actions; + this._optionStringActions = container._optionStringActions; + this._defaults = container._defaults; + this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals; + this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups; +}; +util.inherits(ArgumentGroup, ActionContainer); + + +ArgumentGroup.prototype._addAction = function (action) { + // Parent add action + action = ActionContainer.prototype._addAction.call(this, action); + this._groupActions.push(action); + return action; +}; + + +ArgumentGroup.prototype._removeAction = function (action) { + // Parent remove action + ActionContainer.prototype._removeAction.call(this, action); + var actionIndex = this._groupActions.indexOf(action); + if (actionIndex >= 0) { + this._groupActions.splice(actionIndex, 1); + } +}; + diff --git a/website/www/node_modules/argparse/lib/argument_parser.js b/website/www/node_modules/argparse/lib/argument_parser.js new file mode 100644 index 000000000000..bd9a59a453c9 --- /dev/null +++ b/website/www/node_modules/argparse/lib/argument_parser.js @@ -0,0 +1,1161 @@ +/** + * class ArgumentParser + * + * Object for parsing command line strings into js objects. + * + * Inherited from [[ActionContainer]] + **/ +'use strict'; + +var util = require('util'); +var format = require('util').format; +var Path = require('path'); +var sprintf = require('sprintf-js').sprintf; + +// Constants +var c = require('./const'); + +var $$ = require('./utils'); + +var ActionContainer = require('./action_container'); + +// Errors +var argumentErrorHelper = require('./argument/error'); + +var HelpFormatter = require('./help/formatter'); + +var Namespace = require('./namespace'); + + +/** + * new ArgumentParser(options) + * + * Create a new ArgumentParser object. + * + * ##### Options: + * - `prog` The name of the program (default: Path.basename(process.argv[1])) + * - `usage` A usage message (default: auto-generated from arguments) + * - `description` A description of what the program does + * - `epilog` Text following the argument descriptions + * - `parents` Parsers whose arguments should be copied into this one + * - `formatterClass` HelpFormatter class for printing help messages + * - `prefixChars` Characters that prefix optional arguments + * - `fromfilePrefixChars` Characters that prefix files containing additional arguments + * - `argumentDefault` The default value for all arguments + * - `addHelp` Add a -h/-help option + * - `conflictHandler` Specifies how to handle conflicting argument names + * - `debug` Enable debug mode. Argument errors throw exception in + * debug mode and process.exit in normal. Used for development and + * testing (default: false) + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects + **/ +function ArgumentParser(options) { + if (!(this instanceof ArgumentParser)) { + return new ArgumentParser(options); + } + var self = this; + options = options || {}; + + options.description = (options.description || null); + options.argumentDefault = (options.argumentDefault || null); + options.prefixChars = (options.prefixChars || '-'); + options.conflictHandler = (options.conflictHandler || 'error'); + ActionContainer.call(this, options); + + options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp; + options.parents = options.parents || []; + // default program name + options.prog = (options.prog || Path.basename(process.argv[1])); + this.prog = options.prog; + this.usage = options.usage; + this.epilog = options.epilog; + this.version = options.version; + + this.debug = (options.debug === true); + + this.formatterClass = (options.formatterClass || HelpFormatter); + this.fromfilePrefixChars = options.fromfilePrefixChars || null; + this._positionals = this.addArgumentGroup({ title: 'Positional arguments' }); + this._optionals = this.addArgumentGroup({ title: 'Optional arguments' }); + this._subparsers = null; + + // register types + function FUNCTION_IDENTITY(o) { + return o; + } + this.register('type', 'auto', FUNCTION_IDENTITY); + this.register('type', null, FUNCTION_IDENTITY); + this.register('type', 'int', function (x) { + var result = parseInt(x, 10); + if (isNaN(result)) { + throw new Error(x + ' is not a valid integer.'); + } + return result; + }); + this.register('type', 'float', function (x) { + var result = parseFloat(x); + if (isNaN(result)) { + throw new Error(x + ' is not a valid float.'); + } + return result; + }); + this.register('type', 'string', function (x) { + return '' + x; + }); + + // add help and version arguments if necessary + var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0]; + if (options.addHelp) { + this.addArgument( + [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ], + { + action: 'help', + defaultValue: c.SUPPRESS, + help: 'Show this help message and exit.' + } + ); + } + if (typeof this.version !== 'undefined') { + this.addArgument( + [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ], + { + action: 'version', + version: this.version, + defaultValue: c.SUPPRESS, + help: "Show program's version number and exit." + } + ); + } + + // add parent arguments and defaults + options.parents.forEach(function (parent) { + self._addContainerActions(parent); + if (typeof parent._defaults !== 'undefined') { + for (var defaultKey in parent._defaults) { + if (parent._defaults.hasOwnProperty(defaultKey)) { + self._defaults[defaultKey] = parent._defaults[defaultKey]; + } + } + } + }); +} + +util.inherits(ArgumentParser, ActionContainer); + +/** + * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]] + * - options (object): hash of options see [[ActionSubparsers.new]] + * + * See also [subcommands][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands + **/ +ArgumentParser.prototype.addSubparsers = function (options) { + if (this._subparsers) { + this.error('Cannot have multiple subparser arguments.'); + } + + options = options || {}; + options.debug = (this.debug === true); + options.optionStrings = []; + options.parserClass = (options.parserClass || ArgumentParser); + + + if (!!options.title || !!options.description) { + + this._subparsers = this.addArgumentGroup({ + title: (options.title || 'subcommands'), + description: options.description + }); + delete options.title; + delete options.description; + + } else { + this._subparsers = this._positionals; + } + + // prog defaults to the usage message of this parser, skipping + // optional arguments and with no "usage:" prefix + if (!options.prog) { + var formatter = this._getFormatter(); + var positionals = this._getPositionalActions(); + var groups = this._mutuallyExclusiveGroups; + formatter.addUsage(this.usage, positionals, groups, ''); + options.prog = formatter.formatHelp().trim(); + } + + // create the parsers action and add it to the positionals list + var ParsersClass = this._popActionClass(options, 'parsers'); + var action = new ParsersClass(options); + this._subparsers._addAction(action); + + // return the created parsers action + return action; +}; + +ArgumentParser.prototype._addAction = function (action) { + if (action.isOptional()) { + this._optionals._addAction(action); + } else { + this._positionals._addAction(action); + } + return action; +}; + +ArgumentParser.prototype._getOptionalActions = function () { + return this._actions.filter(function (action) { + return action.isOptional(); + }); +}; + +ArgumentParser.prototype._getPositionalActions = function () { + return this._actions.filter(function (action) { + return action.isPositional(); + }); +}; + + +/** + * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object + * - args (array): input elements + * - namespace (Namespace|Object): result object + * + * Parsed args and throws error if some arguments are not recognized + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method + **/ +ArgumentParser.prototype.parseArgs = function (args, namespace) { + var argv; + var result = this.parseKnownArgs(args, namespace); + + args = result[0]; + argv = result[1]; + if (argv && argv.length > 0) { + this.error( + format('Unrecognized arguments: %s.', argv.join(' ')) + ); + } + return args; +}; + +/** + * ArgumentParser#parseKnownArgs(args, namespace) -> array + * - args (array): input options + * - namespace (Namespace|Object): result object + * + * Parse known arguments and return tuple of result object + * and unknown args + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing + **/ +ArgumentParser.prototype.parseKnownArgs = function (args, namespace) { + var self = this; + + // args default to the system args + args = args || process.argv.slice(2); + + // default Namespace built from parser defaults + namespace = namespace || new Namespace(); + + self._actions.forEach(function (action) { + if (action.dest !== c.SUPPRESS) { + if (!$$.has(namespace, action.dest)) { + if (action.defaultValue !== c.SUPPRESS) { + var defaultValue = action.defaultValue; + if (typeof action.defaultValue === 'string') { + defaultValue = self._getValue(action, defaultValue); + } + namespace[action.dest] = defaultValue; + } + } + } + }); + + Object.keys(self._defaults).forEach(function (dest) { + namespace[dest] = self._defaults[dest]; + }); + + // parse the arguments and exit if there are any errors + try { + var res = this._parseKnownArgs(args, namespace); + + namespace = res[0]; + args = res[1]; + if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) { + args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]); + delete namespace[c._UNRECOGNIZED_ARGS_ATTR]; + } + return [ namespace, args ]; + } catch (e) { + this.error(e); + } +}; + +ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) { + var self = this; + + var extras = []; + + // replace arg strings that are file references + if (this.fromfilePrefixChars !== null) { + argStrings = this._readArgsFromFiles(argStrings); + } + // map all mutually exclusive arguments to the other arguments + // they can't occur with + // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])' + // though I can't conceive of a way in which an action could be a member + // of two different mutually exclusive groups. + + function actionHash(action) { + // some sort of hashable key for this action + // action itself cannot be a key in actionConflicts + // I think getName() (join of optionStrings) is unique enough + return action.getName(); + } + + var conflicts, key; + var actionConflicts = {}; + + this._mutuallyExclusiveGroups.forEach(function (mutexGroup) { + mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) { + key = actionHash(mutexAction); + if (!$$.has(actionConflicts, key)) { + actionConflicts[key] = []; + } + conflicts = actionConflicts[key]; + conflicts.push.apply(conflicts, groupActions.slice(0, i)); + conflicts.push.apply(conflicts, groupActions.slice(i + 1)); + }); + }); + + // find all option indices, and determine the arg_string_pattern + // which has an 'O' if there is an option at an index, + // an 'A' if there is an argument, or a '-' if there is a '--' + var optionStringIndices = {}; + + var argStringPatternParts = []; + + argStrings.forEach(function (argString, argStringIndex) { + if (argString === '--') { + argStringPatternParts.push('-'); + while (argStringIndex < argStrings.length) { + argStringPatternParts.push('A'); + argStringIndex++; + } + } else { + // otherwise, add the arg to the arg strings + // and note the index if it was an option + var pattern; + var optionTuple = self._parseOptional(argString); + if (!optionTuple) { + pattern = 'A'; + } else { + optionStringIndices[argStringIndex] = optionTuple; + pattern = 'O'; + } + argStringPatternParts.push(pattern); + } + }); + var argStringsPattern = argStringPatternParts.join(''); + + var seenActions = []; + var seenNonDefaultActions = []; + + + function takeAction(action, argumentStrings, optionString) { + seenActions.push(action); + var argumentValues = self._getValues(action, argumentStrings); + + // error if this argument is not allowed with other previously + // seen arguments, assuming that actions that use the default + // value don't really count as "present" + if (argumentValues !== action.defaultValue) { + seenNonDefaultActions.push(action); + if (actionConflicts[actionHash(action)]) { + actionConflicts[actionHash(action)].forEach(function (actionConflict) { + if (seenNonDefaultActions.indexOf(actionConflict) >= 0) { + throw argumentErrorHelper( + action, + format('Not allowed with argument "%s".', actionConflict.getName()) + ); + } + }); + } + } + + if (argumentValues !== c.SUPPRESS) { + action.call(self, namespace, argumentValues, optionString); + } + } + + function consumeOptional(startIndex) { + // get the optional identified at this index + var optionTuple = optionStringIndices[startIndex]; + var action = optionTuple[0]; + var optionString = optionTuple[1]; + var explicitArg = optionTuple[2]; + + // identify additional optionals in the same arg string + // (e.g. -xyz is the same as -x -y -z if no args are required) + var actionTuples = []; + + var args, argCount, start, stop; + + for (;;) { + if (!action) { + extras.push(argStrings[startIndex]); + return startIndex + 1; + } + if (explicitArg) { + argCount = self._matchArgument(action, 'A'); + + // if the action is a single-dash option and takes no + // arguments, try to parse more single-dash options out + // of the tail of the option string + var chars = self.prefixChars; + if (argCount === 0 && chars.indexOf(optionString[1]) < 0) { + actionTuples.push([ action, [], optionString ]); + optionString = optionString[0] + explicitArg[0]; + var newExplicitArg = explicitArg.slice(1) || null; + var optionalsMap = self._optionStringActions; + + if (Object.keys(optionalsMap).indexOf(optionString) >= 0) { + action = optionalsMap[optionString]; + explicitArg = newExplicitArg; + } else { + throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg)); + } + } else if (argCount === 1) { + // if the action expect exactly one argument, we've + // successfully matched the option; exit the loop + stop = startIndex + 1; + args = [ explicitArg ]; + actionTuples.push([ action, args, optionString ]); + break; + } else { + // error if a double-dash option did not use the + // explicit argument + throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg)); + } + } else { + // if there is no explicit argument, try to match the + // optional's string arguments with the following strings + // if successful, exit the loop + + start = startIndex + 1; + var selectedPatterns = argStringsPattern.substr(start); + + argCount = self._matchArgument(action, selectedPatterns); + stop = start + argCount; + + + args = argStrings.slice(start, stop); + + actionTuples.push([ action, args, optionString ]); + break; + } + + } + + // add the Optional to the list and return the index at which + // the Optional's string args stopped + if (actionTuples.length < 1) { + throw new Error('length should be > 0'); + } + for (var i = 0; i < actionTuples.length; i++) { + takeAction.apply(self, actionTuples[i]); + } + return stop; + } + + // the list of Positionals left to be parsed; this is modified + // by consume_positionals() + var positionals = self._getPositionalActions(); + + function consumePositionals(startIndex) { + // match as many Positionals as possible + var selectedPattern = argStringsPattern.substr(startIndex); + var argCounts = self._matchArgumentsPartial(positionals, selectedPattern); + + // slice off the appropriate arg strings for each Positional + // and add the Positional and its args to the list + for (var i = 0; i < positionals.length; i++) { + var action = positionals[i]; + var argCount = argCounts[i]; + if (typeof argCount === 'undefined') { + continue; + } + var args = argStrings.slice(startIndex, startIndex + argCount); + + startIndex += argCount; + takeAction(action, args); + } + + // slice off the Positionals that we just parsed and return the + // index at which the Positionals' string args stopped + positionals = positionals.slice(argCounts.length); + return startIndex; + } + + // consume Positionals and Optionals alternately, until we have + // passed the last option string + var startIndex = 0; + var position; + + var maxOptionStringIndex = -1; + + Object.keys(optionStringIndices).forEach(function (position) { + maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10)); + }); + + var positionalsEndIndex, nextOptionStringIndex; + + while (startIndex <= maxOptionStringIndex) { + // consume any Positionals preceding the next option + nextOptionStringIndex = null; + for (position in optionStringIndices) { + if (!optionStringIndices.hasOwnProperty(position)) { continue; } + + position = parseInt(position, 10); + if (position >= startIndex) { + if (nextOptionStringIndex !== null) { + nextOptionStringIndex = Math.min(nextOptionStringIndex, position); + } else { + nextOptionStringIndex = position; + } + } + } + + if (startIndex !== nextOptionStringIndex) { + positionalsEndIndex = consumePositionals(startIndex); + // only try to parse the next optional if we didn't consume + // the option string during the positionals parsing + if (positionalsEndIndex > startIndex) { + startIndex = positionalsEndIndex; + continue; + } else { + startIndex = positionalsEndIndex; + } + } + + // if we consumed all the positionals we could and we're not + // at the index of an option string, there were extra arguments + if (!optionStringIndices[startIndex]) { + var strings = argStrings.slice(startIndex, nextOptionStringIndex); + extras = extras.concat(strings); + startIndex = nextOptionStringIndex; + } + // consume the next optional and any arguments for it + startIndex = consumeOptional(startIndex); + } + + // consume any positionals following the last Optional + var stopIndex = consumePositionals(startIndex); + + // if we didn't consume all the argument strings, there were extras + extras = extras.concat(argStrings.slice(stopIndex)); + + // if we didn't use all the Positional objects, there were too few + // arg strings supplied. + if (positionals.length > 0) { + self.error('too few arguments'); + } + + // make sure all required actions were present + self._actions.forEach(function (action) { + if (action.required) { + if (seenActions.indexOf(action) < 0) { + self.error(format('Argument "%s" is required', action.getName())); + } + } + }); + + // make sure all required groups have one option present + var actionUsed = false; + self._mutuallyExclusiveGroups.forEach(function (group) { + if (group.required) { + actionUsed = group._groupActions.some(function (action) { + return seenNonDefaultActions.indexOf(action) !== -1; + }); + + // if no actions were used, report the error + if (!actionUsed) { + var names = []; + group._groupActions.forEach(function (action) { + if (action.help !== c.SUPPRESS) { + names.push(action.getName()); + } + }); + names = names.join(' '); + var msg = 'one of the arguments ' + names + ' is required'; + self.error(msg); + } + } + }); + + // return the updated namespace and the extra arguments + return [ namespace, extras ]; +}; + +ArgumentParser.prototype._readArgsFromFiles = function (argStrings) { + // expand arguments referencing files + var self = this; + var fs = require('fs'); + var newArgStrings = []; + argStrings.forEach(function (argString) { + if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) { + // for regular arguments, just add them back into the list + newArgStrings.push(argString); + } else { + // replace arguments referencing files with the file content + try { + var argstrs = []; + var filename = argString.slice(1); + var content = fs.readFileSync(filename, 'utf8'); + content = content.trim().split('\n'); + content.forEach(function (argLine) { + self.convertArgLineToArgs(argLine).forEach(function (arg) { + argstrs.push(arg); + }); + argstrs = self._readArgsFromFiles(argstrs); + }); + newArgStrings.push.apply(newArgStrings, argstrs); + } catch (error) { + return self.error(error.message); + } + } + }); + return newArgStrings; +}; + +ArgumentParser.prototype.convertArgLineToArgs = function (argLine) { + return [ argLine ]; +}; + +ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) { + + // match the pattern for this action to the arg strings + var regexpNargs = new RegExp('^' + this._getNargsPattern(action)); + var matches = regexpArgStrings.match(regexpNargs); + var message; + + // throw an exception if we weren't able to find a match + if (!matches) { + switch (action.nargs) { + /*eslint-disable no-undefined*/ + case undefined: + case null: + message = 'Expected one argument.'; + break; + case c.OPTIONAL: + message = 'Expected at most one argument.'; + break; + case c.ONE_OR_MORE: + message = 'Expected at least one argument.'; + break; + default: + message = 'Expected %s argument(s)'; + } + + throw argumentErrorHelper( + action, + format(message, action.nargs) + ); + } + // return the number of arguments matched + return matches[1].length; +}; + +ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) { + // progressively shorten the actions list by slicing off the + // final actions until we find a match + var self = this; + var result = []; + var actionSlice, pattern, matches; + var i, j; + + function getLength(string) { + return string.length; + } + + for (i = actions.length; i > 0; i--) { + pattern = ''; + actionSlice = actions.slice(0, i); + for (j = 0; j < actionSlice.length; j++) { + pattern += self._getNargsPattern(actionSlice[j]); + } + + pattern = new RegExp('^' + pattern); + matches = regexpArgStrings.match(pattern); + + if (matches && matches.length > 0) { + // need only groups + matches = matches.splice(1); + result = result.concat(matches.map(getLength)); + break; + } + } + + // return the list of arg string counts + return result; +}; + +ArgumentParser.prototype._parseOptional = function (argString) { + var action, optionString, argExplicit, optionTuples; + + // if it's an empty string, it was meant to be a positional + if (!argString) { + return null; + } + + // if it doesn't start with a prefix, it was meant to be positional + if (this.prefixChars.indexOf(argString[0]) < 0) { + return null; + } + + // if the option string is present in the parser, return the action + if (this._optionStringActions[argString]) { + return [ this._optionStringActions[argString], argString, null ]; + } + + // if it's just a single character, it was meant to be positional + if (argString.length === 1) { + return null; + } + + // if the option string before the "=" is present, return the action + if (argString.indexOf('=') >= 0) { + optionString = argString.split('=', 1)[0]; + argExplicit = argString.slice(optionString.length + 1); + + if (this._optionStringActions[optionString]) { + action = this._optionStringActions[optionString]; + return [ action, optionString, argExplicit ]; + } + } + + // search through all possible prefixes of the option string + // and all actions in the parser for possible interpretations + optionTuples = this._getOptionTuples(argString); + + // if multiple actions match, the option string was ambiguous + if (optionTuples.length > 1) { + var optionStrings = optionTuples.map(function (optionTuple) { + return optionTuple[1]; + }); + this.error(format( + 'Ambiguous option: "%s" could match %s.', + argString, optionStrings.join(', ') + )); + // if exactly one action matched, this segmentation is good, + // so return the parsed action + } else if (optionTuples.length === 1) { + return optionTuples[0]; + } + + // if it was not found as an option, but it looks like a negative + // number, it was meant to be positional + // unless there are negative-number-like options + if (argString.match(this._regexpNegativeNumber)) { + if (!this._hasNegativeNumberOptionals.some(Boolean)) { + return null; + } + } + // if it contains a space, it was meant to be a positional + if (argString.search(' ') >= 0) { + return null; + } + + // it was meant to be an optional but there is no such option + // in this parser (though it might be a valid option in a subparser) + return [ null, argString, null ]; +}; + +ArgumentParser.prototype._getOptionTuples = function (optionString) { + var result = []; + var chars = this.prefixChars; + var optionPrefix; + var argExplicit; + var action; + var actionOptionString; + + // option strings starting with two prefix characters are only split at + // the '=' + if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) { + if (optionString.indexOf('=') >= 0) { + var optionStringSplit = optionString.split('=', 1); + + optionPrefix = optionStringSplit[0]; + argExplicit = optionStringSplit[1]; + } else { + optionPrefix = optionString; + argExplicit = null; + } + + for (actionOptionString in this._optionStringActions) { + if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) { + action = this._optionStringActions[actionOptionString]; + result.push([ action, actionOptionString, argExplicit ]); + } + } + + // single character options can be concatenated with their arguments + // but multiple character options always have to have their argument + // separate + } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) { + optionPrefix = optionString; + argExplicit = null; + var optionPrefixShort = optionString.substr(0, 2); + var argExplicitShort = optionString.substr(2); + + for (actionOptionString in this._optionStringActions) { + if (!$$.has(this._optionStringActions, actionOptionString)) continue; + + action = this._optionStringActions[actionOptionString]; + if (actionOptionString === optionPrefixShort) { + result.push([ action, actionOptionString, argExplicitShort ]); + } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) { + result.push([ action, actionOptionString, argExplicit ]); + } + } + + // shouldn't ever get here + } else { + throw new Error(format('Unexpected option string: %s.', optionString)); + } + // return the collected option tuples + return result; +}; + +ArgumentParser.prototype._getNargsPattern = function (action) { + // in all examples below, we have to allow for '--' args + // which are represented as '-' in the pattern + var regexpNargs; + + switch (action.nargs) { + // the default (null) is assumed to be a single argument + case undefined: + case null: + regexpNargs = '(-*A-*)'; + break; + // allow zero or more arguments + case c.OPTIONAL: + regexpNargs = '(-*A?-*)'; + break; + // allow zero or more arguments + case c.ZERO_OR_MORE: + regexpNargs = '(-*[A-]*)'; + break; + // allow one or more arguments + case c.ONE_OR_MORE: + regexpNargs = '(-*A[A-]*)'; + break; + // allow any number of options or arguments + case c.REMAINDER: + regexpNargs = '([-AO]*)'; + break; + // allow one argument followed by any number of options or arguments + case c.PARSER: + regexpNargs = '(-*A[-AO]*)'; + break; + // all others should be integers + default: + regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)'; + } + + // if this is an optional action, -- is not allowed + if (action.isOptional()) { + regexpNargs = regexpNargs.replace(/-\*/g, ''); + regexpNargs = regexpNargs.replace(/-/g, ''); + } + + // return the pattern + return regexpNargs; +}; + +// +// Value conversion methods +// + +ArgumentParser.prototype._getValues = function (action, argStrings) { + var self = this; + + // for everything but PARSER args, strip out '--' + if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) { + argStrings = argStrings.filter(function (arrayElement) { + return arrayElement !== '--'; + }); + } + + var value, argString; + + // optional argument produces a default when not present + if (argStrings.length === 0 && action.nargs === c.OPTIONAL) { + + value = (action.isOptional()) ? action.constant : action.defaultValue; + + if (typeof (value) === 'string') { + value = this._getValue(action, value); + this._checkValue(action, value); + } + + // when nargs='*' on a positional, if there were no command-line + // args, use the default if it is anything other than None + } else if (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE && + action.optionStrings.length === 0) { + + value = (action.defaultValue || argStrings); + this._checkValue(action, value); + + // single argument or optional argument produces a single value + } else if (argStrings.length === 1 && + (!action.nargs || action.nargs === c.OPTIONAL)) { + + argString = argStrings[0]; + value = this._getValue(action, argString); + this._checkValue(action, value); + + // REMAINDER arguments convert all values, checking none + } else if (action.nargs === c.REMAINDER) { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + + // PARSER arguments convert all values, but check only the first + } else if (action.nargs === c.PARSER) { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + this._checkValue(action, value[0]); + + // all other types of nargs produce a list + } else { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + value.forEach(function (v) { + self._checkValue(action, v); + }); + } + + // return the converted value + return value; +}; + +ArgumentParser.prototype._getValue = function (action, argString) { + var result; + + var typeFunction = this._registryGet('type', action.type, action.type); + if (typeof typeFunction !== 'function') { + var message = format('%s is not callable', typeFunction); + throw argumentErrorHelper(action, message); + } + + // convert the value to the appropriate type + try { + result = typeFunction(argString); + + // ArgumentTypeErrors indicate errors + // If action.type is not a registered string, it is a function + // Try to deduce its name for inclusion in the error message + // Failing that, include the error message it raised. + } catch (e) { + var name = null; + if (typeof action.type === 'string') { + name = action.type; + } else { + name = action.type.name || action.type.displayName || ''; + } + var msg = format('Invalid %s value: %s', name, argString); + if (name === '') { msg += '\n' + e.message; } + throw argumentErrorHelper(action, msg); + } + // return the converted value + return result; +}; + +ArgumentParser.prototype._checkValue = function (action, value) { + // converted value must be one of the choices (if specified) + var choices = action.choices; + if (choices) { + // choise for argument can by array or string + if ((typeof choices === 'string' || Array.isArray(choices)) && + choices.indexOf(value) !== -1) { + return; + } + // choise for subparsers can by only hash + if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) { + return; + } + + if (typeof choices === 'string') { + choices = choices.split('').join(', '); + } else if (Array.isArray(choices)) { + choices = choices.join(', '); + } else { + choices = Object.keys(choices).join(', '); + } + var message = format('Invalid choice: %s (choose from [%s])', value, choices); + throw argumentErrorHelper(action, message); + } +}; + +// +// Help formatting methods +// + +/** + * ArgumentParser#formatUsage -> string + * + * Return usage string + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.formatUsage = function () { + var formatter = this._getFormatter(); + formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups); + return formatter.formatHelp(); +}; + +/** + * ArgumentParser#formatHelp -> string + * + * Return help + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.formatHelp = function () { + var formatter = this._getFormatter(); + + // usage + formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups); + + // description + formatter.addText(this.description); + + // positionals, optionals and user-defined groups + this._actionGroups.forEach(function (actionGroup) { + formatter.startSection(actionGroup.title); + formatter.addText(actionGroup.description); + formatter.addArguments(actionGroup._groupActions); + formatter.endSection(); + }); + + // epilog + formatter.addText(this.epilog); + + // determine help from format above + return formatter.formatHelp(); +}; + +ArgumentParser.prototype._getFormatter = function () { + var FormatterClass = this.formatterClass; + var formatter = new FormatterClass({ prog: this.prog }); + return formatter; +}; + +// +// Print functions +// + +/** + * ArgumentParser#printUsage() -> Void + * + * Print usage + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.printUsage = function () { + this._printMessage(this.formatUsage()); +}; + +/** + * ArgumentParser#printHelp() -> Void + * + * Print help + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.printHelp = function () { + this._printMessage(this.formatHelp()); +}; + +ArgumentParser.prototype._printMessage = function (message, stream) { + if (!stream) { + stream = process.stdout; + } + if (message) { + stream.write('' + message); + } +}; + +// +// Exit functions +// + +/** + * ArgumentParser#exit(status=0, message) -> Void + * - status (int): exit status + * - message (string): message + * + * Print message in stderr/stdout and exit program + **/ +ArgumentParser.prototype.exit = function (status, message) { + if (message) { + if (status === 0) { + this._printMessage(message); + } else { + this._printMessage(message, process.stderr); + } + } + + process.exit(status); +}; + +/** + * ArgumentParser#error(message) -> Void + * - err (Error|string): message + * + * Error method Prints a usage message incorporating the message to stderr and + * exits. If you override this in a subclass, + * it should not return -- it should + * either exit or throw an exception. + * + **/ +ArgumentParser.prototype.error = function (err) { + var message; + if (err instanceof Error) { + if (this.debug === true) { + throw err; + } + message = err.message; + } else { + message = err; + } + var msg = format('%s: error: %s', this.prog, message) + c.EOL; + + if (this.debug === true) { + throw new Error(msg); + } + + this.printUsage(process.stderr); + + return this.exit(2, msg); +}; + +module.exports = ArgumentParser; diff --git a/website/www/node_modules/argparse/lib/const.js b/website/www/node_modules/argparse/lib/const.js new file mode 100644 index 000000000000..b1fd4ced4e88 --- /dev/null +++ b/website/www/node_modules/argparse/lib/const.js @@ -0,0 +1,21 @@ +// +// Constants +// + +'use strict'; + +module.exports.EOL = '\n'; + +module.exports.SUPPRESS = '==SUPPRESS=='; + +module.exports.OPTIONAL = '?'; + +module.exports.ZERO_OR_MORE = '*'; + +module.exports.ONE_OR_MORE = '+'; + +module.exports.PARSER = 'A...'; + +module.exports.REMAINDER = '...'; + +module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'; diff --git a/website/www/node_modules/argparse/lib/help/added_formatters.js b/website/www/node_modules/argparse/lib/help/added_formatters.js new file mode 100644 index 000000000000..f8e42998e9bf --- /dev/null +++ b/website/www/node_modules/argparse/lib/help/added_formatters.js @@ -0,0 +1,87 @@ +'use strict'; + +var util = require('util'); + +// Constants +var c = require('../const'); + +var $$ = require('../utils'); +var HelpFormatter = require('./formatter.js'); + +/** + * new RawDescriptionHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...}) + * + * Help message formatter which adds default values to argument help. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + **/ + +function ArgumentDefaultsHelpFormatter(options) { + HelpFormatter.call(this, options); +} + +util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter); + +ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) { + var help = action.help; + if (action.help.indexOf('%(defaultValue)s') === -1) { + if (action.defaultValue !== c.SUPPRESS) { + var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ]; + if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) { + help += ' (default: %(defaultValue)s)'; + } + } + } + return help; +}; + +module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter; + +/** + * new RawDescriptionHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...}) + * + * Help message formatter which retains any formatting in descriptions. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + **/ + +function RawDescriptionHelpFormatter(options) { + HelpFormatter.call(this, options); +} + +util.inherits(RawDescriptionHelpFormatter, HelpFormatter); + +RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) { + var lines = text.split('\n'); + lines = lines.map(function (line) { + return $$.trimEnd(indent + line); + }); + return lines.join('\n'); +}; +module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter; + +/** + * new RawTextHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...}) + * + * Help message formatter which retains formatting of all help text. + * + * Only the name of this class is considered a public API. All the methods + * provided by the class are considered an implementation detail. + **/ + +function RawTextHelpFormatter(options) { + RawDescriptionHelpFormatter.call(this, options); +} + +util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter); + +RawTextHelpFormatter.prototype._splitLines = function (text) { + return text.split('\n'); +}; + +module.exports.RawTextHelpFormatter = RawTextHelpFormatter; diff --git a/website/www/node_modules/argparse/lib/help/formatter.js b/website/www/node_modules/argparse/lib/help/formatter.js new file mode 100644 index 000000000000..29036c14b2e1 --- /dev/null +++ b/website/www/node_modules/argparse/lib/help/formatter.js @@ -0,0 +1,795 @@ +/** + * class HelpFormatter + * + * Formatter for generating usage messages and argument help strings. Only the + * name of this class is considered a public API. All the methods provided by + * the class are considered an implementation detail. + * + * Do not call in your code, use this class only for inherits your own forvatter + * + * ToDo add [additonal formatters][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class + **/ +'use strict'; + +var sprintf = require('sprintf-js').sprintf; + +// Constants +var c = require('../const'); + +var $$ = require('../utils'); + + +/*:nodoc:* internal + * new Support(parent, heding) + * - parent (object): parent section + * - heading (string): header string + * + **/ +function Section(parent, heading) { + this._parent = parent; + this._heading = heading; + this._items = []; +} + +/*:nodoc:* internal + * Section#addItem(callback) -> Void + * - callback (array): tuple with function and args + * + * Add function for single element + **/ +Section.prototype.addItem = function (callback) { + this._items.push(callback); +}; + +/*:nodoc:* internal + * Section#formatHelp(formatter) -> string + * - formatter (HelpFormatter): current formatter + * + * Form help section string + * + **/ +Section.prototype.formatHelp = function (formatter) { + var itemHelp, heading; + + // format the indented section + if (this._parent) { + formatter._indent(); + } + + itemHelp = this._items.map(function (item) { + var obj, func, args; + + obj = formatter; + func = item[0]; + args = item[1]; + return func.apply(obj, args); + }); + itemHelp = formatter._joinParts(itemHelp); + + if (this._parent) { + formatter._dedent(); + } + + // return nothing if the section was empty + if (!itemHelp) { + return ''; + } + + // add the heading if the section was non-empty + heading = ''; + if (this._heading && this._heading !== c.SUPPRESS) { + var currentIndent = formatter.currentIndent; + heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL; + } + + // join the section-initialize newline, the heading and the help + return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]); +}; + +/** + * new HelpFormatter(options) + * + * #### Options: + * - `prog`: program name + * - `indentIncriment`: indent step, default value 2 + * - `maxHelpPosition`: max help position, default value = 24 + * - `width`: line width + * + **/ +var HelpFormatter = module.exports = function HelpFormatter(options) { + options = options || {}; + + this._prog = options.prog; + + this._maxHelpPosition = options.maxHelpPosition || 24; + this._width = (options.width || ((process.env.COLUMNS || 80) - 2)); + + this._currentIndent = 0; + this._indentIncriment = options.indentIncriment || 2; + this._level = 0; + this._actionMaxLength = 0; + + this._rootSection = new Section(null); + this._currentSection = this._rootSection; + + this._whitespaceMatcher = new RegExp('\\s+', 'g'); + this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g'); +}; + +HelpFormatter.prototype._indent = function () { + this._currentIndent += this._indentIncriment; + this._level += 1; +}; + +HelpFormatter.prototype._dedent = function () { + this._currentIndent -= this._indentIncriment; + this._level -= 1; + if (this._currentIndent < 0) { + throw new Error('Indent decreased below 0.'); + } +}; + +HelpFormatter.prototype._addItem = function (func, args) { + this._currentSection.addItem([ func, args ]); +}; + +// +// Message building methods +// + +/** + * HelpFormatter#startSection(heading) -> Void + * - heading (string): header string + * + * Start new help section + * + * See alse [code example][1] + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.startSection = function (heading) { + this._indent(); + var section = new Section(this._currentSection, heading); + var func = section.formatHelp.bind(section); + this._addItem(func, [ this ]); + this._currentSection = section; +}; + +/** + * HelpFormatter#endSection -> Void + * + * End help section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + **/ +HelpFormatter.prototype.endSection = function () { + this._currentSection = this._currentSection._parent; + this._dedent(); +}; + +/** + * HelpFormatter#addText(text) -> Void + * - text (string): plain text + * + * Add plain text into current section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.addText = function (text) { + if (text && text !== c.SUPPRESS) { + this._addItem(this._formatText, [ text ]); + } +}; + +/** + * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void + * - usage (string): usage text + * - actions (array): actions list + * - groups (array): groups list + * - prefix (string): usage prefix + * + * Add usage data into current section + * + * ##### Example + * + * formatter.addUsage(this.usage, this._actions, []); + * return formatter.formatHelp(); + * + **/ +HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) { + if (usage !== c.SUPPRESS) { + this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]); + } +}; + +/** + * HelpFormatter#addArgument(action) -> Void + * - action (object): action + * + * Add argument into current section + * + * Single variant of [[HelpFormatter#addArguments]] + **/ +HelpFormatter.prototype.addArgument = function (action) { + if (action.help !== c.SUPPRESS) { + var self = this; + + // find all invocations + var invocations = [ this._formatActionInvocation(action) ]; + var invocationLength = invocations[0].length; + + var actionLength; + + if (action._getSubactions) { + this._indent(); + action._getSubactions().forEach(function (subaction) { + + var invocationNew = self._formatActionInvocation(subaction); + invocations.push(invocationNew); + invocationLength = Math.max(invocationLength, invocationNew.length); + + }); + this._dedent(); + } + + // update the maximum item length + actionLength = invocationLength + this._currentIndent; + this._actionMaxLength = Math.max(this._actionMaxLength, actionLength); + + // add the item to the list + this._addItem(this._formatAction, [ action ]); + } +}; + +/** + * HelpFormatter#addArguments(actions) -> Void + * - actions (array): actions list + * + * Mass add arguments into current section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.addArguments = function (actions) { + var self = this; + actions.forEach(function (action) { + self.addArgument(action); + }); +}; + +// +// Help-formatting methods +// + +/** + * HelpFormatter#formatHelp -> string + * + * Format help + * + * ##### Example + * + * formatter.addText(this.epilog); + * return formatter.formatHelp(); + * + **/ +HelpFormatter.prototype.formatHelp = function () { + var help = this._rootSection.formatHelp(this); + if (help) { + help = help.replace(this._longBreakMatcher, c.EOL + c.EOL); + help = $$.trimChars(help, c.EOL) + c.EOL; + } + return help; +}; + +HelpFormatter.prototype._joinParts = function (partStrings) { + return partStrings.filter(function (part) { + return (part && part !== c.SUPPRESS); + }).join(''); +}; + +HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) { + if (!prefix && typeof prefix !== 'string') { + prefix = 'usage: '; + } + + actions = actions || []; + groups = groups || []; + + + // if usage is specified, use that + if (usage) { + usage = sprintf(usage, { prog: this._prog }); + + // if no optionals or positionals are available, usage is just prog + } else if (!usage && actions.length === 0) { + usage = this._prog; + + // if optionals and positionals are available, calculate usage + } else if (!usage) { + var prog = this._prog; + var optionals = []; + var positionals = []; + var actionUsage; + var textWidth; + + // split optionals from positionals + actions.forEach(function (action) { + if (action.isOptional()) { + optionals.push(action); + } else { + positionals.push(action); + } + }); + + // build full usage string + actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups); + usage = [ prog, actionUsage ].join(' '); + + // wrap the usage parts if it's too long + textWidth = this._width - this._currentIndent; + if ((prefix.length + usage.length) > textWidth) { + + // break usage into wrappable parts + var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g'); + var optionalUsage = this._formatActionsUsage(optionals, groups); + var positionalUsage = this._formatActionsUsage(positionals, groups); + + + var optionalParts = optionalUsage.match(regexpPart); + var positionalParts = positionalUsage.match(regexpPart) || []; + + if (optionalParts.join(' ') !== optionalUsage) { + throw new Error('assert "optionalParts.join(\' \') === optionalUsage"'); + } + if (positionalParts.join(' ') !== positionalUsage) { + throw new Error('assert "positionalParts.join(\' \') === positionalUsage"'); + } + + // helper for wrapping lines + /*eslint-disable func-style*/ // node 0.10 compat + var _getLines = function (parts, indent, prefix) { + var lines = []; + var line = []; + + var lineLength = prefix ? prefix.length - 1 : indent.length - 1; + + parts.forEach(function (part) { + if (lineLength + 1 + part.length > textWidth) { + lines.push(indent + line.join(' ')); + line = []; + lineLength = indent.length - 1; + } + line.push(part); + lineLength += part.length + 1; + }); + + if (line) { + lines.push(indent + line.join(' ')); + } + if (prefix) { + lines[0] = lines[0].substr(indent.length); + } + return lines; + }; + + var lines, indent, parts; + // if prog is short, follow it with optionals or positionals + if (prefix.length + prog.length <= 0.75 * textWidth) { + indent = $$.repeat(' ', (prefix.length + prog.length + 1)); + if (optionalParts) { + lines = [].concat( + _getLines([ prog ].concat(optionalParts), indent, prefix), + _getLines(positionalParts, indent) + ); + } else if (positionalParts) { + lines = _getLines([ prog ].concat(positionalParts), indent, prefix); + } else { + lines = [ prog ]; + } + + // if prog is long, put it on its own line + } else { + indent = $$.repeat(' ', prefix.length); + parts = optionalParts.concat(positionalParts); + lines = _getLines(parts, indent); + if (lines.length > 1) { + lines = [].concat( + _getLines(optionalParts, indent), + _getLines(positionalParts, indent) + ); + } + lines = [ prog ].concat(lines); + } + // join lines into usage + usage = lines.join(c.EOL); + } + } + + // prefix with 'usage:' + return prefix + usage + c.EOL + c.EOL; +}; + +HelpFormatter.prototype._formatActionsUsage = function (actions, groups) { + // find group indices and identify actions in groups + var groupActions = []; + var inserts = []; + var self = this; + + groups.forEach(function (group) { + var end; + var i; + + var start = actions.indexOf(group._groupActions[0]); + if (start >= 0) { + end = start + group._groupActions.length; + + //if (actions.slice(start, end) === group._groupActions) { + if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) { + group._groupActions.forEach(function (action) { + groupActions.push(action); + }); + + if (!group.required) { + if (inserts[start]) { + inserts[start] += ' ['; + } else { + inserts[start] = '['; + } + inserts[end] = ']'; + } else { + if (inserts[start]) { + inserts[start] += ' ('; + } else { + inserts[start] = '('; + } + inserts[end] = ')'; + } + for (i = start + 1; i < end; i += 1) { + inserts[i] = '|'; + } + } + } + }); + + // collect all actions format strings + var parts = []; + + actions.forEach(function (action, actionIndex) { + var part; + var optionString; + var argsDefault; + var argsString; + + // suppressed arguments are marked with None + // remove | separators for suppressed arguments + if (action.help === c.SUPPRESS) { + parts.push(null); + if (inserts[actionIndex] === '|') { + inserts.splice(actionIndex, actionIndex); + } else if (inserts[actionIndex + 1] === '|') { + inserts.splice(actionIndex + 1, actionIndex + 1); + } + + // produce all arg strings + } else if (!action.isOptional()) { + part = self._formatArgs(action, action.dest); + + // if it's in a group, strip the outer [] + if (groupActions.indexOf(action) >= 0) { + if (part[0] === '[' && part[part.length - 1] === ']') { + part = part.slice(1, -1); + } + } + // add the action string to the list + parts.push(part); + + // produce the first way to invoke the option in brackets + } else { + optionString = action.optionStrings[0]; + + // if the Optional doesn't take a value, format is: -s or --long + if (action.nargs === 0) { + part = '' + optionString; + + // if the Optional takes a value, format is: -s ARGS or --long ARGS + } else { + argsDefault = action.dest.toUpperCase(); + argsString = self._formatArgs(action, argsDefault); + part = optionString + ' ' + argsString; + } + // make it look optional if it's not required or in a group + if (!action.required && groupActions.indexOf(action) < 0) { + part = '[' + part + ']'; + } + // add the action string to the list + parts.push(part); + } + }); + + // insert things at the necessary indices + for (var i = inserts.length - 1; i >= 0; --i) { + if (inserts[i] !== null) { + parts.splice(i, 0, inserts[i]); + } + } + + // join all the action items with spaces + var text = parts.filter(function (part) { + return !!part; + }).join(' '); + + // clean up separators for mutually exclusive groups + text = text.replace(/([\[(]) /g, '$1'); // remove spaces + text = text.replace(/ ([\])])/g, '$1'); + text = text.replace(/\[ *\]/g, ''); // remove empty groups + text = text.replace(/\( *\)/g, ''); + text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups + + text = text.trim(); + + // return the text + return text; +}; + +HelpFormatter.prototype._formatText = function (text) { + text = sprintf(text, { prog: this._prog }); + var textWidth = this._width - this._currentIndent; + var indentIncriment = $$.repeat(' ', this._currentIndent); + return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL; +}; + +HelpFormatter.prototype._formatAction = function (action) { + var self = this; + + var helpText; + var helpLines; + var parts; + var indentFirst; + + // determine the required width and the entry label + var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition); + var helpWidth = this._width - helpPosition; + var actionWidth = helpPosition - this._currentIndent - 2; + var actionHeader = this._formatActionInvocation(action); + + // no help; start on same line and add a final newline + if (!action.help) { + actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL; + + // short action name; start on the same line and pad two spaces + } else if (actionHeader.length <= actionWidth) { + actionHeader = $$.repeat(' ', this._currentIndent) + + actionHeader + + ' ' + + $$.repeat(' ', actionWidth - actionHeader.length); + indentFirst = 0; + + // long action name; start on the next line + } else { + actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL; + indentFirst = helpPosition; + } + + // collect the pieces of the action help + parts = [ actionHeader ]; + + // if there was help for the action, add lines of help text + if (action.help) { + helpText = this._expandHelp(action); + helpLines = this._splitLines(helpText, helpWidth); + parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL); + helpLines.slice(1).forEach(function (line) { + parts.push($$.repeat(' ', helpPosition) + line + c.EOL); + }); + + // or add a newline if the description doesn't end with one + } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) { + parts.push(c.EOL); + } + // if there are any sub-actions, add their help as well + if (action._getSubactions) { + this._indent(); + action._getSubactions().forEach(function (subaction) { + parts.push(self._formatAction(subaction)); + }); + this._dedent(); + } + // return a single string + return this._joinParts(parts); +}; + +HelpFormatter.prototype._formatActionInvocation = function (action) { + if (!action.isOptional()) { + var format_func = this._metavarFormatter(action, action.dest); + var metavars = format_func(1); + return metavars[0]; + } + + var parts = []; + var argsDefault; + var argsString; + + // if the Optional doesn't take a value, format is: -s, --long + if (action.nargs === 0) { + parts = parts.concat(action.optionStrings); + + // if the Optional takes a value, format is: -s ARGS, --long ARGS + } else { + argsDefault = action.dest.toUpperCase(); + argsString = this._formatArgs(action, argsDefault); + action.optionStrings.forEach(function (optionString) { + parts.push(optionString + ' ' + argsString); + }); + } + return parts.join(', '); +}; + +HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) { + var result; + + if (action.metavar || action.metavar === '') { + result = action.metavar; + } else if (action.choices) { + var choices = action.choices; + + if (typeof choices === 'string') { + choices = choices.split('').join(', '); + } else if (Array.isArray(choices)) { + choices = choices.join(','); + } else { + choices = Object.keys(choices).join(','); + } + result = '{' + choices + '}'; + } else { + result = metavarDefault; + } + + return function (size) { + if (Array.isArray(result)) { + return result; + } + + var metavars = []; + for (var i = 0; i < size; i += 1) { + metavars.push(result); + } + return metavars; + }; +}; + +HelpFormatter.prototype._formatArgs = function (action, metavarDefault) { + var result; + var metavars; + + var buildMetavar = this._metavarFormatter(action, metavarDefault); + + switch (action.nargs) { + /*eslint-disable no-undefined*/ + case undefined: + case null: + metavars = buildMetavar(1); + result = '' + metavars[0]; + break; + case c.OPTIONAL: + metavars = buildMetavar(1); + result = '[' + metavars[0] + ']'; + break; + case c.ZERO_OR_MORE: + metavars = buildMetavar(2); + result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]'; + break; + case c.ONE_OR_MORE: + metavars = buildMetavar(2); + result = '' + metavars[0] + ' [' + metavars[1] + ' ...]'; + break; + case c.REMAINDER: + result = '...'; + break; + case c.PARSER: + metavars = buildMetavar(1); + result = metavars[0] + ' ...'; + break; + default: + metavars = buildMetavar(action.nargs); + result = metavars.join(' '); + } + return result; +}; + +HelpFormatter.prototype._expandHelp = function (action) { + var params = { prog: this._prog }; + + Object.keys(action).forEach(function (actionProperty) { + var actionValue = action[actionProperty]; + + if (actionValue !== c.SUPPRESS) { + params[actionProperty] = actionValue; + } + }); + + if (params.choices) { + if (typeof params.choices === 'string') { + params.choices = params.choices.split('').join(', '); + } else if (Array.isArray(params.choices)) { + params.choices = params.choices.join(', '); + } else { + params.choices = Object.keys(params.choices).join(', '); + } + } + + return sprintf(this._getHelpString(action), params); +}; + +HelpFormatter.prototype._splitLines = function (text, width) { + var lines = []; + var delimiters = [ ' ', '.', ',', '!', '?' ]; + var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$'); + + text = text.replace(/[\n\|\t]/g, ' '); + + text = text.trim(); + text = text.replace(this._whitespaceMatcher, ' '); + + // Wraps the single paragraph in text (a string) so every line + // is at most width characters long. + text.split(c.EOL).forEach(function (line) { + if (width >= line.length) { + lines.push(line); + return; + } + + var wrapStart = 0; + var wrapEnd = width; + var delimiterIndex = 0; + while (wrapEnd <= line.length) { + if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) { + delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index; + wrapEnd = wrapStart + delimiterIndex + 1; + } + lines.push(line.substring(wrapStart, wrapEnd)); + wrapStart = wrapEnd; + wrapEnd += width; + } + if (wrapStart < line.length) { + lines.push(line.substring(wrapStart, wrapEnd)); + } + }); + + return lines; +}; + +HelpFormatter.prototype._fillText = function (text, width, indent) { + var lines = this._splitLines(text, width); + lines = lines.map(function (line) { + return indent + line; + }); + return lines.join(c.EOL); +}; + +HelpFormatter.prototype._getHelpString = function (action) { + return action.help; +}; diff --git a/website/www/node_modules/argparse/lib/namespace.js b/website/www/node_modules/argparse/lib/namespace.js new file mode 100644 index 000000000000..a860de9ecc48 --- /dev/null +++ b/website/www/node_modules/argparse/lib/namespace.js @@ -0,0 +1,76 @@ +/** + * class Namespace + * + * Simple object for storing attributes. Implements equality by attribute names + * and values, and provides a simple string representation. + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object + **/ +'use strict'; + +var $$ = require('./utils'); + +/** + * new Namespace(options) + * - options(object): predefined propertis for result object + * + **/ +var Namespace = module.exports = function Namespace(options) { + $$.extend(this, options); +}; + +/** + * Namespace#isset(key) -> Boolean + * - key (string|number): property name + * + * Tells whenever `namespace` contains given `key` or not. + **/ +Namespace.prototype.isset = function (key) { + return $$.has(this, key); +}; + +/** + * Namespace#set(key, value) -> self + * -key (string|number|object): propery name + * -value (mixed): new property value + * + * Set the property named key with value. + * If key object then set all key properties to namespace object + **/ +Namespace.prototype.set = function (key, value) { + if (typeof (key) === 'object') { + $$.extend(this, key); + } else { + this[key] = value; + } + return this; +}; + +/** + * Namespace#get(key, defaultValue) -> mixed + * - key (string|number): property name + * - defaultValue (mixed): default value + * + * Return the property key or defaulValue if not set + **/ +Namespace.prototype.get = function (key, defaultValue) { + return !this[key] ? defaultValue : this[key]; +}; + +/** + * Namespace#unset(key, defaultValue) -> mixed + * - key (string|number): property name + * - defaultValue (mixed): default value + * + * Return data[key](and delete it) or defaultValue + **/ +Namespace.prototype.unset = function (key, defaultValue) { + var value = this[key]; + if (value !== null) { + delete this[key]; + return value; + } + return defaultValue; +}; diff --git a/website/www/node_modules/argparse/lib/utils.js b/website/www/node_modules/argparse/lib/utils.js new file mode 100644 index 000000000000..4a9cf3edb615 --- /dev/null +++ b/website/www/node_modules/argparse/lib/utils.js @@ -0,0 +1,57 @@ +'use strict'; + +exports.repeat = function (str, num) { + var result = ''; + for (var i = 0; i < num; i++) { result += str; } + return result; +}; + +exports.arrayEqual = function (a, b) { + if (a.length !== b.length) { return false; } + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { return false; } + } + return true; +}; + +exports.trimChars = function (str, chars) { + var start = 0; + var end = str.length - 1; + while (chars.indexOf(str.charAt(start)) >= 0) { start++; } + while (chars.indexOf(str.charAt(end)) >= 0) { end--; } + return str.slice(start, end + 1); +}; + +exports.capitalize = function (str) { + return str.charAt(0).toUpperCase() + str.slice(1); +}; + +exports.arrayUnion = function () { + var result = []; + for (var i = 0, values = {}; i < arguments.length; i++) { + var arr = arguments[i]; + for (var j = 0; j < arr.length; j++) { + if (!values[arr[j]]) { + values[arr[j]] = true; + result.push(arr[j]); + } + } + } + return result; +}; + +function has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +exports.has = has; + +exports.extend = function (dest, src) { + for (var i in src) { + if (has(src, i)) { dest[i] = src[i]; } + } +}; + +exports.trimEnd = function (str) { + return str.replace(/\s+$/g, ''); +}; diff --git a/website/www/node_modules/argparse/package.json b/website/www/node_modules/argparse/package.json new file mode 100644 index 000000000000..62fba0a9fcfc --- /dev/null +++ b/website/www/node_modules/argparse/package.json @@ -0,0 +1,34 @@ +{ + "name": "argparse", + "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library", + "version": "1.0.10", + "keywords": [ + "cli", + "parser", + "argparse", + "option", + "args" + ], + "contributors": [ + "Eugene Shkuropat", + "Paul Jacobson" + ], + "files": [ + "index.js", + "lib/" + ], + "license": "MIT", + "repository": "nodeca/argparse", + "scripts": { + "test": "make test" + }, + "dependencies": { + "sprintf-js": "~1.0.2" + }, + "devDependencies": { + "eslint": "^2.13.1", + "istanbul": "^0.4.5", + "mocha": "^3.1.0", + "ndoc": "^5.0.1" + } +} diff --git a/website/www/node_modules/array-union/index.d.ts b/website/www/node_modules/array-union/index.d.ts new file mode 100644 index 000000000000..379fc1d2f5bd --- /dev/null +++ b/website/www/node_modules/array-union/index.d.ts @@ -0,0 +1,25 @@ +/** +Create an array of unique values, in order, from the input arrays. + +@example +``` +import arrayUnion = require('array-union'); + +arrayUnion([1, 1, 2, 3], [2, 3]); +//=> [1, 2, 3] + +arrayUnion(['foo', 'foo', 'bar']); +//=> ['foo', 'bar'] + +arrayUnion(['🐱', '🦄', '🐻'], ['🦄', '🌈']); +//=> ['🐱', '🦄', '🐻', '🌈'] + +arrayUnion(['🐱', '🦄'], ['🐻', '🦄'], ['🐶', '🌈', '🌈']); +//=> ['🐱', '🦄', '🐻', '🐶', '🌈'] +``` +*/ +declare function arrayUnion( + ...arguments: readonly ArgumentsType[] +): ArgumentsType; + +export = arrayUnion; diff --git a/website/www/node_modules/array-union/index.js b/website/www/node_modules/array-union/index.js new file mode 100644 index 000000000000..7f85d3d193ab --- /dev/null +++ b/website/www/node_modules/array-union/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = (...arguments_) => { + return [...new Set([].concat(...arguments_))]; +}; diff --git a/website/www/node_modules/array-union/license b/website/www/node_modules/array-union/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/array-union/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/array-union/package.json b/website/www/node_modules/array-union/package.json new file mode 100644 index 000000000000..5ad5afa71209 --- /dev/null +++ b/website/www/node_modules/array-union/package.json @@ -0,0 +1,38 @@ +{ + "name": "array-union", + "version": "2.1.0", + "description": "Create an array of unique values, in order, from the input arrays", + "license": "MIT", + "repository": "sindresorhus/array-union", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "array", + "set", + "uniq", + "unique", + "duplicate", + "remove", + "union", + "combine", + "merge" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/website/www/node_modules/array-union/readme.md b/website/www/node_modules/array-union/readme.md new file mode 100644 index 000000000000..2474a1aed16d --- /dev/null +++ b/website/www/node_modules/array-union/readme.md @@ -0,0 +1,34 @@ +# array-union [![Build Status](https://travis-ci.org/sindresorhus/array-union.svg?branch=master)](https://travis-ci.org/sindresorhus/array-union) + +> Create an array of unique values, in order, from the input arrays + + +## Install + +``` +$ npm install array-union +``` + + +## Usage + +```js +const arrayUnion = require('array-union'); + +arrayUnion([1, 1, 2, 3], [2, 3]); +//=> [1, 2, 3] + +arrayUnion(['foo', 'foo', 'bar']); +//=> ['foo', 'bar'] + +arrayUnion(['🐱', '🦄', '🐻'], ['🦄', '🌈']); +//=> ['🐱', '🦄', '🐻', '🌈'] + +arrayUnion(['🐱', '🦄'], ['🐻', '🦄'], ['🐶', '🌈', '🌈']); +//=> ['🐱', '🦄', '🐻', '🐶', '🌈'] +``` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/website/www/node_modules/at-least-node/LICENSE b/website/www/node_modules/at-least-node/LICENSE new file mode 100644 index 000000000000..5e29ccc5eeed --- /dev/null +++ b/website/www/node_modules/at-least-node/LICENSE @@ -0,0 +1,6 @@ +The ISC License +Copyright (c) 2020 Ryan Zimmerman + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/website/www/node_modules/at-least-node/README.md b/website/www/node_modules/at-least-node/README.md new file mode 100644 index 000000000000..fd6e51468235 --- /dev/null +++ b/website/www/node_modules/at-least-node/README.md @@ -0,0 +1,25 @@ +# at-least-node + +![npm](https://img.shields.io/npm/v/at-least-node) +![node](https://img.shields.io/node/v/at-least-node) +![NPM](https://img.shields.io/npm/l/at-least-node) + +Sometimes you need to check if you're on _at least_ a given Node.js version, but you don't want to pull in the whole [`semver`](https://www.npmjs.com/package/semver) kitchen sink. That's what `at-least-node` is for. + +| Package | Size | +| --------------- | ------- | +| `at-least-node` | 2.6 kB | +| `semver` | 75.5 kB | + +```js +const atLeastNode = require('at-least-node') +atLeastNode('10.12.0') +// -> true on Node 10.12.0+, false on anything below that +``` + +When passing in a version string: + +- You cannot include a leading `v` (i.e. `v10.12.0`) +- You cannot omit sections (i.e. `10.12`) +- You cannot use pre-releases (i.e. `1.0.0-beta`) +- There is no input validation, if you make a mistake, the resulting behavior is undefined diff --git a/website/www/node_modules/at-least-node/index.js b/website/www/node_modules/at-least-node/index.js new file mode 100644 index 000000000000..974a2fa8542a --- /dev/null +++ b/website/www/node_modules/at-least-node/index.js @@ -0,0 +1,5 @@ +module.exports = r => { + const n = process.versions.node.split('.').map(x => parseInt(x, 10)) + r = r.split('.').map(x => parseInt(x, 10)) + return n[0] > r[0] || (n[0] === r[0] && (n[1] > r[1] || (n[1] === r[1] && n[2] >= r[2]))) +} diff --git a/website/www/node_modules/at-least-node/package.json b/website/www/node_modules/at-least-node/package.json new file mode 100644 index 000000000000..2c13641f9c26 --- /dev/null +++ b/website/www/node_modules/at-least-node/package.json @@ -0,0 +1,32 @@ +{ + "name": "at-least-node", + "version": "1.0.0", + "description": "Lightweight Node.js version sniffing/comparison", + "keywords": [ + "semver", + "feature" + ], + "homepage": "https://github.com/RyanZim/at-least-node#readme", + "bugs": { + "url": "https://github.com/RyanZim/at-least-node/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/RyanZim/at-least-node.git" + }, + "license": "ISC", + "author": "Ryan Zimmerman ", + "main": "index.js", + "files": [], + "scripts": { + "test": "ava" + }, + "devDependencies": { + "ava": "^3.1.0", + "rewire": "^4.0.1", + "semver": "^7.1.2" + }, + "engines": { + "node": ">= 4.0.0" + } +} diff --git a/website/www/node_modules/autoprefixer/CHANGELOG.md b/website/www/node_modules/autoprefixer/CHANGELOG.md new file mode 100644 index 000000000000..afdbba334451 --- /dev/null +++ b/website/www/node_modules/autoprefixer/CHANGELOG.md @@ -0,0 +1,962 @@ +# Change Log +This project adheres to [Semantic Versioning](http://semver.org/). + +## 9.7.6 +* Revert `-webkit-stretch` fix. + +## 9.7.5 +* Fix `-webkit-stretch` support. + +## 9.7.4 +* Fix warning text (by Dmitry Ishkov). + +## 9.7.3 +* Fix compatibility with PostCSS Modules. + +## 9.7.2 +* Add `-ms-user-select: element` support. +* Add funding link for `npm fund`. + +## 9.7.1 +* Avoid unnecessary transitions in prefixed selectors (by Andrey Alexandrov). +* Fix `fit-content` for Firefox. + +## 9.7 “Ad Victoriam” +* Add `AUTOPREFIXER_GRID` env variable to enable Grid Layout polyfill for IE. +* Fix `Cannot read property 'grid' of undefined` error. + +## 9.6.5 +* Fix selector prefixing (by Andrey Alexandrov). + +## 9.6.4 +* Now the real fix for `'startsWith' of undefined` error. + +## 9.6.3 +* Fix `Cannot read property 'startsWith' of undefined` error. + +## 9.6.2 +* Fix false `Replace fill to stretch` warning. + +## 9.6.1 +* Fix `-webkit-line-clamp` truncating multi-line text support. + +## 9.6 “Nunc id vides, nunc ne vides” +* Show warning about Browserslist config on `browser` option. +* Add warning-less `overrideBrowserslist` option. +* Add `text-orientation` support. +* Add `min-resolution: 2x` alias support. +* Add `.github/CONTRIBUTING.md` (by Juan Martin Marco). + +## 9.5.1 +* Fix `backdrop-filter` for Edge (by Oleh Aloshkin). +* Fix `min-resolution` media query support in Firefox < 16. + +## 9.5 “Draco dormiens nunquam titillandus” +* Add `mask-composite` support (by Semen Levenson). + +## 9.4.10 +* Add warning for named Grid rows. + +## 9.4.9 +* Fix `grid-template` and `@media` case (by Bogdan Dolin). + +## 9.4.8 +* Fix `calc()` support in Grid gap. + +## 9.4.7 +* Fix infinite loop on mismatched parens. + +## 9.4.6 +* Fix warning text (by Albert Juhé Lluveras). + +## 9.4.5 +* Fix `text-decoration-skip-ink` support. + +## 9.4.4 +* Use `direction` value for `-ms-writing-mode` (by Denys Kniazevych). +* Fix warning text (by @zzzzBov). + +## 9.4.3 +* Add warning to force `flex-start` instead of `start` (by Antoine du Hamel). +* Fix docs (by Christian Oliff). + +## 9.4.2 +* Fix Grid autoplacement warning. + +## 9.4.1 +* Fix unnecessary Flexbox prefixes in Grid elements. + +## 9.4 “Advance Australia” +* Add Grid autoplacement for `-ms-` (by Bogdan Dolin). +* Improve docs and warnings (by Daniel Tonon). +* Remove some unnecessary warnings for Grid (by Andrey Alexandrov). + +## 9.3.1 +* Fix Grid prefixes with `repeat()` value (by Bogdan Dolin). + +## 9.3 “Labor omnia vincit” +* Add `place-self` support (by Bogdan Dolin). +* Fix Grid row/column span inheritance bug (by Bogdan Dolin). + +## 9.2.1 +* Fix broken AST. + +## 9.2 “Onyi est glavnaya krepost” +* Add `/* autoprefixer grid: on */` control comment (by Andrey Alexandrov). +* Add duplicate `grid-area` support (by Bogdan Dolin). +* Fix `grid-gap` support for rules with different specifity (by Bogdan Dolin). +* Disable Grid in `@supports` at-rule with non-supported Grid features. +* Improve Grid warnings (by Daniel Tonon). +* Improve docs (by Joshua Hall, Mat Gadd, Roy Revelt, and Ivan). + +## 9.1.5 +* Remove `@babel/register` from dependencies. + +## 9.1.4 +* Use Babel 7. + +## 9.1.3 +* Sort properties in `autoprefixer --info` alphabetically. +* Fix old Firefox gradient prefix. + +## 9.1.2 +* Fix `autoprefixer --info` in new Node.js. + +## 9.1.1 +* Retain `grid-gap` through `@media` (by Bogdan Dolin). +* Fix `grid-template` and `@media` (by Bogdan Dolin). +* Fix Grid areas searching error (by Bogdan Dolin). +* Fix `span X` Grid prefix (by Bogdan Dolin). +* Fix docs (by Eduard Kyvenko). + +## 9.1 “Equality before the law” +* Add `background-clip: text` support. +* Fix adding Grid span for IE (by Bogdan Dolin). + +## 9.0.2 +* Show warning on Grid area names conflict (by Bogdan Dolin). +* Fix documentation (by Sven Wagner). + +## 9.0.1 +* Fix nested at-rules in Grid prefixes (by Ivan Malov). + +## 9.0 “A Mari Usque Ad Mare” +* Remove Node.js 9 and Node.js 4 support. +* Remove IE and “dead” browsers from Babel. +* Use PostCSS 7.0. +* Use Browserslist 4.0. + +## 8.6.5 +* Do not show Grid warnings if IE was not selected. + +## 8.6.4 +* Fix `stretch` prefix in Chrome >= 46. + +## 8.6.3 +* Add warnings for unsupported Grid features. +* Add warnings about wrong Grid properties. +* Add note about `grid` option for grid properties in `autoprefixer --info`. + +## 8.6.2 +* Fix error during adding Grid prefixes in `@media` (by Evgeny Petukhov). + +## 8.6.1 +* Fix `grid-template` with media queries (by Evgeny Petukhov). + +## 8.6 “Follow Reason” +* Add `gap` support (by Evgeny Petukhov). +* Add two values support for `grid-gap` and `gap` (by Evgeny Petukhov). +* Add `ignoreUnknownVersions` option for Browserslist. + +## 8.5.2 +* Fix `grid-template` support wit auto row sizes (by Yury Timofeev). + +## 8.5.1 +* Remove unnecessary warning on `-webkit-fill-available`. + +## 8.5 “Muito Nobre e Sempre Leal” +* Add `grid-gap` support (by Evgeny Petukhov). +* Fix radial gradients direction fix. +* Fix docs (by Phani Kandula and Huáng Jùnliàng). + +## 8.4.1 +* Fix working in old PostCSS versions (by Diablohu). + +## 8.4 “Non in aves, sed in angues” +* Add `/* autoprefixer: ignore next */` control comment (by Pavel Vostrikov). + +## 8.3 “Benigno Numine” +* Add `@media` support to `grid-template` (by Evgeny Petukhov). +* Fix `radial-gradient` direction warning (by Gustavo Real). + +## 8.2 “Ad Astra per Aspera” +* Add `color-adjust` (by Sergey Lysenko, Stanislav Botev, and Yuriy Alekseyev). + +## 8.1 “Rex, Familia et Ultio” +* Add `overscroll-behavior` support. +* Add `grid-template` shortcut support (by Evgeny Petukhov). +* Add better `grid-column-end` and `grid-row-end` support (by Evgeny Petukhov). +* Fix Grid properties support in `@supports`. + +## 8.0 “Excelsior” +* Use Browserslist 3.0. +* Rename `autoprefixer-info` CLI tool to `autoprefixer --info`. +* Remove `break-*` to `page-break-*` conversion for Firefox. + +## 7.2.6 +* Fix `-ms-` prefix for grid cells with same `grid-area` (by Evgeny Petukhov). + +## 7.2.5 +* Fix multiple prefixes in declaration value. + +## 7.2.4 +* Fix IE 10 support. + +## 7.2.3 +* Fix `grid-template-areas` in `@media` (by Evgeny Petukhov). + +## 7.2.2 +* Fix `_autoprefixerDisabled is undefined` issue. + +## 7.2.1 +* Fix IE and other old JS runtimes support. + +## 7.2 “Ordem e Progresso” +* Add `grid-template-areas` support (by Evgeny Petukhov). +* Add `grid-template` support (by Evgeny Petukhov). +* Add `grid-area` support (by Alexey Komarov). +* Add `autoprefixer-info` CLI tool. +* Add wrong `radial-gradient` properties warning. +* Use current working dir on missed `from` in `info()` (by Phil Dokas). +* Fix `grid-row` and `grid-column` support (by Alexey Komarov). +* Do not prefix `reverse` animation direction. +* Improve test coverage (by Dmitry Semigradsky). + +## 7.1.6 +* Add warning for using `browserslist` option instead of `browsers`. +* Add warning for multiple control comments in the same scope. +* Fix `Invalid array length` error during indent changes. + +## 7.1.5 +* Fix `::placeholder` prefix for Edge. +* Fix `inherit`/`initial`/`unset` values for `flex-direction`. +* Fix RegExp usage in gradients (by Yet Another Minion). + +## 7.1.4 +* Fix `radial-gradient` direction conversion. +* Fix `image-set` in `cursor`. + +## 7.1.3 +* Add warning for old `radial-gradient` direction syntax. + +## 7.1.2 +* Fix `text-decoration` shortcut support. + +## 7.1.1 +* Remove non-`-webkit-` intrinsic prefixes in Grid Layout (by 一丝). + +## 7.1 “Universitas litterarum” +* Add `unicode-bidi` support. +* Add `-webkit-appearance` support for Edge. +* Add `from` option to `info()`. +* Fix intrinsic widths prefixes in Grid Layout. + +## 7.0.1 +* Fix Autoprefixer for old JS runtimes. + +## 7.0 “Coelestem adspicit lucem” +* Remove node.js 0.12 support. +* Use PostCSS 6.0. +* Use Browserslist 2. +* Use `caniuse-lite` instead of `caniuse-db` (by Ben Briggs). +* Use `^` for Browserslist dependencies, instead of `~`. +* Rewrite project from CoffeeScript to Babel (by Dmitry Semigradsky). +* Disable Grid Layout prefixes for IE by default. +* Fix `-ms-grid-column-align`. +* Move tests to Jest. + +## 6.7.7 +* Fix `order` for non-digit values. + +## 6.7.6 +* Fix `font-kerning` (by Chi Vinh Le). + +## 6.7.5 +* Fix `text-decoration-skip` in iOS (by Chi Vinh Le). +* Fix `clip-path` (by Chi Vinh Le). + +## 6.7.4 +* Improve `browsers` option perfomance. +* Update CoffeeScript compiler. + +## 6.7.3 +* Fix compatibility with “Intrinsic & Extrinsic Sizing” spec update. + +## 6.7.2 +* Do not prefix grid/flexbox in `@supports` on `grid: false`/`flexbox: false`. + +## 6.7.1 +* Update Browserslist with `last n version` fix. + +## 6.7 “Krungthep doot thep saang” +* Add Electron support in browsers list (by Kilian Valkhof). +* Add `flex-flow` partial support for Flexbox 2009 specification. +* Fix browsers `0` version issue in some Can I Use data. + +## 6.6.1 +* Add metadata to use Autoprefixer in JSS tests (by Chi Vinh Le). + +## 6.6 “Kaiyuan” +* Add `browserslist` key in `package.json` support. +* Add support for separated environments in browserslist config. +* Add `browserslist-stats.json` file support to load custom usage statistics. + +## 6.5.4 +* Fix unitless 0 basis in IE10/IE11 shorthand flex (by Google). + +## 6.5.3 +* Add error for popular mistake with `browser` option instead of `browsers`. + +## 6.5.2 +* Clean prefixes data (by Reinaldo Schiehll). + +## 6.5.1 +* Fix selectors with `:--` prefix support. + +## 6.5 “Einigkeit und Recht und Freiheit” +* Add `defaults` keyword to browsers requirements. +* Fix CSS Grid Layout support. +* Fix `align-self` cleaning. + +## 6.4.1 +* Fix node cloning after some PostCSS plugins. + +## 6.4 “Hic et ubique terrarum” +* Add `:any-link` selector support. +* Add `text-decoration-skip` support. +* Add `transition: duration property` support. +* Fix `-webkit-` prefix for `backface-visibility`. +* Fix `rad` unit support in gradients (by 刘祺). +* Fix `transition` support in Opera 12. +* Removed Safari TP Grid prefixes support. + +## 6.3.7 +* Fix rare `Cannot read property 'constructor' of null` issue. + +## 6.3.6 +* Add Safari TP prefix support for Grid Layout. + +## 6.3.5 +* Fix duplicate prefixes for `-ms-interpolation-mode`. + +## 6.3.4 +* Show users coverage for selected browsers in `info()`. + +## 6.3.3 +* Fix transition warning. + +## 6.3.2 +* Fix jspm support (by Sean Anderson). + +## 6.3.1 +* Fix compatibility with Flexibility polyfill. + +## 6.3 “Pro rege et lege” +* Add Grid Layout support. +* Add `text-spacing` support. +* Add `> 10% in my stats` browsers query with custom usage statistics. +* Add options to disable `@supports`, Flexbox or Grid support. +* Fix compatibility with other PostCSS plugins. + +## 6.2.3 +* Fix error on broken transition with double comma. + +## 6.2.2 +* Fix issues in broken transitions. + +## 6.2.1 +* Fix AST error in transition warning (by @jvdanilo). + +## 6.2 “Fluctuat nec mergitur” +* Use `fill` instead of `fill-available` according spec changes (by 一丝). +* Add `fill` support for logical dimension properties (by 一丝). +* Add `text-emphasis` support (by 一丝). +* Add prefixes to `@supports` only for compatible browsers. +* Add `rad`, `grad` and `turn` units support to linear gradients. +* Add some `deg` directions support for old WebKit linear gradients. +* Fix `@supports` parenthesis (by @heady). +* Add warning when prefixes could not be generated + for complicated `transition-property` values. +* Add warning for outdated `fill-available` value. +* Add warning for wrong `text-emphasis-position` value. +* Add “time capsule” warning for prefix-less future. +* Normalizes all warning messages. + +## 6.1.2 +* Fix gradient hack on some parameters (by Alexey Efremov). + +## 6.1.1 +* Fix `cursor: grab` and `cursor: grabbing` support. + +## 6.1 “Bil-shaʿb wa lil-shaʿb” +* Change `transition` support to output more robust CSS. +* Add `:read-only` support. +* Add support for `appearance` with any values. +* Add CSS-in-JS support via `postcss-js`. +* Add loud `/*! autoprefixer: off */` control comments support. +* Convert `rotateZ` to `rotate` for `-ms-transform`. +* Use `postcss-value-parser` to carefully work with gradients. +* Remove `-ms-transform-style` and `-o-transform-style` that never existed. + +## 6.0.3 +* Fix old gradient direction warning. + +## 6.0.2 +* Remove unnecessary `-khtml-` prefix too. + +## 6.0.1 +* Fix `cross-fade()` support (by 一丝). + +## 6.0 “Eureka” +* CLI was removed from `autoprefixer` package to `autoprefixer-cli`. +* `autoprefixer-core` and `autoprefixer` packages was merged back. +* Remove `autoprefixer(opt).process(css)`, use `autoprefixer.process(css, opt)`. +* Remove `safe` option. Use separated Safe parser from PostCSS. +* Remove Opera 12.1 from default query. +* Use PostCSS 5.0 API. +* Add custom syntaxes support. +* Add `image-set` support (by 一丝). +* Add `mask-border` support (by 一丝). +* Add `filter()` function support (by Vincent De Oliveira). +* Add `backdrop-filter` support (by Vincent De Oliveira). +* Add `element()` support (by Vincent De Oliveira). +* Add CSS Regions support. +* Add Scroll Snap Points support. +* Add `writing-mode` support. +* Add `::backdrop` support. +* Add `cross-fade()` support. +* Add other `break-` properties support. +* Add Microsoft Edge support (by Andrey Polischuk). +* Add `not` keyword and exclude browsers by query. +* Add version ranges `IE 6-9` (by Ben Briggs). +* Fix `filter` in `transition` support on Safari. +* Fix `url()` parsing. +* Fix `pixelated` cleaning. +* Always show old gradient direction warning. + +## 5.2.1 +* Fix parent-less node issue on some cases (by Josh Gillies). + +## 5.2 “Dont tread on me” +* Add `appearance` support. +* Warn users on old gradient direction or flexbox syntax. +* Add `add: false` option to disable new prefixes adding. +* Make Autoprefixer 30% faster. +* Use PostCSS 4.1 plugin API. +* Add prefixes for `pixelated` instead of `crisp-edges` in `image-rendering`. +* Do not add `::placeholder` prefixes for `:placeholder-shown`. +* Fix `text-decoration` prefixes. +* `autoprefixer.process()` was deprecated. Use PostCSS API. + +## 5.1.11 +* Update `num2fraction` to fix resolution media query (by 一丝). + +## 5.1.10 +* Do not generate `-webkit-image-rendering`. + +## 5.1.9 +* Fix DynJS compatibility (by Nick Howes). + +## 5.1.8 +* Fix gradients in `mask` and `mask-image` properties. +* Fix old webkit prefix on some unsupported gradients. + +## 5.1.7 +* Fix placeholder selector (by Vincent De Oliveira). + +## 5.1.6 +* Use official `::placeholder-shown` selector (by Vincent De Oliveira). + +## 5.1.5 +* Add transition support for CSS Masks properties. + +## 5.1.4 +* Use `-webkit-` prefix for Opera Mobile 24. + +## 5.1.3 +* Add IE support for `image-rendering: crisp-edges`. + +## 5.1.2 +* Add never existed `@-ms-keyframes` to common mistake. + +## 5.1.1 +* Safer value split in `flex` hack. + +## 5.1 “Jianyuan” +* Add support for resolution media query (by 一丝). +* Higher accuracy while removing prefixes in values. +* Add support for logical properties (by 一丝). +* Add `@viewport` support. +* Add `text-overflow` support (by 一丝). +* Add `text-emphasis` support (by 一丝). +* Add `image-rendering: crisp-edges` support. +* Add `text-align-last` support. +* Return `autoprefixer.defaults` as alias to current `browserslist.defaults`. +* Save code style while adding prefixes to `@keyframes` and `@viewport`. +* Do not remove `-webkit-background-clip` with non-spec `text` value. +* Fix `-webkit-filter` in `transition`. +* Better support for browser versions joined on Can I Use + like `ios_saf 7.0-7.1` (by Vincent De Oliveira). +* Fix compatibility with `postcss-import` (by Jason Kuhrt). +* Fix Flexbox prefixes for BlackBerry and UC Browser. +* Fix gradient prefixes for old Chrome. + +## 5.0 “Pravda vítězí” +* Use PostCSS 4.0. +* Use Browserslist to parse browsers queries. +* Use global `browserslist` config. +* Add `> 5% in US` query to select browsers by usage in some country. +* Add `object-fit` and `object-position` properties support. +* Add CSS Shape properties support. +* Fix UC Browser name in debug info. +* Remove `autoprefixer.defaults` and use defaults from Browserslist. + +## 4.0.2 +* Remove `o-border-radius`, which is common mistake in legacy CSS. + +## 4.0.1 +* Fix `@supports` support with brackets in values (by Vincent De Oliveira). + +## 4.0 “Indivisibiliter ac Inseparabiliter” +* Become 2.5 times fatser by new PostCSS 3.0 parser. +* Do not remove outdated prefixes by `remove: false` option. +* `map.inline` and `map.sourcesContent` options are now `true` by default. +* Add `box-decoration-break` support. +* Do not add old `-webkit-` prefix for gradients with `px` units. +* Use previous source map to show origin source of CSS syntax error. +* Use `from` option from previous source map `file` field. +* Set `to` value to `from` if `to` option is missing. +* Trim Unicode BOM on source maps parsing. +* Parse at-rules without spaces like `@import"file"`. +* Better previous `sourceMappingURL` annotation comment cleaning. +* Do not remove previous `sourceMappingURL` comment on `map.annotation: false`. + +## 3.1.2 +* Update Firefox ESR version from 24 to 31. + +## 3.1.1 +* Use Flexbox 2009 spec for Android stock browser < 4.4. + +## 3.1 “Satyameva Jayate” +* Do not remove comments from prefixed values (by Eitan Rousso). +* Allow Safari 6.1 to use final Flexbox spec (by John Kreitlow). +* Fix `filter` value in `transition` in Webkits. +* Show greetings if your browsers don’t require any prefixes. +* Add `<=` and `<` browsers requirement (by Andreas Lind). + +## 3.0.1 +* Fix `autoprefixer.postcss` in callbacks. + +## 3.0 “Liberté, Égalité, Fraternité” +* Project was split to autoprefixer (with CLI) and autoprefixer-core. +* `autoprefixer()` now receives only `options` object with `browsers` key. +* GNU format for syntax error messages from PostCSS 2.2. + +## 2.2 “Mobilis in mobili” +* Allow to disable Autoprefixer for some rule by control comment. +* Use PostCSS 2.1 with Safe Mode option and broken source line + in CSS syntax error messages. + +## 2.1.1 +* Fix `-webkit-background-size` hack for `contain` and `cover` values. +* Don’t add `-webkit-` prefix to `filter` with SVG (by Vincent De Oliveira). + +## 2.1 “Eleftheria i thanatos” +* Add support for `clip-path` and `mask` properties. +* Return `-webkit-` prefix to `filter` with SVG URI. + +## 2.0.2 +* Add readable names for new browsers from 2.0 release. +* Don’t add `-webkit-` prefix to `filter` with SVG URI. +* Don’t add `-o-` prefix 3D transforms. + +## 2.0.1 +* Save declaration style, when clone declaration to prefix. + +## 2.0 “Hongik Ingan” +* Based on PostCSS 1.0. + See [options changes](https://github.com/postcss/postcss/releases/tag/1.0.0). +* Restore visual cascade after declaration removing. +* Enable visual cascade by default. +* Prefix declareation in `@supports` at-rule conditions. +* Add all browsers from Can I Use: `ie_mob`, `and_chr`, `and_ff`, + `op_mob` and `op_mini`. +* Allow to use latest Autoprefixer from GitHub by npm. +* Add `--no-cascade`, `--annotation` and `--sources-content` options to binary. + +## 1.3.1 +* Fix gradient hack, when `background` property contains color. + +## 1.3 “Tenka Fubu” +* Add `text-size-adjust` support. +* Add `background-size` to support Android 2. + +## 1.2 “Meiji” +* Use Can I Use data from official `caniuse-db` npm package. +* Remove package data update from binary. +* Use increment value instead of current date in minor versions. + +## 1.1 “Nutrisco et extingo” +* Add source map annotation comment support. +* Add inline source map support. +* Autodetect previous source map. +* Fix source maps support on Windows. +* Fix source maps support in subdirectory. +* Prefix selector even if it is already prefixed by developer. +* Add option `cascade` to create nice visual cascade of prefixes. +* Fix flexbox support for IE 10 (by Roland Warmerdam). +* Better `break-inside` support. +* Fix prefixing, when two same properties are near. + +### 20140222 +* Add `touch-action` support. + +### 20140226 +* Chrome 33 is moved to released versions. +* Add Chrome 36 data. + +### 20140302 +* Add `text-decoration-*` properties support. +* Update browsers usage statistics. +* Use new PostCSS version. + +### 20140319 +* Check already prefixed properties after current declaration. +* Normalize spaces before already prefixed check. +* Firefox 28 is moved to released versions. +* Add Firefox 31 data. +* Add some Blackberry data. + +### 20140327 +* Don’t use `-ms-transform` in `@keyframes`, because IE 9 doesn’t support + animations. +* Update BlackBerry 10 data. + +### 20140403 +* Update browsers usage statistics. +* Opera 20 is moved to released versions. +* Add Opera 22 data. + +### 20140410 +* Chrome 34 is moved to released versions. +* Add Chrome 37 data. +* Fix Chrome 36 data. + +### 20140429 +* Fix `display: inline-flex` support by 2009 spec. +* Fix old WebKit gradient converter (by Sergey Belov). +* Fix CSS 3 cursors data (by Nick Schonning). + +### 20140430 +* Separate 2D and 3D transform prefixes to clean unnecessary `-ms-` prefixes. +* Firefox 29 is moved to released versions. +* Add Firefox 32 data. + +### 20140510 +* Do not add `-ms-` prefix for `transform` with 3D functions. +* Update browsers global usage statistics. + +### 20140512 +* Remove unnecessary `-moz-` prefix for `wavy` in `text-decoration`. +* Update Safari data for font properties. + +### 20140521 +* Chrome 36 is moved to released versions. +* Add Chrome 38 data. + +### 20140523 +* Opera 21 is moved to released versions. +* Add Opera 23 data. + +### 20140605 +* Allow to parse gradients without space between color and position. +* Add iOS 8, Safari 8 and Android 4.4.3 data. +* Update browsers usage statistics. + +## 1.0 “Plus ultra” +* Source map support. +* Save origin indents and code formatting. +* Change CSS parser to PostCSS. +* Preserve vendor-prefixed properties put right after unprefixed ones. +* Rename `compile()` to `process()` and return result object, + instead of CSS string. +* Rename `inspect()` to `info()`. +* Add in binary `-d` option to specify output directory. +* Binary now will not concat output files. +* Allow to select last versions for specified browser. +* Add full browser names aliases: `firefox`, `explorer` and `blackberry`. +* Ignore case in browser names. +* Change license to MIT. +* Add prefixes inside custom at-rules. +* Add only necessary prefixes to selector inside prefixed at-rule. +* Safer backgrounds list parser in gradient hack. +* Prefix `@keyframes` inside `@media`. +* Don’t prefix values for CSS3 PIE properties. +* Binary now shows file name in syntax error. +* Use browserify to build standalone version. + +### 20131225 +* Fix deprecated API convertor. +* Add `::placeholder` support for Firefix >= 18. +* Fix vendor prefixes order. + +### 20140103 +* Add `-webkit-` prefix for `sticky` position. +* Update browsers popularity statistics. + +### 20140109 +* Add selectors and at-rules sections to debug info. +* Fix outdated prefixes cleaning. + +### 20140110 +* Add `Firefox ESR` browser requirement. +* Opera 18 is moved to released versions. +* Add Opera 20 data. + +### 20140117 +* Chrome 32 is moved to released versions. +* Add Opera 34 data. + +### 20140130 +* Fix flexbox properties names in transitions. +* Add Chrome 35 and Firefox 29 data. + +### 20140203 +* Android 4.4 stock browser and Opera 19 are moved to released versions. +* Add Opera 21 data. +* Update browsers usage statistics. + +### 20140213 +* Add case insensitive to IE’s filter hack (by Dominik Schilling). +* Improve selector prefixing in some rare cases (by Simon Lydell). +* Firefox 27 is moved to released versions. +* Add Firefox 30 data. + +## 0.8 “Unbowed, Unbent, Unbroken” +* Add more browsers to defaults ("> 1%, last 2 versions, ff 17, opera 12.1" + instead of just "last 2 browsers"). +* Keep vendor prefixes without unprefixed version (like vendor-specific hacks). +* Convert gradients to old WebKit syntax (actual for Android 2.3). +* Better support for several syntaxes with one prefix (like Flexbox and + gradients in WebKit). +* Add intrinsic and extrinsic sizing values support. +* Remove never existed prefixes from common mistakes (like -ms-transition). +* Add Opera 17 data. +* Fix selector prefixes order. +* Fix browser versions order in inspect. + +### 20130903 +* Fix old WebKit gradients convertor on rgba() colors. +* Allow to write old direction syntax in gradients. + +### 20130906 +* Fix direction syntax in radial gradients. +* Don’t prefix IE filter with modern syntax. + +### 20130911 +* Fix parsing property name with spaces. + +### 20130919 +* Fix processing custom framework prefixes (by Johannes J. Schmidt). +* Concat outputs if several files compiled to one output. +* Decrease standalone build size by removing unnecessary Binary class. +* iOS 7 is moved to released versions. +* Clean up binary code (by Simon Lydell). + +### 20130923 +* Firefox 24 is moved to released versions. + +### 20131001 +* Add support for grab, grabbing, zoom-in and zoom-out cursor values. + +### 20131006 +* Chrome 30 is moved to released versions. + +### 20131007 +* Don’t add another prefixes in rule with prefixed selector. + +### 20131009 +* Opera 17 is moved to released versions. + +### 20131015 +* Fix converting multiple gradients to old webkit syntax (by Aleksei Androsov). + +### 20131017 +* Fix @host at-rule parsing. + +### 20131020 +* IE 11 and Andrid 4.3 is moved to released versions. +* Add Opera 18 data. +* Add @namespace support. +* Sort browser versions in data file. + +### 20131029 +* Add Safari 6.1 data. +* Add fx alias for Firefox. + +### 20131104 +* Update Android future version to 4.4. +* Google Chrome 32 added to future versions list. +* Firefox 25 now is actual version, 27 and 28 added to future versions. +* Browsers statistics are updated. + +### 20131205 +* Google Chrome 33 added to future releases list. +* Google Chrome 31 moved to current releases list. + +### 20131209 +* Use old webkit gradients for old iOS and Safari (by Chad von Nau). +* Fix direction conversion for old webkit gradients (by Chad von Nau). +* Update browsers popularity statistics. + +### 20131213 +* Firefox ESR in default browsers was changed to 24 version. +* Firefox 26 was moved to current releases list. +* Firefox 28 was added to future releases list. + +## 0.7 “We Do Not Sow” +* Add vendor prefixes to selectors. +* Add ::selection and ::placeholder selectors support. +* Allow to load support data from Can I Use pull requests. +* Remove deprecated API. + +### 20130806 +* Add hyphens support. + +### 20130807 +* Add tab-size support. +* Add :fullscreen support. + +### 20130808 +* Allow to select browser versions by > and >= operator. +* Fix flex properties in transition. + +### 20130810 +* Add Firefox 25 data. + +### 20130824 +* Add Chrome 31 and 30 data. +* Fix CSS comments parsing (by vladkens). + +## 0.6 “As High As Honor” +* New faster API, which cache preprocessed data. Old API is deprecated. +* A lot of perfomance improvements. +* Add Opera 15 -webkit- prefix support. +* Update Chrome 29 and Safari 7 prefixes data. +* Add minor browsers in popularity select. +* Better syntax error messages. + +### 20130721 +* Add Chrome 30 data. + +### 20130728 +* Don’t remove non-standard -webkit-background-clip: text. +* Don’t remove IE hack on CSS parse. + +### 20130729 +* Add Opera 16 data. +* Fix “Invalid range in character class” error on Firefox. + +### 20130730 +* Fix correct clone comments inside keyframes (by Alexey Plutalov). +* Fix angle recalculation in gradients (by Roman Komarov). + +### 20130731 +* Add border-image support. + +## 0.5 “Ours is the Fury” +* Rewrite Autoprefixer to be more flexible. +* Use css, instead of Rework, to fix CSS parsing errors faster. +* Fix a lot of CSS parsing errors. + +### 20130616 +* More useful message for CSS parsing errors. +* Remove old WebKit gradient syntax. +* Fix parsing error on comment with braces. + +### 20130617 +* Remove old Mozilla border-radius. +* Don’t prefix old IE filter. +* Remove old background-clip, background-size and background-origin prefixes. +* Speed up regexps in values. +* Allow to hack property declarations. + +### 20130625 +* Convert flexbox properties to 2009 and 2012 specifications. +* Improve messages on syntax errors. + +### 20130626 +* Add Firefox 24 data. +* Add prefixes for font-feature-settings. + +### 20130629 +* Fix convert flex properties to old box-flex. + +## 0.4 “Winter Is Coming” +* Remove outdated prefixes. +* Add border-radius and box-shadow properties to database. +* Change degrees in webkit gradients. + +### 20130515 +* Add old syntax in gradient direction. +* Add old syntax for display: flex. +* Update browser global usage statistics. + +### 20130521 +* Add Firefox 23 data. + +### 20130524 +* Add Chrome 29 data. + +### 20130528 +* Fix compatibilty with Rework from git master. +* Add minor browsers to data, which can be selected only directly. + +### 20130530 +* Add Opera 15 and iOS 6.1 data. +* Fix iOS versions in properties and values data. + +### 20130603 +* Use latest Rework 0.15 with a lot of CSS parsing fixes. +* Update browsers usage statistics. + +## 0.3 “Growing Strong” +* Rename `autoprefixer.filter()` to `autoprefixer.rework()`. +* Use own filters instead of Rework’s `prefix` and `prefixValue`. +* Smarter value prefixer without false match “order” in “border”. +* 40% faster. +* Don’t add unnecessary properties instead of Rework’s `prefixValue`. +* Don’t change properties order. +* Sort properties and values in inspect output. +* Add main to component config (by Jonathan Ong). +* Fix documentation (by Sergey Leschina and Mark Vasilkov). + +### 20130424 +* Fix value override in prefixer. + +### 20130427 +* Prefix several same values in one property. +* Fix Windows support in binary. +* Improve print errors in binary. + +### 20130502 +* Don’t add -webkit- prefix to IE filter. +* Don’t duplicate prefixes on second run. + +## 0.2 “Hear Me Roar!” +* Update parse libraries. +* Use component package manager to build standalone script. +* Add inspect to standalone script. + +## 0.1 “Fire and Blood” +* Initial release. diff --git a/website/www/node_modules/autoprefixer/LICENSE b/website/www/node_modules/autoprefixer/LICENSE new file mode 100644 index 000000000000..da057b4562a8 --- /dev/null +++ b/website/www/node_modules/autoprefixer/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2013 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/autoprefixer/README.md b/website/www/node_modules/autoprefixer/README.md new file mode 100644 index 000000000000..89ec5c830ad3 --- /dev/null +++ b/website/www/node_modules/autoprefixer/README.md @@ -0,0 +1,1112 @@ +# Autoprefixer [![Cult Of Martians][cult-img]][cult] + + + +[PostCSS] plugin to parse CSS and add vendor prefixes to CSS rules using values +from [Can I Use]. It is [recommended] by Google and used in Twitter and Alibaba. + +Write your CSS rules without vendor prefixes (in fact, forget about them +entirely): + +```css +::placeholder { + color: gray; +} + +.image { + background-image: url(image@1x.png); +} +@media (min-resolution: 2dppx) { + .image { + background-image: url(image@2x.png); + } +} +``` + +Autoprefixer will use the data based on current browser popularity and property +support to apply prefixes for you. You can try the [interactive demo] +of Autoprefixer. + +```css +::-webkit-input-placeholder { + color: gray; +} +::-moz-placeholder { + color: gray; +} +:-ms-input-placeholder { + color: gray; +} +::-ms-input-placeholder { + color: gray; +} +::placeholder { + color: gray; +} + +.image { + background-image: url(image@1x.png); +} +@media (-webkit-min-device-pixel-ratio: 2), + (-o-min-device-pixel-ratio: 2/1), + (min-resolution: 2dppx) { + .image { + background-image: url(image@2x.png); + } +} +``` + +Twitter account for news and releases: [@autoprefixer]. + + +Sponsored by Evil Martians + + +[interactive demo]: https://autoprefixer.github.io/ +[@autoprefixer]: https://twitter.com/autoprefixer +[recommended]: https://developers.google.com/web/tools/setup/setup-buildtools#dont_trip_up_with_vendor_prefixes +[Can I Use]: https://caniuse.com/ +[cult-img]: http://cultofmartians.com/assets/badges/badge.svg +[PostCSS]: https://github.com/postcss/postcss +[cult]: http://cultofmartians.com/tasks/autoprefixer-grid.html + + +## Contents + +* [Contents](#contents) +* [Browsers](#browsers) +* [FAQ](#faq) + * [Does Autoprefixer polyfill Grid Layout for IE?](#does-autoprefixer-polyfill-grid-layout-for-ie) + * [Does it add polyfills?](#does-it-add-polyfills) + * [Why doesn’t Autoprefixer add prefixes to `border-radius`?](#why-doesnt-autoprefixer-add-prefixes-to-border-radius) + * [Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?](#why-does-autoprefixer-use-unprefixed-properties-in--webkit-keyframes) + * [How to work with legacy `-webkit-` only code?](#how-to-work-with-legacy--webkit--only-code) + * [Does Autoprefixer add `-epub-` prefix?](#does-autoprefixer-add--epub--prefix) + * [Why doesn’t Autoprefixer transform generic font-family `system-ui`?](#why-doesnt-autoprefixer-transform-generic-font-family-system-ui) +* [Usage](#usage) + * [Gulp](#gulp) + * [Webpack](#webpack) + * [CSS-in-JS](#css-in-js) + * [CLI](#cli) + * [Other Build Tools](#other-build-tools) + * [Preprocessors](#preprocessors) + * [GUI Tools](#gui-tools) + * [JavaScript](#javascript) + * [Text Editors and IDE](#text-editors-and-ide) +* [Warnings](#warnings) +* [Disabling](#disabling) + * [Prefixes](#prefixes) + * [Features](#features) + * [Control Comments](#control-comments) +* [Options](#options) +* [Environment Variables](#environment-variables) + * [Using environment variables to support CSS Grid prefixes in Create React App](#using-environment-variables-to-support-css-grid-prefixes-in-create-react-app) +* [Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie) + * [Beware of enabling autoplacement in old projects](#beware-of-enabling-autoplacement-in-old-projects) + * [Autoplacement limitations](#autoplacement-limitations) + * [Both columns and rows must be defined](#both-columns-and-rows-must-be-defined) + * [Repeat auto-fit and auto-fill are not supported](#repeat-auto-fit-and-auto-fill-are-not-supported) + * [No manual cell placement or column/row spans allowed inside an autoplacement grid](#no-manual-cell-placement-or-columnrow-spans-allowed-inside-an-autoplacement-grid) + * [Do not create `::before` and `::after` pseudo elements](#do-not-create-before-and-after-pseudo-elements) + * [When changing the `grid gap` value, columns and rows must be re-declared](#when-changing-the-grid-gap-value-columns-and-rows-must-be-re-declared) +* [Debug](#debug) +* [Security Contact](#security-contact) + +## Browsers + +Autoprefixer uses [Browserslist], so you can specify the browsers +you want to target in your project with queries like `> 5%` +(see [Best Practices]). + +The best way to provide browsers is a `.browserslistrc` file in your project +root, or by adding a `browserslist` key to your `package.json`. + +We recommend the use of these options over passing options to Autoprefixer so +that the config can be shared with other tools such as [babel-preset-env] and +[Stylelint]. + +See [Browserslist docs] for queries, browser names, config format, and defaults. + +[Browserslist docs]: https://github.com/browserslist/browserslist#queries +[babel-preset-env]: https://github.com/babel/babel/tree/master/packages/babel-preset-env +[Best Practices]: https://github.com/browserslist/browserslist#best-practices +[Browserslist]: https://github.com/browserslist/browserslist +[Stylelint]: https://stylelint.io/ + + +## FAQ + +### Does Autoprefixer polyfill Grid Layout for IE? + +Autoprefixer can be used to translate modern CSS Grid syntax into IE 10 +and IE 11 syntax, but this polyfill will not work in 100% of cases. +This is why it is disabled by default. + +First, you need to enable Grid prefixes by using either the `grid: "autoplace"` +option or the `/* autoprefixer grid: autoplace */` control comment. +Also you can use environment variable to enable Grid: +`AUTOPREFIXER_GRID=autoplace npm build`. + +Second, you need to test every fix with Grid in IE. It is not an enable and +forget feature, but it is still very useful. +Financial Times and Yandex use it in production. + +Third, there is only very limited auto placement support. Read the +[Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie) section +for more details. + +Fourth, if you are not using the autoplacement feature, the best way +to use Autoprefixer is by using `grid-template` or `grid-template-areas`. + +```css +.page { + display: grid; + grid-gap: 33px; + grid-template: + "head head head" 1fr + "nav main main" minmax(100px, 1fr) + "nav foot foot" 2fr / + 1fr 100px 1fr; +} +.page__head { + grid-area: head; +} +.page__nav { + grid-area: nav; +} +.page__main { + grid-area: main; +} +.page__footer { + grid-area: foot; +} +``` + +See also: + +* [The guide about Grids in IE and Autoprefixer]. +* [`postcss-gap-properties`] to use new `gap` property + instead of old `grid-gap`. +* [`postcss-grid-kiss`] has alternate “everything in one property” syntax, + which makes using Autoprefixer’s Grid translations safer. + +[The guide about Grids in IE and Autoprefixer]: https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/ +[`postcss-gap-properties`]: https://github.com/jonathantneal/postcss-gap-properties +[`postcss-grid-kiss`]: https://github.com/sylvainpolletvillard/postcss-grid-kiss + + +### Does it add polyfills? + +No. Autoprefixer only adds prefixes. + +Most new CSS features will require client side JavaScript to handle a new +behavior correctly. + +Depending on what you consider to be a “polyfill”, you can take a look at some +other tools and libraries. If you are just looking for syntax sugar, +you might take a look at: + +- [postcss-preset-env] is a plugins preset with polyfills and Autoprefixer + to write future CSS today. +- [Oldie], a PostCSS plugin that handles some IE hacks (opacity, rgba, etc). +- [postcss-flexbugs-fixes], a PostCSS plugin to fix flexbox issues. + +[postcss-flexbugs-fixes]: https://github.com/luisrudge/postcss-flexbugs-fixes +[postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env +[Oldie]: https://github.com/jonathantneal/oldie + + +### Why doesn’t Autoprefixer add prefixes to `border-radius`? + +Developers are often surprised by how few prefixes are required today. +If Autoprefixer doesn’t add prefixes to your CSS, check if they’re still +required on [Can I Use]. + +[Can I Use]: https://caniuse.com/ + + +### Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`? + +Browser teams can remove some prefixes before others, so we try to use all +combinations of prefixed/unprefixed values. + + +### How to work with legacy `-webkit-` only code? + +Autoprefixer needs unprefixed property to add prefixes. So if you only +wrote `-webkit-gradient` without W3C’s `gradient`, +Autoprefixer will not add other prefixes. + +But [PostCSS] has plugins to convert CSS to unprefixed state. +Use [postcss-unprefix] before Autoprefixer. + +[postcss-unprefix]: https://github.com/gucong3000/postcss-unprefix + + +### Does Autoprefixer add `-epub-` prefix? + +No, Autoprefixer works only with browsers prefixes from Can I Use. +But you can use [postcss-epub] for prefixing ePub3 properties. + +[postcss-epub]: https://github.com/Rycochet/postcss-epub + + +### Why doesn’t Autoprefixer transform generic font-family `system-ui`? + +`system-ui` is technically not a prefix and the transformation is not +future-proof. You can use [postcss-font-family-system-ui] to transform +`system-ui` to a practical font-family list. + +[postcss-font-family-system-ui]: https://github.com/JLHwung/postcss-font-family-system-ui + + +## Usage + +### Gulp + +In Gulp you can use [gulp-postcss] with `autoprefixer` npm package. + +```js +gulp.task('autoprefixer', () => { + const autoprefixer = require('autoprefixer') + const sourcemaps = require('gulp-sourcemaps') + const postcss = require('gulp-postcss') + + return gulp.src('./src/*.css') + .pipe(sourcemaps.init()) + .pipe(postcss([ autoprefixer() ])) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest('./dest')) +}) +``` + +With `gulp-postcss` you also can combine Autoprefixer +with [other PostCSS plugins]. + +[gulp-postcss]: https://github.com/postcss/gulp-postcss +[other PostCSS plugins]: https://github.com/postcss/postcss#plugins + + +### Webpack + +In [webpack] you can use [postcss-loader] with `autoprefixer` +and [other PostCSS plugins]. + +```js +module.exports = { + module: { + rules: [ + { + test: /\.css$/, + use: ["style-loader", "css-loader", "postcss-loader"] + } + ] + } +} +``` + +And create a `postcss.config.js` with: + +```js +module.exports = { + plugins: [ + require('autoprefixer') + ] +} +``` + +[other PostCSS plugins]: https://github.com/postcss/postcss#plugins +[postcss-loader]: https://github.com/postcss/postcss-loader +[webpack]: https://webpack.js.org/ + + +### CSS-in-JS + +The best way to use PostCSS with CSS-in-JS is [`astroturf`]. +Add its loader to your `webpack.config.js`: + +```js +module.exports = { + module: { + rules: [ + { + test: /\.css$/, + use: ['style-loader', 'postcss-loader'], + }, + { + test: /\.jsx?$/, + use: ['babel-loader', 'astroturf/loader'], + } + ] + } +} +``` + +Then create `postcss.config.js`: + +```js +module.exports = { + plugins: [ + require('autoprefixer') + ] +} +``` + +[`astroturf`]: https://github.com/4Catalyzer/astroturf + + +### CLI + +You can use the [postcss-cli] to run Autoprefixer from CLI: + +```sh +npm install postcss-cli autoprefixer +npx postcss *.css --use autoprefixer -d build/ +``` + +See `postcss -h` for help. + +[postcss-cli]: https://github.com/postcss/postcss-cli + + +### Other Build Tools + +* **Grunt:** [grunt-postcss] +* **Ruby on Rails**: [autoprefixer-rails] +* **Neutrino**: [neutrino-middleware-postcss] +* **Jekyll**: add `autoprefixer-rails` and `jekyll-assets` to `Gemfile` +* **Brunch**: [postcss-brunch] +* **Broccoli**: [broccoli-postcss] +* **Middleman**: [middleman-autoprefixer] +* **Mincer**: add `autoprefixer` npm package and enable it: + `environment.enable('autoprefixer')` + +[neutrino-middleware-postcss]: https://www.npmjs.com/package/neutrino-middleware-postcss +[middleman-autoprefixer]: https://github.com/middleman/middleman-autoprefixer +[autoprefixer-rails]: https://github.com/ai/autoprefixer-rails +[broccoli-postcss]: https://github.com/jeffjewiss/broccoli-postcss +[postcss-brunch]: https://github.com/iamvdo/postcss-brunch +[grunt-postcss]: https://github.com/nDmitry/grunt-postcss + + +#### Preprocessors + +* **Less**: [less-plugin-autoprefix] +* **Stylus**: [autoprefixer-stylus] +* **Compass**: [autoprefixer-rails#compass] + +[less-plugin-autoprefix]: https://github.com/less/less-plugin-autoprefix +[autoprefixer-stylus]: https://github.com/jenius/autoprefixer-stylus +[autoprefixer-rails#compass]: https://github.com/ai/autoprefixer-rails#compass + + +#### GUI Tools + +* [CodeKit](https://codekitapp.com/help/autoprefixer/) +* [Prepros](https://prepros.io) + + +### JavaScript + +You can use Autoprefixer with [PostCSS] in your Node.js application +or if you want to develop an Autoprefixer plugin for a new environment. + +```js +const autoprefixer = require('autoprefixer') +const postcss = require('postcss') + +postcss([ autoprefixer ]).process(css).then(result => { + result.warnings().forEach(warn => { + console.warn(warn.toString()) + }) + console.log(result.css) +}) +``` + +There is also a [standalone build] for the browser or for a non-Node.js runtime. + +You can use [html-autoprefixer] to process HTML with inlined CSS. + +[html-autoprefixer]: https://github.com/RebelMail/html-autoprefixer +[standalone build]: https://raw.github.com/ai/autoprefixer-rails/master/vendor/autoprefixer.js +[PostCSS]: https://github.com/postcss/postcss + + +### Text Editors and IDE + +Autoprefixer should be used in assets build tools. Text editor plugins are not +a good solution, because prefixes decrease code readability and you will need +to change values in all prefixed properties. + +I recommend you to learn how to use build tools like [Parcel]. +They work much better and will open you a whole new world of useful plugins +and automation. + +If you can’t move to a build tool, you can use text editor plugins: + +* [Visual Studio Code](https://github.com/mrmlnc/vscode-autoprefixer) +* [Atom Editor](https://github.com/sindresorhus/atom-autoprefixer) +* [Sublime Text](https://github.com/sindresorhus/sublime-autoprefixer) +* [Brackets](https://github.com/mikaeljorhult/brackets-autoprefixer) + +[Parcel]: https://parceljs.org/ + + +## Warnings + +Autoprefixer uses the [PostCSS warning API] to warn about really important +problems in your CSS: + +* Old direction syntax in gradients. +* Old unprefixed `display: box` instead of `display: flex` + by latest specification version. + +You can get warnings from `result.warnings()`: + +```js +result.warnings().forEach(warn => { + console.warn(warn.toString()) +}) +``` + +Every Autoprefixer runner should display these warnings. + +[PostCSS warning API]: http://api.postcss.org/Warning.html + + +## Disabling + +### Prefixes + +Autoprefixer was designed to have no interface – it just works. +If you need some browser specific hack just write a prefixed property +after the unprefixed one. + +```css +a { + transform: scale(0.5); + -moz-transform: scale(0.6); +} +``` + +If some prefixes were generated incorrectly, please create an [issue on GitHub]. + +[issue on GitHub]: https://github.com/postcss/autoprefixer/issues + + +### Features + +You can use these plugin options to control some of Autoprefixer’s features. + +* `grid: "autoplace"` will enable `-ms-` prefixes for Grid Layout including some + [limited autoplacement support](#grid-autoplacement-support-in-ie). +* `supports: false` will disable `@supports` parameters prefixing. +* `flexbox: false` will disable flexbox properties prefixing. + Or `flexbox: "no-2009"` will add prefixes only for final and IE + versions of specification. +* `remove: false` will disable cleaning outdated prefixes. + +You should set them inside the plugin like so: + +```js +autoprefixer({ grid: 'autoplace' }) +``` + + +### Control Comments + +If you do not need Autoprefixer in some part of your CSS, +you can use control comments to disable Autoprefixer. + +```css +.a { + transition: 1s; /* will be prefixed */ +} + +.b { + /* autoprefixer: off */ + transition: 1s; /* will not be prefixed */ +} + +.c { + /* autoprefixer: ignore next */ + transition: 1s; /* will not be prefixed */ + mask: url(image.png); /* will be prefixed */ +} +``` + +There are three types of control comments: + +* `/* autoprefixer: (on|off) */`: enable/disable all Autoprefixer translations for the + whole block both *before* and *after* the comment. +* `/* autoprefixer: ignore next */`: disable Autoprefixer only for the next property + or next rule selector or at-rule parameters (but not rule/at‑rule body). +* `/* autoprefixer grid: (autoplace|no-autoplace|off) */`: control how Autoprefixer handles + grid translations for the whole block: + * `autoplace`: enable grid translations with autoplacement support. + * `no-autoplace`: enable grid translations with autoplacement + support *disabled* (alias for deprecated value `on`). + * `off`: disable all grid translations. + +You can also use comments recursively: + +```css +/* autoprefixer: off */ +@supports (transition: all) { + /* autoprefixer: on */ + a { + /* autoprefixer: off */ + } +} +``` + +Note that comments that disable the whole block should not be featured in the same +block twice: + +```css +/* How not to use block level control comments */ + +.do-not-do-this { + /* autoprefixer: off */ + transition: 1s; + /* autoprefixer: on */ + transform: rotate(20deg); +} +``` + + +## Options + +Function `autoprefixer(options)` returns a new PostCSS plugin. +See [PostCSS API] for plugin usage documentation. + +```js +autoprefixer({ cascade: false }) +``` + +Available options are: + +* `env` (string): environment for Browserslist. +* `cascade` (boolean): should Autoprefixer use Visual Cascade, + if CSS is uncompressed. Default: `true` +* `add` (boolean): should Autoprefixer add prefixes. Default is `true`. +* `remove` (boolean): should Autoprefixer [remove outdated] prefixes. + Default is `true`. +* `supports` (boolean): should Autoprefixer add prefixes for `@supports` + parameters. Default is `true`. +* `flexbox` (boolean|string): should Autoprefixer add prefixes for flexbox + properties. With `"no-2009"` value Autoprefixer will add prefixes only + for final and IE 10 versions of specification. Default is `true`. +* `grid` (false|`"autoplace"`|`"no-autoplace"`): should Autoprefixer + add IE 10-11 prefixes for Grid Layout properties? + * `false` (default): prevent Autoprefixer from outputting + CSS Grid translations. + * `"autoplace"`: enable Autoprefixer grid translations + and *include* autoplacement support. You can also use + `/* autoprefixer grid: autoplace */` in your CSS. + * `"no-autoplace"`: enable Autoprefixer grid translations + but *exclude* autoplacement support. You can also use + `/* autoprefixer grid: no-autoplace */` in your CSS. + (alias for the deprecated `true` value) +* `stats` (object): custom [usage statistics] for `> 10% in my stats` + browsers query. +* `overrideBrowserslist` (array): list of queries for target browsers. + Try to not use it. The best practice is to use `.browserslistrc` config + or `browserslist` key in `package.json` to share target browsers + with Babel, ESLint and Stylelint. See [Browserslist docs] + for available queries and default value. +* `ignoreUnknownVersions` (boolean): do not raise error on unknown browser + version in Browserslist config. Default is `false`. + +Plugin object has `info()` method for debugging purpose. + +You can use PostCSS processor to process several CSS files +to increase performance. + +[usage statistics]: https://github.com/browserslist/browserslist#custom-usage-data +[PostCSS API]: http://api.postcss.org + +## Environment Variables + +* `AUTOPREFIXER_GRID`: (`autoplace`|`no-autoplace`) should Autoprefixer + add IE 10-11 prefixes for Grid Layout properties? + * `autoplace`: enable Autoprefixer grid translations + and *include* autoplacement support. + * `no-autoplace`: enable Autoprefixer grid translations + but *exclude* autoplacement support. + +Environment variables are useful, when you want to change Autoprefixer options but don't have access to config files. +[Create React App] is a good example of this. + +[Create React App]: (https://reactjs.org/docs/create-a-new-react-app.html#create-react-app) + +### Using environment variables to support CSS Grid prefixes in Create React App + +1. Install the latest version of Autoprefixer and [cross-env](https://www.npmjs.com/package/cross-env): + +``` +npm install autoprefixer@latest cross-env --save-dev +``` + +2. Under `"browserslist"` > `"development"` in the package.json file, add `"last 1 ie version"` + +``` +"browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version", + "last 1 ie version" + ] +} +``` + +3. Update `"scripts"` in the package.json file to the following: + +``` +"scripts": { + "start": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts start", + "build": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts build", + "test": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts test", + "eject": "react-scripts eject" +}, +``` + +Replace `autoplace` with `no-autoplace` in the above example if you prefer to disable Autoprefixer Grid autoplacement support. + +Now when you run `npm start` you will see CSS Grid prefixes automatically being applied to your output CSS. + +See also [Browserslist environment variables] for more examples on how to use environment variables in your project. + +[Browserslist environment variables]: https://github.com/browserslist/browserslist#environment-variables + +## Grid Autoplacement support in IE + +If the `grid` option is set to `"autoplace"`, limited autoplacement support is added to Autoprefixers grid translations. You can also use +the `/* autoprefixer grid: autoplace */` control comment or +`AUTOPREFIXER_GRID=autoplace npm build` environment variable. + +Autoprefixer will only autoplace grid cells if both `grid-template-rows` +and `grid-template-columns` has been set. If `grid-template` +or `grid-template-areas` has been set, Autoprefixer will use area based +cell placement instead. + +Autoprefixer supports autoplacement by using `nth-child` CSS selectors. +It creates [number of columns] x [number of rows] `nth-child` selectors. +For this reason Autoplacement is only supported within the explicit grid. + +```css +/* Input CSS */ + +/* autoprefixer grid: autoplace */ + +.autoplacement-example { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto auto; + grid-gap: 20px; +} +``` + +```css +/* Output CSS */ + +/* autoprefixer grid: autoplace */ + +.autoplacement-example { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr 20px 1fr; + grid-template-columns: 1fr 1fr; + -ms-grid-rows: auto 20px auto; + grid-template-rows: auto auto; + grid-gap: 20px; +} + +.autoplacement-example > *:nth-child(1) { + -ms-grid-row: 1; + -ms-grid-column: 1; +} + +.autoplacement-example > *:nth-child(2) { + -ms-grid-row: 1; + -ms-grid-column: 3; +} + +.autoplacement-example > *:nth-child(3) { + -ms-grid-row: 3; + -ms-grid-column: 1; +} + +.autoplacement-example > *:nth-child(4) { + -ms-grid-row: 3; + -ms-grid-column: 3; +} +``` + +### Beware of enabling autoplacement in old projects + +Be careful about enabling autoplacement in any already established projects that have +previously not used Autoprefixer's grid autoplacement feature before. + +If this was your html: + +```html +
    +
    +
    +``` + +The following CSS will not work as expected with the autoplacement feature enabled: + +```css +/* Unsafe CSS when Autoplacement is enabled */ + +.grid-cell { + grid-column: 2; + grid-row: 2; +} + +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, 1fr); +} +``` + +Swapping the rules around will not fix the issue either: + +```css +/* Also unsafe to use this CSS */ + +.grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, 1fr); +} + +.grid-cell { + grid-column: 2; + grid-row: 2; +} +``` + +One way to deal with this issue is to disable autoplacement in the +grid-declaration rule: + +```css +/* Disable autoplacement to fix the issue */ + +.grid { + /* autoprefixer grid: no-autoplace */ + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, 1fr); +} + +.grid-cell { + grid-column: 2; + grid-row: 2; +} +``` + +The absolute best way to integrate autoplacement into already existing projects +though is to leave autoplacement turned off by default and then use a control +comment to enable it when needed. This method is far less likely to cause +something on the site to break. + +```css +/* Disable autoplacement by default in old projects */ +/* autoprefixer grid: no-autoplace */ + +/* Old code will function the same way it always has */ +.old-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, 1fr); +} +.old-grid-cell { + grid-column: 2; + grid-row: 2; +} + +/* Enable autoplacement when you want to use it in new code */ +.new-autoplace-friendly-grid { + /* autoprefixer grid: autoplace */ + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, auto); +} +``` + +Note that the `grid: "no-autoplace"` setting and the +`/* autoprefixer grid: no-autoplace */` control comment share identical +functionality to the `grid: true` setting and the `/* autoprefixer grid: on */` +control comment. There is no need to refactor old code to use `no-autoplace` +in place of the old `true` and `on` statements. + +### Autoplacement limitations + +#### Both columns and rows must be defined + +Autoplacement only works inside the explicit grid. The columns and rows need to be defined +so that Autoprefixer knows how many `nth-child` selectors to generate. + +```css +.not-allowed { + display: grid; + grid-template-columns: repeat(3, 1fr); +} + +.is-allowed { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(10, auto); +} +``` + +#### Repeat auto-fit and auto-fill are not supported + +The `repeat(auto-fit, ...)` and `repeat(auto-fill, ...)` grid functionality relies on +knowledge from the browser about screen dimensions and the number of available grid +items for it to work properly. Autoprefixer does not have access to this information +so unfortunately this little snippet will _never_ be IE friendly. + +```css +.grid { + /* This will never be IE friendly */ + grid-template-columns: repeat(auto-fit, min-max(200px, 1fr)) +} +``` + +#### No manual cell placement or column/row spans allowed inside an autoplacement grid + +Elements must not be manually placed or given column/row spans inside +an autoplacement grid. Only the most basic of autoplacement grids are supported. +Grid cells can still be placed manually outside the the explicit grid though. +Support for manually placing individual grid cells inside an explicit +autoplacement grid is planned for a future release. + +```css +.autoplacement-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, auto); +} + +/* Grid cells placed inside the explicit grid + will break the layout in IE */ +.not-permitted-grid-cell { + grid-column: 1; + grid-row: 1; +} + +/* Grid cells placed outside the + explicit grid will work in IE */ +.permitted-grid-cell { + grid-column: 1 / span 2; + grid-row: 4; +} +``` + +If manual cell placement is required, we recommend using `grid-template` or +`grid-template-areas` instead: + +```css +.page { + display: grid; + grid-gap: 30px; + grid-template: + "head head" + "nav main" minmax(100px, 1fr) + "foot foot" / + 200px 1fr; +} +.page__head { + grid-area: head; +} +.page__nav { + grid-area: nav; +} +.page__main { + grid-area: main; +} +.page__footer { + grid-area: foot; +} +``` + +#### Do not create `::before` and `::after` pseudo elements + +Let's say you have this HTML: + +```html +
    +
    +
    +``` + +And you write this CSS: + +```css +.grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; +} + +.grid::before { + content: 'before'; +} + +.grid::after { + content: 'after'; +} +``` + +This will be the output: + +```css +.grid { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; + -ms-grid-rows: auto; + grid-template-rows: auto; +} + +.grid > *:nth-child(1) { + -ms-grid-row: 1; + -ms-grid-column: 1; +} + + +.grid > *:nth-child(2) { + -ms-grid-row: 1; + -ms-grid-column: 2; +} + +.grid::before { + content: 'before'; +} + +.grid::after { + content: 'after'; +} +``` + +IE will place `.grid-cell`, `::before` and `::after` in row 1 column 1. +Modern browsers on the other hand will place `::before` in row 1 column 1, +`.grid-cell` in row 1 column 2, and `::after` in row 2 column 1. + +See this [Code Pen](https://codepen.io/daniel-tonon/pen/gBymVw) to see a visualization +of the issue. View the Code Pen in both a modern browser and IE to see the difference. + +Note that you can still create `::before` and `::after` elements as long as you manually +place them outside the explicit grid. + +#### When changing the `grid gap` value, columns and rows must be re-declared + +If you wish to change the size of a `grid-gap`, you will need to redeclare the grid columns and rows. + +```css +.grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 50px; +} + +/* This will *NOT* work in IE */ +@media (max-width: 600px) { + .grid { + grid-gap: 20px; + } +} + +/* This will *NOT* work in IE */ +.grid.small-gap { + grid-gap: 20px; +} +``` + +```css +.grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 50px; +} + +/* This *WILL* work in IE */ +@media (max-width: 600px) { + .grid { + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 20px; + } +} + +/* This *WILL* work in IE */ +.grid.small-gap { + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + grid-gap: 20px; +} +``` + +## Debug + +Run `npx autoprefixer --info` in your project directory to check +which browsers are selected and which properties will be prefixed: + +``` +$ npx autoprefixer --info +Browsers: + Edge: 16 + +These browsers account for 0.26% of all users globally + +At-Rules: + @viewport: ms + +Selectors: + ::placeholder: ms + +Properties: + appearance: webkit + flow-from: ms + flow-into: ms + hyphens: ms + overscroll-behavior: ms + region-fragment: ms + scroll-snap-coordinate: ms + scroll-snap-destination: ms + scroll-snap-points-x: ms + scroll-snap-points-y: ms + scroll-snap-type: ms + text-size-adjust: ms + text-spacing: ms + user-select: ms +``` + +JS API is also available: + +```js +console.log(autoprefixer().info()) +``` + +## Security Contact + +To report a security vulnerability, please use the [Tidelift security contact]. +Tidelift will coordinate the fix and disclosure. + +[Tidelift security contact]: https://tidelift.com/security diff --git a/website/www/node_modules/autoprefixer/data/prefixes.js b/website/www/node_modules/autoprefixer/data/prefixes.js new file mode 100644 index 000000000000..8f69864c3fa4 --- /dev/null +++ b/website/www/node_modules/autoprefixer/data/prefixes.js @@ -0,0 +1,706 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var unpack = require('caniuse-lite').feature; + +function browsersSort(a, b) { + a = a.split(' '); + b = b.split(' '); + + if (a[0] > b[0]) { + return 1; + } else if (a[0] < b[0]) { + return -1; + } else { + return Math.sign(parseFloat(a[1]) - parseFloat(b[1])); + } +} // Convert Can I Use data + + +function f(data, opts, callback) { + data = unpack(data); + + if (!callback) { + var _ref = [opts, {}]; + callback = _ref[0]; + opts = _ref[1]; + } + + var match = opts.match || /\sx($|\s)/; + var need = []; + + for (var browser in data.stats) { + var versions = data.stats[browser]; + + for (var version in versions) { + var support = versions[version]; + + if (support.match(match)) { + need.push(browser + ' ' + version); + } + } + } + + callback(need.sort(browsersSort)); +} // Add data for all properties + + +var result = {}; + +function prefix(names, data) { + for (var _iterator = _createForOfIteratorHelperLoose(names), _step; !(_step = _iterator()).done;) { + var name = _step.value; + result[name] = Object.assign({}, data); + } +} + +function add(names, data) { + for (var _iterator2 = _createForOfIteratorHelperLoose(names), _step2; !(_step2 = _iterator2()).done;) { + var name = _step2.value; + result[name].browsers = result[name].browsers.concat(data.browsers).sort(browsersSort); + } +} + +module.exports = result; // Border Radius + +f(require('caniuse-lite/data/features/border-radius'), function (browsers) { + return prefix(['border-radius', 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius'], { + mistakes: ['-khtml-', '-ms-', '-o-'], + feature: 'border-radius', + browsers: browsers + }); +}); // Box Shadow + +f(require('caniuse-lite/data/features/css-boxshadow'), function (browsers) { + return prefix(['box-shadow'], { + mistakes: ['-khtml-'], + feature: 'css-boxshadow', + browsers: browsers + }); +}); // Animation + +f(require('caniuse-lite/data/features/css-animation'), function (browsers) { + return prefix(['animation', 'animation-name', 'animation-duration', 'animation-delay', 'animation-direction', 'animation-fill-mode', 'animation-iteration-count', 'animation-play-state', 'animation-timing-function', '@keyframes'], { + mistakes: ['-khtml-', '-ms-'], + feature: 'css-animation', + browsers: browsers + }); +}); // Transition + +f(require('caniuse-lite/data/features/css-transitions'), function (browsers) { + return prefix(['transition', 'transition-property', 'transition-duration', 'transition-delay', 'transition-timing-function'], { + mistakes: ['-khtml-', '-ms-'], + browsers: browsers, + feature: 'css-transitions' + }); +}); // Transform 2D + +f(require('caniuse-lite/data/features/transforms2d'), function (browsers) { + return prefix(['transform', 'transform-origin'], { + feature: 'transforms2d', + browsers: browsers + }); +}); // Transform 3D + +var transforms3d = require('caniuse-lite/data/features/transforms3d'); + +f(transforms3d, function (browsers) { + prefix(['perspective', 'perspective-origin'], { + feature: 'transforms3d', + browsers: browsers + }); + return prefix(['transform-style'], { + mistakes: ['-ms-', '-o-'], + browsers: browsers, + feature: 'transforms3d' + }); +}); +f(transforms3d, { + match: /y\sx|y\s#2/ +}, function (browsers) { + return prefix(['backface-visibility'], { + mistakes: ['-ms-', '-o-'], + feature: 'transforms3d', + browsers: browsers + }); +}); // Gradients + +var gradients = require('caniuse-lite/data/features/css-gradients'); + +f(gradients, { + match: /y\sx/ +}, function (browsers) { + return prefix(['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + mistakes: ['-ms-'], + feature: 'css-gradients', + browsers: browsers + }); +}); +f(gradients, { + match: /a\sx/ +}, function (browsers) { + browsers = browsers.map(function (i) { + if (/firefox|op/.test(i)) { + return i; + } else { + return i + " old"; + } + }); + return add(['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient'], { + feature: 'css-gradients', + browsers: browsers + }); +}); // Box sizing + +f(require('caniuse-lite/data/features/css3-boxsizing'), function (browsers) { + return prefix(['box-sizing'], { + feature: 'css3-boxsizing', + browsers: browsers + }); +}); // Filter Effects + +f(require('caniuse-lite/data/features/css-filters'), function (browsers) { + return prefix(['filter'], { + feature: 'css-filters', + browsers: browsers + }); +}); // filter() function + +f(require('caniuse-lite/data/features/css-filter-function'), function (browsers) { + return prefix(['filter-function'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-filter-function', + browsers: browsers + }); +}); // Backdrop-filter + +var backdrop = require('caniuse-lite/data/features/css-backdrop-filter'); + +f(backdrop, { + match: /y\sx|y\s#2/ +}, function (browsers) { + return prefix(['backdrop-filter'], { + feature: 'css-backdrop-filter', + browsers: browsers + }); +}); // element() function + +f(require('caniuse-lite/data/features/css-element-function'), function (browsers) { + return prefix(['element'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-element-function', + browsers: browsers + }); +}); // Multicolumns + +f(require('caniuse-lite/data/features/multicolumn'), function (browsers) { + prefix(['columns', 'column-width', 'column-gap', 'column-rule', 'column-rule-color', 'column-rule-width', 'column-count', 'column-rule-style', 'column-span', 'column-fill'], { + feature: 'multicolumn', + browsers: browsers + }); + var noff = browsers.filter(function (i) { + return !/firefox/.test(i); + }); + prefix(['break-before', 'break-after', 'break-inside'], { + feature: 'multicolumn', + browsers: noff + }); +}); // User select + +f(require('caniuse-lite/data/features/user-select-none'), function (browsers) { + return prefix(['user-select'], { + mistakes: ['-khtml-'], + feature: 'user-select-none', + browsers: browsers + }); +}); // Flexible Box Layout + +var flexbox = require('caniuse-lite/data/features/flexbox'); + +f(flexbox, { + match: /a\sx/ +}, function (browsers) { + browsers = browsers.map(function (i) { + if (/ie|firefox/.test(i)) { + return i; + } else { + return i + " 2009"; + } + }); + prefix(['display-flex', 'inline-flex'], { + props: ['display'], + feature: 'flexbox', + browsers: browsers + }); + prefix(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], { + feature: 'flexbox', + browsers: browsers + }); + prefix(['flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content'], { + feature: 'flexbox', + browsers: browsers + }); +}); +f(flexbox, { + match: /y\sx/ +}, function (browsers) { + add(['display-flex', 'inline-flex'], { + feature: 'flexbox', + browsers: browsers + }); + add(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], { + feature: 'flexbox', + browsers: browsers + }); + add(['flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content'], { + feature: 'flexbox', + browsers: browsers + }); +}); // calc() unit + +f(require('caniuse-lite/data/features/calc'), function (browsers) { + return prefix(['calc'], { + props: ['*'], + feature: 'calc', + browsers: browsers + }); +}); // Background options + +f(require('caniuse-lite/data/features/background-img-opts'), function (browsers) { + return prefix(['background-origin', 'background-size'], { + feature: 'background-img-opts', + browsers: browsers + }); +}); // background-clip: text + +f(require('caniuse-lite/data/features/background-clip-text'), function (browsers) { + return prefix(['background-clip'], { + feature: 'background-clip-text', + browsers: browsers + }); +}); // Font feature settings + +f(require('caniuse-lite/data/features/font-feature'), function (browsers) { + return prefix(['font-feature-settings', 'font-variant-ligatures', 'font-language-override'], { + feature: 'font-feature', + browsers: browsers + }); +}); // CSS font-kerning property + +f(require('caniuse-lite/data/features/font-kerning'), function (browsers) { + return prefix(['font-kerning'], { + feature: 'font-kerning', + browsers: browsers + }); +}); // Border image + +f(require('caniuse-lite/data/features/border-image'), function (browsers) { + return prefix(['border-image'], { + feature: 'border-image', + browsers: browsers + }); +}); // Selection selector + +f(require('caniuse-lite/data/features/css-selection'), function (browsers) { + return prefix(['::selection'], { + selector: true, + feature: 'css-selection', + browsers: browsers + }); +}); // Placeholder selector + +f(require('caniuse-lite/data/features/css-placeholder'), function (browsers) { + prefix(['::placeholder'], { + selector: true, + feature: 'css-placeholder', + browsers: browsers.concat(['ie 10 old', 'ie 11 old', 'firefox 18 old']) + }); +}); // Hyphenation + +f(require('caniuse-lite/data/features/css-hyphens'), function (browsers) { + return prefix(['hyphens'], { + feature: 'css-hyphens', + browsers: browsers + }); +}); // Fullscreen selector + +var fullscreen = require('caniuse-lite/data/features/fullscreen'); + +f(fullscreen, function (browsers) { + return prefix([':fullscreen'], { + selector: true, + feature: 'fullscreen', + browsers: browsers + }); +}); +f(fullscreen, { + match: /x(\s#2|$)/ +}, function (browsers) { + return prefix(['::backdrop'], { + selector: true, + feature: 'fullscreen', + browsers: browsers + }); +}); // Tab size + +f(require('caniuse-lite/data/features/css3-tabsize'), function (browsers) { + return prefix(['tab-size'], { + feature: 'css3-tabsize', + browsers: browsers + }); +}); // Intrinsic & extrinsic sizing + +var intrinsic = require('caniuse-lite/data/features/intrinsic-width'); + +var sizeProps = ['width', 'min-width', 'max-width', 'height', 'min-height', 'max-height', 'inline-size', 'min-inline-size', 'max-inline-size', 'block-size', 'min-block-size', 'max-block-size', 'grid', 'grid-template', 'grid-template-rows', 'grid-template-columns', 'grid-auto-columns', 'grid-auto-rows']; +f(intrinsic, function (browsers) { + return prefix(['max-content', 'min-content'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); +f(intrinsic, { + match: /x|\s#4/ +}, function (browsers) { + return prefix(['fill', 'fill-available', 'stretch'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); +f(intrinsic, { + match: /x|\s#5/ +}, function (browsers) { + return prefix(['fit-content'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); // Zoom cursors + +f(require('caniuse-lite/data/features/css3-cursors-newer'), function (browsers) { + return prefix(['zoom-in', 'zoom-out'], { + props: ['cursor'], + feature: 'css3-cursors-newer', + browsers: browsers + }); +}); // Grab cursors + +f(require('caniuse-lite/data/features/css3-cursors-grab'), function (browsers) { + return prefix(['grab', 'grabbing'], { + props: ['cursor'], + feature: 'css3-cursors-grab', + browsers: browsers + }); +}); // Sticky position + +f(require('caniuse-lite/data/features/css-sticky'), function (browsers) { + return prefix(['sticky'], { + props: ['position'], + feature: 'css-sticky', + browsers: browsers + }); +}); // Pointer Events + +f(require('caniuse-lite/data/features/pointer'), function (browsers) { + return prefix(['touch-action'], { + feature: 'pointer', + browsers: browsers + }); +}); // Text decoration + +var decoration = require('caniuse-lite/data/features/text-decoration'); + +f(decoration, function (browsers) { + return prefix(['text-decoration-style', 'text-decoration-color', 'text-decoration-line', 'text-decoration'], { + feature: 'text-decoration', + browsers: browsers + }); +}); +f(decoration, { + match: /x.*#[235]/ +}, function (browsers) { + return prefix(['text-decoration-skip', 'text-decoration-skip-ink'], { + feature: 'text-decoration', + browsers: browsers + }); +}); // Text Size Adjust + +f(require('caniuse-lite/data/features/text-size-adjust'), function (browsers) { + return prefix(['text-size-adjust'], { + feature: 'text-size-adjust', + browsers: browsers + }); +}); // CSS Masks + +f(require('caniuse-lite/data/features/css-masks'), function (browsers) { + prefix(['mask-clip', 'mask-composite', 'mask-image', 'mask-origin', 'mask-repeat', 'mask-border-repeat', 'mask-border-source'], { + feature: 'css-masks', + browsers: browsers + }); + prefix(['mask', 'mask-position', 'mask-size', 'mask-border', 'mask-border-outset', 'mask-border-width', 'mask-border-slice'], { + feature: 'css-masks', + browsers: browsers + }); +}); // CSS clip-path property + +f(require('caniuse-lite/data/features/css-clip-path'), function (browsers) { + return prefix(['clip-path'], { + feature: 'css-clip-path', + browsers: browsers + }); +}); // Fragmented Borders and Backgrounds + +f(require('caniuse-lite/data/features/css-boxdecorationbreak'), function (browsers) { + return prefix(['box-decoration-break'], { + feature: 'css-boxdecorationbreak', + browsers: browsers + }); +}); // CSS3 object-fit/object-position + +f(require('caniuse-lite/data/features/object-fit'), function (browsers) { + return prefix(['object-fit', 'object-position'], { + feature: 'object-fit', + browsers: browsers + }); +}); // CSS Shapes + +f(require('caniuse-lite/data/features/css-shapes'), function (browsers) { + return prefix(['shape-margin', 'shape-outside', 'shape-image-threshold'], { + feature: 'css-shapes', + browsers: browsers + }); +}); // CSS3 text-overflow + +f(require('caniuse-lite/data/features/text-overflow'), function (browsers) { + return prefix(['text-overflow'], { + feature: 'text-overflow', + browsers: browsers + }); +}); // Viewport at-rule + +f(require('caniuse-lite/data/features/css-deviceadaptation'), function (browsers) { + return prefix(['@viewport'], { + feature: 'css-deviceadaptation', + browsers: browsers + }); +}); // Resolution Media Queries + +var resolut = require('caniuse-lite/data/features/css-media-resolution'); + +f(resolut, { + match: /( x($| )|a #2)/ +}, function (browsers) { + return prefix(['@resolution'], { + feature: 'css-media-resolution', + browsers: browsers + }); +}); // CSS text-align-last + +f(require('caniuse-lite/data/features/css-text-align-last'), function (browsers) { + return prefix(['text-align-last'], { + feature: 'css-text-align-last', + browsers: browsers + }); +}); // Crisp Edges Image Rendering Algorithm + +var crispedges = require('caniuse-lite/data/features/css-crisp-edges'); + +f(crispedges, { + match: /y x|a x #1/ +}, function (browsers) { + return prefix(['pixelated'], { + props: ['image-rendering'], + feature: 'css-crisp-edges', + browsers: browsers + }); +}); +f(crispedges, { + match: /a x #2/ +}, function (browsers) { + return prefix(['image-rendering'], { + feature: 'css-crisp-edges', + browsers: browsers + }); +}); // Logical Properties + +var logicalProps = require('caniuse-lite/data/features/css-logical-props'); + +f(logicalProps, function (browsers) { + return prefix(['border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end'], { + feature: 'css-logical-props', + browsers: browsers + }); +}); +f(logicalProps, { + match: /x\s#2/ +}, function (browsers) { + return prefix(['border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end'], { + feature: 'css-logical-props', + browsers: browsers + }); +}); // CSS appearance + +var appearance = require('caniuse-lite/data/features/css-appearance'); + +f(appearance, { + match: /#2|x/ +}, function (browsers) { + return prefix(['appearance'], { + feature: 'css-appearance', + browsers: browsers + }); +}); // CSS Scroll snap points + +f(require('caniuse-lite/data/features/css-snappoints'), function (browsers) { + return prefix(['scroll-snap-type', 'scroll-snap-coordinate', 'scroll-snap-destination', 'scroll-snap-points-x', 'scroll-snap-points-y'], { + feature: 'css-snappoints', + browsers: browsers + }); +}); // CSS Regions + +f(require('caniuse-lite/data/features/css-regions'), function (browsers) { + return prefix(['flow-into', 'flow-from', 'region-fragment'], { + feature: 'css-regions', + browsers: browsers + }); +}); // CSS image-set + +f(require('caniuse-lite/data/features/css-image-set'), function (browsers) { + return prefix(['image-set'], { + props: ['background', 'background-image', 'border-image', 'cursor', 'mask', 'mask-image', 'list-style', 'list-style-image', 'content'], + feature: 'css-image-set', + browsers: browsers + }); +}); // Writing Mode + +var writingMode = require('caniuse-lite/data/features/css-writing-mode'); + +f(writingMode, { + match: /a|x/ +}, function (browsers) { + return prefix(['writing-mode'], { + feature: 'css-writing-mode', + browsers: browsers + }); +}); // Cross-Fade Function + +f(require('caniuse-lite/data/features/css-cross-fade'), function (browsers) { + return prefix(['cross-fade'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-cross-fade', + browsers: browsers + }); +}); // Read Only selector + +f(require('caniuse-lite/data/features/css-read-only-write'), function (browsers) { + return prefix([':read-only', ':read-write'], { + selector: true, + feature: 'css-read-only-write', + browsers: browsers + }); +}); // Text Emphasize + +f(require('caniuse-lite/data/features/text-emphasis'), function (browsers) { + return prefix(['text-emphasis', 'text-emphasis-position', 'text-emphasis-style', 'text-emphasis-color'], { + feature: 'text-emphasis', + browsers: browsers + }); +}); // CSS Grid Layout + +var grid = require('caniuse-lite/data/features/css-grid'); + +f(grid, function (browsers) { + prefix(['display-grid', 'inline-grid'], { + props: ['display'], + feature: 'css-grid', + browsers: browsers + }); + prefix(['grid-template-columns', 'grid-template-rows', 'grid-row-start', 'grid-column-start', 'grid-row-end', 'grid-column-end', 'grid-row', 'grid-column', 'grid-area', 'grid-template', 'grid-template-areas', 'place-self'], { + feature: 'css-grid', + browsers: browsers + }); +}); +f(grid, { + match: /a x/ +}, function (browsers) { + return prefix(['grid-column-align', 'grid-row-align'], { + feature: 'css-grid', + browsers: browsers + }); +}); // CSS text-spacing + +f(require('caniuse-lite/data/features/css-text-spacing'), function (browsers) { + return prefix(['text-spacing'], { + feature: 'css-text-spacing', + browsers: browsers + }); +}); // :any-link selector + +f(require('caniuse-lite/data/features/css-any-link'), function (browsers) { + return prefix([':any-link'], { + selector: true, + feature: 'css-any-link', + browsers: browsers + }); +}); // unicode-bidi + +var bidi = require('caniuse-lite/data/features/css-unicode-bidi'); + +f(bidi, function (browsers) { + return prefix(['isolate'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); +f(bidi, { + match: /y x|a x #2/ +}, function (browsers) { + return prefix(['plaintext'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); +f(bidi, { + match: /y x/ +}, function (browsers) { + return prefix(['isolate-override'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); // overscroll-behavior selector + +var over = require('caniuse-lite/data/features/css-overscroll-behavior'); + +f(over, { + match: /a #1/ +}, function (browsers) { + return prefix(['overscroll-behavior'], { + feature: 'css-overscroll-behavior', + browsers: browsers + }); +}); // color-adjust + +f(require('caniuse-lite/data/features/css-color-adjust'), function (browsers) { + return prefix(['color-adjust'], { + feature: 'css-color-adjust', + browsers: browsers + }); +}); // text-orientation + +f(require('caniuse-lite/data/features/css-text-orientation'), function (browsers) { + return prefix(['text-orientation'], { + feature: 'css-text-orientation', + browsers: browsers + }); +}); \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/at-rule.js b/website/www/node_modules/autoprefixer/lib/at-rule.js new file mode 100644 index 000000000000..0848478878d2 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/at-rule.js @@ -0,0 +1,74 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +var Prefixer = require('./prefixer'); + +var AtRule = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(AtRule, _Prefixer); + + var _super = _createSuper(AtRule); + + function AtRule() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = AtRule.prototype; + + /** + * Clone and add prefixes for at-rule + */ + _proto.add = function add(rule, prefix) { + var prefixed = prefix + rule.name; + var already = rule.parent.some(function (i) { + return i.name === prefixed && i.params === rule.params; + }); + + if (already) { + return undefined; + } + + var cloned = this.clone(rule, { + name: prefixed + }); + return rule.parent.insertBefore(rule, cloned); + } + /** + * Clone node with prefixes + */ + ; + + _proto.process = function process(node) { + var parent = this.parentPrefix(node); + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + + if (!parent || parent === prefix) { + this.add(node, prefix); + } + } + }; + + return AtRule; +}(Prefixer); + +module.exports = AtRule; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/autoprefixer.js b/website/www/node_modules/autoprefixer/lib/autoprefixer.js new file mode 100644 index 000000000000..85a1ac843df4 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/autoprefixer.js @@ -0,0 +1,153 @@ +"use strict"; + +var browserslist = require('browserslist'); + +var postcss = require('postcss'); + +var agents = require('caniuse-lite').agents; + +var chalk = require('chalk'); + +var Browsers = require('./browsers'); + +var Prefixes = require('./prefixes'); + +var data = require('../data/prefixes'); + +var info = require('./info'); + +var WARNING = '\n' + ' Replace Autoprefixer `browsers` option to Browserslist config.\n' + ' Use `browserslist` key in `package.json` or `.browserslistrc` file.\n' + '\n' + ' Using `browsers` option can cause errors. Browserslist config \n' + ' can be used for Babel, Autoprefixer, postcss-normalize and other tools.\n' + '\n' + ' If you really need to use option, rename it to `overrideBrowserslist`.\n' + '\n' + ' Learn more at:\n' + ' https://github.com/browserslist/browserslist#readme\n' + ' https://twitter.com/browserslist\n' + '\n'; + +function isPlainObject(obj) { + return Object.prototype.toString.apply(obj) === '[object Object]'; +} + +var cache = {}; + +function timeCapsule(result, prefixes) { + if (prefixes.browsers.selected.length === 0) { + return; + } + + if (prefixes.add.selectors.length > 0) { + return; + } + + if (Object.keys(prefixes.add).length > 2) { + return; + } + /* istanbul ignore next */ + + + result.warn('Greetings, time traveller. ' + 'We are in the golden age of prefix-less CSS, ' + 'where Autoprefixer is no longer needed for your stylesheet.'); +} + +module.exports = postcss.plugin('autoprefixer', function () { + for (var _len = arguments.length, reqs = new Array(_len), _key = 0; _key < _len; _key++) { + reqs[_key] = arguments[_key]; + } + + var options; + + if (reqs.length === 1 && isPlainObject(reqs[0])) { + options = reqs[0]; + reqs = undefined; + } else if (reqs.length === 0 || reqs.length === 1 && !reqs[0]) { + reqs = undefined; + } else if (reqs.length <= 2 && (Array.isArray(reqs[0]) || !reqs[0])) { + options = reqs[1]; + reqs = reqs[0]; + } else if (typeof reqs[reqs.length - 1] === 'object') { + options = reqs.pop(); + } + + if (!options) { + options = {}; + } + + if (options.browser) { + throw new Error('Change `browser` option to `overrideBrowserslist` in Autoprefixer'); + } else if (options.browserslist) { + throw new Error('Change `browserslist` option to `overrideBrowserslist` in Autoprefixer'); + } + + if (options.overrideBrowserslist) { + reqs = options.overrideBrowserslist; + } else if (options.browsers) { + if (typeof console !== 'undefined' && console.warn) { + if (chalk && chalk.red) { + console.warn(chalk.red(WARNING.replace(/`[^`]+`/g, function (i) { + return chalk.yellow(i.slice(1, -1)); + }))); + } else { + console.warn(WARNING); + } + } + + reqs = options.browsers; + } + + var brwlstOpts = { + ignoreUnknownVersions: options.ignoreUnknownVersions, + stats: options.stats + }; + + function loadPrefixes(opts) { + var d = module.exports.data; + var browsers = new Browsers(d.browsers, reqs, opts, brwlstOpts); + var key = browsers.selected.join(', ') + JSON.stringify(options); + + if (!cache[key]) { + cache[key] = new Prefixes(d.prefixes, browsers, options); + } + + return cache[key]; + } + + function plugin(css, result) { + var prefixes = loadPrefixes({ + from: css.source && css.source.input.file, + env: options.env + }); + timeCapsule(result, prefixes); + + if (options.remove !== false) { + prefixes.processor.remove(css, result); + } + + if (options.add !== false) { + prefixes.processor.add(css, result); + } + } + + plugin.options = options; + plugin.browsers = reqs; + + plugin.info = function (opts) { + opts = opts || {}; + opts.from = opts.from || process.cwd(); + return info(loadPrefixes(opts)); + }; + + return plugin; +}); +/** + * Autoprefixer data + */ + +module.exports.data = { + browsers: agents, + prefixes: data +}; +/** + * Autoprefixer default browsers + */ + +module.exports.defaults = browserslist.defaults; +/** + * Inspect with default Autoprefixer + */ + +module.exports.info = function () { + return module.exports().info(); +}; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/brackets.js b/website/www/node_modules/autoprefixer/lib/brackets.js new file mode 100644 index 000000000000..2aa8a551d5c5 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/brackets.js @@ -0,0 +1,64 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function last(array) { + return array[array.length - 1]; +} + +var brackets = { + /** + * Parse string to nodes tree + */ + parse: function parse(str) { + var current = ['']; + var stack = [current]; + + for (var _iterator = _createForOfIteratorHelperLoose(str), _step; !(_step = _iterator()).done;) { + var sym = _step.value; + + if (sym === '(') { + current = ['']; + last(stack).push(current); + stack.push(current); + continue; + } + + if (sym === ')') { + stack.pop(); + current = last(stack); + current.push(''); + continue; + } + + current[current.length - 1] += sym; + } + + return stack[0]; + }, + + /** + * Generate output string by nodes tree + */ + stringify: function stringify(ast) { + var result = ''; + + for (var _iterator2 = _createForOfIteratorHelperLoose(ast), _step2; !(_step2 = _iterator2()).done;) { + var i = _step2.value; + + if (typeof i === 'object') { + result += "(" + brackets.stringify(i) + ")"; + continue; + } + + result += i; + } + + return result; + } +}; +module.exports = brackets; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/browsers.js b/website/www/node_modules/autoprefixer/lib/browsers.js new file mode 100644 index 000000000000..b2bf02f5282e --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/browsers.js @@ -0,0 +1,97 @@ +"use strict"; + +var browserslist = require('browserslist'); + +var agents = require('caniuse-lite').agents; + +var utils = require('./utils'); + +var Browsers = /*#__PURE__*/function () { + /** + * Return all prefixes for default browser data + */ + Browsers.prefixes = function prefixes() { + if (this.prefixesCache) { + return this.prefixesCache; + } + + this.prefixesCache = []; + + for (var name in agents) { + this.prefixesCache.push("-" + agents[name].prefix + "-"); + } + + this.prefixesCache = utils.uniq(this.prefixesCache).sort(function (a, b) { + return b.length - a.length; + }); + return this.prefixesCache; + } + /** + * Check is value contain any possible prefix + */ + ; + + Browsers.withPrefix = function withPrefix(value) { + if (!this.prefixesRegexp) { + this.prefixesRegexp = new RegExp(this.prefixes().join('|')); + } + + return this.prefixesRegexp.test(value); + }; + + function Browsers(data, requirements, options, browserslistOpts) { + this.data = data; + this.options = options || {}; + this.browserslistOpts = browserslistOpts || {}; + this.selected = this.parse(requirements); + } + /** + * Return browsers selected by requirements + */ + + + var _proto = Browsers.prototype; + + _proto.parse = function parse(requirements) { + var opts = {}; + + for (var i in this.browserslistOpts) { + opts[i] = this.browserslistOpts[i]; + } + + opts.path = this.options.from; + opts.env = this.options.env; + return browserslist(requirements, opts); + } + /** + * Return prefix for selected browser + */ + ; + + _proto.prefix = function prefix(browser) { + var _browser$split = browser.split(' '), + name = _browser$split[0], + version = _browser$split[1]; + + var data = this.data[name]; + var prefix = data.prefix_exceptions && data.prefix_exceptions[version]; + + if (!prefix) { + prefix = data.prefix; + } + + return "-" + prefix + "-"; + } + /** + * Is browser is selected by requirements + */ + ; + + _proto.isSelected = function isSelected(browser) { + return this.selected.includes(browser); + }; + + return Browsers; +}(); + +module.exports = Browsers; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/declaration.js b/website/www/node_modules/autoprefixer/lib/declaration.js new file mode 100644 index 000000000000..bd8f87a641a7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/declaration.js @@ -0,0 +1,255 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +var Prefixer = require('./prefixer'); + +var Browsers = require('./browsers'); + +var utils = require('./utils'); + +var Declaration = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Declaration, _Prefixer); + + var _super = _createSuper(Declaration); + + function Declaration() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = Declaration.prototype; + + /** + * Always true, because we already get prefixer by property name + */ + _proto.check = function check() + /* decl */ + { + return true; + } + /** + * Return prefixed version of property + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + prop; + } + /** + * Return unprefixed version of property + */ + ; + + _proto.normalize = function normalize(prop) { + return prop; + } + /** + * Check `value`, that it contain other prefixes, rather than `prefix` + */ + ; + + _proto.otherPrefixes = function otherPrefixes(value, prefix) { + for (var _iterator = _createForOfIteratorHelperLoose(Browsers.prefixes()), _step; !(_step = _iterator()).done;) { + var other = _step.value; + + if (other === prefix) { + continue; + } + + if (value.includes(other)) { + return true; + } + } + + return false; + } + /** + * Set prefix to declaration + */ + ; + + _proto.set = function set(decl, prefix) { + decl.prop = this.prefixed(decl.prop, prefix); + return decl; + } + /** + * Should we use visual cascade for prefixes + */ + ; + + _proto.needCascade = function needCascade(decl) { + if (!decl._autoprefixerCascade) { + decl._autoprefixerCascade = this.all.options.cascade !== false && decl.raw('before').includes('\n'); + } + + return decl._autoprefixerCascade; + } + /** + * Return maximum length of possible prefixed property + */ + ; + + _proto.maxPrefixed = function maxPrefixed(prefixes, decl) { + if (decl._autoprefixerMax) { + return decl._autoprefixerMax; + } + + var max = 0; + + for (var _iterator2 = _createForOfIteratorHelperLoose(prefixes), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + prefix = utils.removeNote(prefix); + + if (prefix.length > max) { + max = prefix.length; + } + } + + decl._autoprefixerMax = max; + return decl._autoprefixerMax; + } + /** + * Calculate indentation to create visual cascade + */ + ; + + _proto.calcBefore = function calcBefore(prefixes, decl, prefix) { + if (prefix === void 0) { + prefix = ''; + } + + var max = this.maxPrefixed(prefixes, decl); + var diff = max - utils.removeNote(prefix).length; + var before = decl.raw('before'); + + if (diff > 0) { + before += Array(diff).fill(' ').join(''); + } + + return before; + } + /** + * Remove visual cascade + */ + ; + + _proto.restoreBefore = function restoreBefore(decl) { + var lines = decl.raw('before').split('\n'); + var min = lines[lines.length - 1]; + this.all.group(decl).up(function (prefixed) { + var array = prefixed.raw('before').split('\n'); + var last = array[array.length - 1]; + + if (last.length < min.length) { + min = last; + } + }); + lines[lines.length - 1] = min; + decl.raws.before = lines.join('\n'); + } + /** + * Clone and insert new declaration + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + var cloned = this.set(this.clone(decl), prefix); + if (!cloned) return undefined; + var already = decl.parent.some(function (i) { + return i.prop === cloned.prop && i.value === cloned.value; + }); + + if (already) { + return undefined; + } + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + } + /** + * Did this declaration has this prefix above + */ + ; + + _proto.isAlready = function isAlready(decl, prefixed) { + var already = this.all.group(decl).up(function (i) { + return i.prop === prefixed; + }); + + if (!already) { + already = this.all.group(decl).down(function (i) { + return i.prop === prefixed; + }); + } + + return already; + } + /** + * Clone and add prefixes for declaration + */ + ; + + _proto.add = function add(decl, prefix, prefixes, result) { + var prefixed = this.prefixed(decl.prop, prefix); + + if (this.isAlready(decl, prefixed) || this.otherPrefixes(decl.value, prefix)) { + return undefined; + } + + return this.insert(decl, prefix, prefixes, result); + } + /** + * Add spaces for visual cascade + */ + ; + + _proto.process = function process(decl, result) { + if (!this.needCascade(decl)) { + _Prefixer.prototype.process.call(this, decl, result); + + return; + } + + var prefixes = _Prefixer.prototype.process.call(this, decl, result); + + if (!prefixes || !prefixes.length) { + return; + } + + this.restoreBefore(decl); + decl.raws.before = this.calcBefore(prefixes, decl); + } + /** + * Return list of prefixed properties to clean old prefixes + */ + ; + + _proto.old = function old(prop, prefix) { + return [this.prefixed(prop, prefix)]; + }; + + return Declaration; +}(Prefixer); + +module.exports = Declaration; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/align-content.js b/website/www/node_modules/autoprefixer/lib/hacks/align-content.js new file mode 100644 index 000000000000..1039fb58a88c --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/align-content.js @@ -0,0 +1,91 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignContent = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignContent, _Declaration); + + var _super = _createSuper(AlignContent); + + function AlignContent() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignContent.prototype; + + /** + * Change property name for 2012 spec + */ + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-line-pack'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-content'; + } + /** + * Change value for 2012 spec and ignore prefix for 2009 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2012) { + decl.value = AlignContent.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return AlignContent; +}(Declaration); + +_defineProperty(AlignContent, "names", ['align-content', 'flex-line-pack']); + +_defineProperty(AlignContent, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' +}); + +module.exports = AlignContent; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/align-items.js b/website/www/node_modules/autoprefixer/lib/hacks/align-items.js new file mode 100644 index 000000000000..0f47986dd905 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/align-items.js @@ -0,0 +1,88 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignItems = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignItems, _Declaration); + + var _super = _createSuper(AlignItems); + + function AlignItems() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignItems.prototype; + + /** + * Change property name for 2009 and 2012 specs + */ + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-align'; + } + + if (spec === 2012) { + return prefix + 'flex-align'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-items'; + } + /** + * Change value for 2009 and 2012 specs + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 || spec === 2012) { + decl.value = AlignItems.oldValues[decl.value] || decl.value; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return AlignItems; +}(Declaration); + +_defineProperty(AlignItems, "names", ['align-items', 'flex-align', 'box-align']); + +_defineProperty(AlignItems, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start' +}); + +module.exports = AlignItems; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/align-self.js b/website/www/node_modules/autoprefixer/lib/hacks/align-self.js new file mode 100644 index 000000000000..853c3dcb16be --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/align-self.js @@ -0,0 +1,96 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignSelf = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignSelf, _Declaration); + + var _super = _createSuper(AlignSelf); + + function AlignSelf() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignSelf.prototype; + + _proto.check = function check(decl) { + return decl.parent && !decl.parent.some(function (i) { + return i.prop && i.prop.startsWith('grid-'); + }); + } + /** + * Change property name for 2012 specs + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-item-align'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-self'; + } + /** + * Change value for 2012 spec and ignore prefix for 2009 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2012) { + decl.value = AlignSelf.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return AlignSelf; +}(Declaration); + +_defineProperty(AlignSelf, "names", ['align-self', 'flex-item-align']); + +_defineProperty(AlignSelf, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start' +}); + +module.exports = AlignSelf; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/animation.js b/website/www/node_modules/autoprefixer/lib/hacks/animation.js new file mode 100644 index 000000000000..6d960b9701c7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/animation.js @@ -0,0 +1,47 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var Animation = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Animation, _Declaration); + + var _super = _createSuper(Animation); + + function Animation() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Animation.prototype; + + /** + * Don’t add prefixes for modern values. + */ + _proto.check = function check(decl) { + return !decl.value.split(/\s+/).some(function (i) { + var lower = i.toLowerCase(); + return lower === 'reverse' || lower === 'alternate-reverse'; + }); + }; + + return Animation; +}(Declaration); + +_defineProperty(Animation, "names", ['animation', 'animation-direction']); + +module.exports = Animation; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/appearance.js b/website/www/node_modules/autoprefixer/lib/hacks/appearance.js new file mode 100644 index 000000000000..eb72a73b9150 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/appearance.js @@ -0,0 +1,51 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var Appearance = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Appearance, _Declaration); + + var _super = _createSuper(Appearance); + + function Appearance(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + if (i === '-ms-') { + return '-webkit-'; + } + + return i; + })); + } + + return _this; + } + + return Appearance; +}(Declaration); + +_defineProperty(Appearance, "names", ['appearance']); + +module.exports = Appearance; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/backdrop-filter.js b/website/www/node_modules/autoprefixer/lib/hacks/backdrop-filter.js new file mode 100644 index 000000000000..c62a3cdcd72c --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/backdrop-filter.js @@ -0,0 +1,47 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var BackdropFilter = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackdropFilter, _Declaration); + + var _super = _createSuper(BackdropFilter); + + function BackdropFilter(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + return i === '-ms-' ? '-webkit-' : i; + })); + } + + return _this; + } + + return BackdropFilter; +}(Declaration); + +_defineProperty(BackdropFilter, "names", ['backdrop-filter']); + +module.exports = BackdropFilter; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/background-clip.js b/website/www/node_modules/autoprefixer/lib/hacks/background-clip.js new file mode 100644 index 000000000000..ea43794fe4d7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/background-clip.js @@ -0,0 +1,53 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var BackgroundClip = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackgroundClip, _Declaration); + + var _super = _createSuper(BackgroundClip); + + function BackgroundClip(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + return i === '-ms-' ? '-webkit-' : i; + })); + } + + return _this; + } + + var _proto = BackgroundClip.prototype; + + _proto.check = function check(decl) { + return decl.value.toLowerCase() === 'text'; + }; + + return BackgroundClip; +}(Declaration); + +_defineProperty(BackgroundClip, "names", ['background-clip']); + +module.exports = BackgroundClip; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/background-size.js b/website/www/node_modules/autoprefixer/lib/hacks/background-size.js new file mode 100644 index 000000000000..ce954403c1b1 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/background-size.js @@ -0,0 +1,50 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BackgroundSize = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackgroundSize, _Declaration); + + var _super = _createSuper(BackgroundSize); + + function BackgroundSize() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BackgroundSize.prototype; + + /** + * Duplication parameter for -webkit- browsers + */ + _proto.set = function set(decl, prefix) { + var value = decl.value.toLowerCase(); + + if (prefix === '-webkit-' && !value.includes(' ') && value !== 'contain' && value !== 'cover') { + decl.value = decl.value + ' ' + decl.value; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return BackgroundSize; +}(Declaration); + +_defineProperty(BackgroundSize, "names", ['background-size']); + +module.exports = BackgroundSize; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/block-logical.js b/website/www/node_modules/autoprefixer/lib/hacks/block-logical.js new file mode 100644 index 000000000000..3dc244eb11e2 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/block-logical.js @@ -0,0 +1,60 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BlockLogical = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BlockLogical, _Declaration); + + var _super = _createSuper(BlockLogical); + + function BlockLogical() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BlockLogical.prototype; + + /** + * Use old syntax for -moz- and -webkit- + */ + _proto.prefixed = function prefixed(prop, prefix) { + if (prop.includes('-start')) { + return prefix + prop.replace('-block-start', '-before'); + } + + return prefix + prop.replace('-block-end', '-after'); + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize(prop) { + if (prop.includes('-before')) { + return prop.replace('-before', '-block-start'); + } + + return prop.replace('-after', '-block-end'); + }; + + return BlockLogical; +}(Declaration); + +_defineProperty(BlockLogical, "names", ['border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end', 'border-before', 'border-after', 'margin-before', 'margin-after', 'padding-before', 'padding-after']); + +module.exports = BlockLogical; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/border-image.js b/website/www/node_modules/autoprefixer/lib/hacks/border-image.js new file mode 100644 index 000000000000..e31eb52ae3e6 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/border-image.js @@ -0,0 +1,45 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BorderImage = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BorderImage, _Declaration); + + var _super = _createSuper(BorderImage); + + function BorderImage() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BorderImage.prototype; + + /** + * Remove fill parameter for prefixed declarations + */ + _proto.set = function set(decl, prefix) { + decl.value = decl.value.replace(/\s+fill(\s)/, '$1'); + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return BorderImage; +}(Declaration); + +_defineProperty(BorderImage, "names", ['border-image']); + +module.exports = BorderImage; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/border-radius.js b/website/www/node_modules/autoprefixer/lib/hacks/border-radius.js new file mode 100644 index 000000000000..f03a07e2fe89 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/border-radius.js @@ -0,0 +1,74 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BorderRadius = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BorderRadius, _Declaration); + + var _super = _createSuper(BorderRadius); + + function BorderRadius() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BorderRadius.prototype; + + /** + * Change syntax, when add Mozilla prefix + */ + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-moz-') { + return prefix + (BorderRadius.toMozilla[prop] || prop); + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return unprefixed version of property + */ + ; + + _proto.normalize = function normalize(prop) { + return BorderRadius.toNormal[prop] || prop; + }; + + return BorderRadius; +}(Declaration); + +_defineProperty(BorderRadius, "names", ['border-radius']); + +_defineProperty(BorderRadius, "toMozilla", {}); + +_defineProperty(BorderRadius, "toNormal", {}); + +for (var _i = 0, _arr = ['top', 'bottom']; _i < _arr.length; _i++) { + var ver = _arr[_i]; + + for (var _i2 = 0, _arr2 = ['left', 'right']; _i2 < _arr2.length; _i2++) { + var hor = _arr2[_i2]; + var normal = "border-" + ver + "-" + hor + "-radius"; + var mozilla = "border-radius-" + ver + hor; + BorderRadius.names.push(normal); + BorderRadius.names.push(mozilla); + BorderRadius.toMozilla[normal] = mozilla; + BorderRadius.toNormal[mozilla] = normal; + } +} + +module.exports = BorderRadius; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/break-props.js b/website/www/node_modules/autoprefixer/lib/hacks/break-props.js new file mode 100644 index 000000000000..8279d8f42e89 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/break-props.js @@ -0,0 +1,88 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BreakProps = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BreakProps, _Declaration); + + var _super = _createSuper(BreakProps); + + function BreakProps() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BreakProps.prototype; + + /** + * Change name for -webkit- and -moz- prefix + */ + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + "column-" + prop; + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize(prop) { + if (prop.includes('inside')) { + return 'break-inside'; + } + + if (prop.includes('before')) { + return 'break-before'; + } + + return 'break-after'; + } + /** + * Change prefixed value for avoid-column and avoid-page + */ + ; + + _proto.set = function set(decl, prefix) { + if (decl.prop === 'break-inside' && decl.value === 'avoid-column' || decl.value === 'avoid-page') { + decl.value = 'avoid'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + } + /** + * Don’t prefix some values + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (decl.prop !== 'break-inside') { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + if (/region/i.test(decl.value) || /page/i.test(decl.value)) { + return undefined; + } + + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + }; + + return BreakProps; +}(Declaration); + +_defineProperty(BreakProps, "names", ['break-inside', 'page-break-inside', 'column-break-inside', 'break-before', 'page-break-before', 'column-break-before', 'break-after', 'page-break-after', 'column-break-after']); + +module.exports = BreakProps; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/color-adjust.js b/website/www/node_modules/autoprefixer/lib/hacks/color-adjust.js new file mode 100644 index 000000000000..769f19dc27cb --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/color-adjust.js @@ -0,0 +1,52 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var ColorAdjust = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(ColorAdjust, _Declaration); + + var _super = _createSuper(ColorAdjust); + + function ColorAdjust() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = ColorAdjust.prototype; + + /** + * Change property name for WebKit-based browsers + */ + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'print-color-adjust'; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'color-adjust'; + }; + + return ColorAdjust; +}(Declaration); + +_defineProperty(ColorAdjust, "names", ['color-adjust', 'print-color-adjust']); + +module.exports = ColorAdjust; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/cross-fade.js b/website/www/node_modules/autoprefixer/lib/hacks/cross-fade.js new file mode 100644 index 000000000000..5e203ffda456 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/cross-fade.js @@ -0,0 +1,66 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var list = require('postcss').list; + +var Value = require('../value'); + +var CrossFade = /*#__PURE__*/function (_Value) { + _inheritsLoose(CrossFade, _Value); + + var _super = _createSuper(CrossFade); + + function CrossFade() { + return _Value.apply(this, arguments) || this; + } + + var _proto = CrossFade.prototype; + + _proto.replace = function replace(string, prefix) { + var _this = this; + + return list.space(string).map(function (value) { + if (value.slice(0, +_this.name.length + 1) !== _this.name + '(') { + return value; + } + + var close = value.lastIndexOf(')'); + var after = value.slice(close + 1); + var args = value.slice(_this.name.length + 1, close); + + if (prefix === '-webkit-') { + var match = args.match(/\d*.?\d+%?/); + + if (match) { + args = args.slice(match[0].length).trim(); + args += ", " + match[0]; + } else { + args += ', 0.5'; + } + } + + return prefix + _this.name + '(' + args + ')' + after; + }).join(' '); + }; + + return CrossFade; +}(Value); + +_defineProperty(CrossFade, "names", ['cross-fade']); + +module.exports = CrossFade; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/display-flex.js b/website/www/node_modules/autoprefixer/lib/hacks/display-flex.js new file mode 100644 index 000000000000..b2287ea27a23 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/display-flex.js @@ -0,0 +1,106 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var DisplayFlex = /*#__PURE__*/function (_Value) { + _inheritsLoose(DisplayFlex, _Value); + + var _super = _createSuper(DisplayFlex); + + function DisplayFlex(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'display-flex') { + _this.name = 'flex'; + } + + return _this; + } + /** + * Faster check for flex value + */ + + + var _proto = DisplayFlex.prototype; + + _proto.check = function check(decl) { + return decl.prop === 'display' && decl.value === this.name; + } + /** + * Return value by spec + */ + ; + + _proto.prefixed = function prefixed(prefix) { + var spec, value; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + if (this.name === 'flex') { + value = 'box'; + } else { + value = 'inline-box'; + } + } else if (spec === 2012) { + if (this.name === 'flex') { + value = 'flexbox'; + } else { + value = 'inline-flexbox'; + } + } else if (spec === 'final') { + value = this.name; + } + + return prefix + value; + } + /** + * Add prefix to value depend on flebox spec version + */ + ; + + _proto.replace = function replace(string, prefix) { + return this.prefixed(prefix); + } + /** + * Change value for old specs + */ + ; + + _proto.old = function old(prefix) { + var prefixed = this.prefixed(prefix); + if (!prefixed) return undefined; + return new OldValue(this.name, prefixed); + }; + + return DisplayFlex; +}(Value); + +_defineProperty(DisplayFlex, "names", ['display-flex', 'inline-flex']); + +module.exports = DisplayFlex; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/display-grid.js b/website/www/node_modules/autoprefixer/lib/hacks/display-grid.js new file mode 100644 index 000000000000..f55ad1a19549 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/display-grid.js @@ -0,0 +1,53 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Value = require('../value'); + +var DisplayGrid = /*#__PURE__*/function (_Value) { + _inheritsLoose(DisplayGrid, _Value); + + var _super = _createSuper(DisplayGrid); + + function DisplayGrid(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'display-grid') { + _this.name = 'grid'; + } + + return _this; + } + /** + * Faster check for flex value + */ + + + var _proto = DisplayGrid.prototype; + + _proto.check = function check(decl) { + return decl.prop === 'display' && decl.value === this.name; + }; + + return DisplayGrid; +}(Value); + +_defineProperty(DisplayGrid, "names", ['display-grid', 'inline-grid']); + +module.exports = DisplayGrid; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/filter-value.js b/website/www/node_modules/autoprefixer/lib/hacks/filter-value.js new file mode 100644 index 000000000000..10b970df6186 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/filter-value.js @@ -0,0 +1,43 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Value = require('../value'); + +var FilterValue = /*#__PURE__*/function (_Value) { + _inheritsLoose(FilterValue, _Value); + + var _super = _createSuper(FilterValue); + + function FilterValue(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'filter-function') { + _this.name = 'filter'; + } + + return _this; + } + + return FilterValue; +}(Value); + +_defineProperty(FilterValue, "names", ['filter', 'filter-function']); + +module.exports = FilterValue; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/filter.js b/website/www/node_modules/autoprefixer/lib/hacks/filter.js new file mode 100644 index 000000000000..f8a9d6be2bca --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/filter.js @@ -0,0 +1,45 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var Filter = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Filter, _Declaration); + + var _super = _createSuper(Filter); + + function Filter() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Filter.prototype; + + /** + * Check is it Internet Explorer filter + */ + _proto.check = function check(decl) { + var v = decl.value; + return !v.toLowerCase().includes('alpha(') && !v.includes('DXImageTransform.Microsoft') && !v.includes('data:image/svg+xml'); + }; + + return Filter; +}(Declaration); + +_defineProperty(Filter, "names", ['filter']); + +module.exports = Filter; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-basis.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-basis.js new file mode 100644 index 000000000000..c7ad2348c90e --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-basis.js @@ -0,0 +1,84 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexBasis = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexBasis, _Declaration); + + var _super = _createSuper(FlexBasis); + + function FlexBasis() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexBasis.prototype; + + /** + * Return property name by final spec + */ + _proto.normalize = function normalize() { + return 'flex-basis'; + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-preferred-size'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Ignore 2009 spec and use flex property for 2012 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2012 || spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexBasis; +}(Declaration); + +_defineProperty(FlexBasis, "names", ['flex-basis', 'flex-preferred-size']); + +module.exports = FlexBasis; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-direction.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-direction.js new file mode 100644 index 000000000000..a49f5bec7d8f --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-direction.js @@ -0,0 +1,120 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexDirection = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexDirection, _Declaration); + + var _super = _createSuper(FlexDirection); + + function FlexDirection() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexDirection.prototype; + + /** + * Return property name by final spec + */ + _proto.normalize = function normalize() { + return 'flex-direction'; + } + /** + * Use two properties for 2009 spec + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec !== 2009) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + var already = decl.parent.some(function (i) { + return i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'; + }); + + if (already) { + return undefined; + } + + var v = decl.value; + var orient, dir; + + if (v === 'inherit' || v === 'initial' || v === 'unset') { + orient = v; + dir = v; + } else { + orient = v.includes('row') ? 'horizontal' : 'vertical'; + dir = v.includes('reverse') ? 'reverse' : 'normal'; + } + + var cloned = this.clone(decl); + cloned.prop = prefix + 'box-orient'; + cloned.value = orient; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + cloned = this.clone(decl); + cloned.prop = prefix + 'box-direction'; + cloned.value = dir; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + } + /** + * Clean two properties for 2009 spec + */ + ; + + _proto.old = function old(prop, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2009) { + return [prefix + 'box-orient', prefix + 'box-direction']; + } else { + return _Declaration.prototype.old.call(this, prop, prefix); + } + }; + + return FlexDirection; +}(Declaration); + +_defineProperty(FlexDirection, "names", ['flex-direction', 'box-direction', 'box-orient']); + +module.exports = FlexDirection; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-flow.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-flow.js new file mode 100644 index 000000000000..2b95fbdf4b2b --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-flow.js @@ -0,0 +1,93 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexFlow = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexFlow, _Declaration); + + var _super = _createSuper(FlexFlow); + + function FlexFlow() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexFlow.prototype; + + /** + * Use two properties for 2009 spec + */ + _proto.insert = function insert(decl, prefix, prefixes) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec !== 2009) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + var values = decl.value.split(/\s+/).filter(function (i) { + return i !== 'wrap' && i !== 'nowrap' && 'wrap-reverse'; + }); + + if (values.length === 0) { + return undefined; + } + + var already = decl.parent.some(function (i) { + return i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'; + }); + + if (already) { + return undefined; + } + + var value = values[0]; + var orient = value.includes('row') ? 'horizontal' : 'vertical'; + var dir = value.includes('reverse') ? 'reverse' : 'normal'; + var cloned = this.clone(decl); + cloned.prop = prefix + 'box-orient'; + cloned.value = orient; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + cloned = this.clone(decl); + cloned.prop = prefix + 'box-direction'; + cloned.value = dir; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + }; + + return FlexFlow; +}(Declaration); + +_defineProperty(FlexFlow, "names", ['flex-flow', 'box-direction', 'box-orient']); + +module.exports = FlexFlow; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-grow.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-grow.js new file mode 100644 index 000000000000..29e592f585a9 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-grow.js @@ -0,0 +1,69 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Flex = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Flex, _Declaration); + + var _super = _createSuper(Flex); + + function Flex() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Flex.prototype; + + /** + * Return property name by final spec + */ + _proto.normalize = function normalize() { + return 'flex'; + } + /** + * Return flex property for 2009 and 2012 specs + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-flex'; + } + + if (spec === 2012) { + return prefix + 'flex-positive'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + }; + + return Flex; +}(Declaration); + +_defineProperty(Flex, "names", ['flex-grow', 'flex-positive']); + +module.exports = Flex; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-shrink.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-shrink.js new file mode 100644 index 000000000000..4b1089a8d480 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-shrink.js @@ -0,0 +1,84 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexShrink = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexShrink, _Declaration); + + var _super = _createSuper(FlexShrink); + + function FlexShrink() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexShrink.prototype; + + /** + * Return property name by final spec + */ + _proto.normalize = function normalize() { + return 'flex-shrink'; + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-negative'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Ignore 2009 spec and use flex property for 2012 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2012 || spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexShrink; +}(Declaration); + +_defineProperty(FlexShrink, "names", ['flex-shrink', 'flex-negative']); + +module.exports = FlexShrink; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-spec.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-spec.js new file mode 100644 index 000000000000..d73027a71b2f --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-spec.js @@ -0,0 +1,22 @@ +"use strict"; + +/** + * Return flexbox spec versions by prefix + */ +module.exports = function (prefix) { + var spec; + + if (prefix === '-webkit- 2009' || prefix === '-moz-') { + spec = 2009; + } else if (prefix === '-ms-') { + spec = 2012; + } else if (prefix === '-webkit-') { + spec = 'final'; + } + + if (prefix === '-webkit- 2009') { + prefix = '-webkit-'; + } + + return [spec, prefix]; +}; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex-wrap.js b/website/www/node_modules/autoprefixer/lib/hacks/flex-wrap.js new file mode 100644 index 000000000000..c2cf5e5c85a1 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex-wrap.js @@ -0,0 +1,52 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexWrap = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexWrap, _Declaration); + + var _super = _createSuper(FlexWrap); + + function FlexWrap() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexWrap.prototype; + + /** + * Don't add prefix for 2009 spec + */ + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec !== 2009) { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexWrap; +}(Declaration); + +_defineProperty(FlexWrap, "names", ['flex-wrap']); + +module.exports = FlexWrap; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/flex.js b/website/www/node_modules/autoprefixer/lib/hacks/flex.js new file mode 100644 index 000000000000..b3d19414a0db --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/flex.js @@ -0,0 +1,97 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var list = require('postcss').list; + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Flex = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Flex, _Declaration); + + var _super = _createSuper(Flex); + + function Flex() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Flex.prototype; + + /** + * Change property name for 2009 spec + */ + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-flex'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'flex'; + } + /** + * Spec 2009 supports only first argument + * Spec 2012 disallows unitless basis + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009) { + decl.value = list.space(decl.value)[0]; + decl.value = Flex.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 2012) { + var components = list.space(decl.value); + + if (components.length === 3 && components[2] === '0') { + decl.value = components.slice(0, 2).concat('0px').join(' '); + } + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return Flex; +}(Declaration); + +_defineProperty(Flex, "names", ['flex', 'box-flex']); + +_defineProperty(Flex, "oldValues", { + auto: '1', + none: '0' +}); + +module.exports = Flex; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/fullscreen.js b/website/www/node_modules/autoprefixer/lib/hacks/fullscreen.js new file mode 100644 index 000000000000..2c489fa14675 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/fullscreen.js @@ -0,0 +1,52 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Selector = require('../selector'); + +var Fullscreen = /*#__PURE__*/function (_Selector) { + _inheritsLoose(Fullscreen, _Selector); + + var _super = _createSuper(Fullscreen); + + function Fullscreen() { + return _Selector.apply(this, arguments) || this; + } + + var _proto = Fullscreen.prototype; + + /** + * Return different selectors depend on prefix + */ + _proto.prefixed = function prefixed(prefix) { + if (prefix === '-webkit-') { + return ':-webkit-full-screen'; + } + + if (prefix === '-moz-') { + return ':-moz-full-screen'; + } + + return ":" + prefix + "fullscreen"; + }; + + return Fullscreen; +}(Selector); + +_defineProperty(Fullscreen, "names", [':fullscreen']); + +module.exports = Fullscreen; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/gradient.js b/website/www/node_modules/autoprefixer/lib/hacks/gradient.js new file mode 100644 index 000000000000..69f3e7534673 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/gradient.js @@ -0,0 +1,529 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var parser = require('postcss-value-parser'); + +var range = require('normalize-range'); + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var utils = require('../utils'); + +var IS_DIRECTION = /top|left|right|bottom/gi; + +var Gradient = /*#__PURE__*/function (_Value) { + _inheritsLoose(Gradient, _Value); + + var _super = _createSuper(Gradient); + + function Gradient() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Value.call.apply(_Value, [this].concat(args)) || this; + + _defineProperty(_assertThisInitialized(_this), "directions", { + top: 'bottom', + left: 'right', + bottom: 'top', + right: 'left' + }); + + _defineProperty(_assertThisInitialized(_this), "oldDirections", { + 'top': 'left bottom, left top', + 'left': 'right top, left top', + 'bottom': 'left top, left bottom', + 'right': 'left top, right top', + 'top right': 'left bottom, right top', + 'top left': 'right bottom, left top', + 'right top': 'left bottom, right top', + 'right bottom': 'left top, right bottom', + 'bottom right': 'left top, right bottom', + 'bottom left': 'right top, left bottom', + 'left top': 'right bottom, left top', + 'left bottom': 'right top, left bottom' + }); + + return _this; + } + + var _proto = Gradient.prototype; + + /** + * Change degrees for webkit prefix + */ + _proto.replace = function replace(string, prefix) { + var ast = parser(string); + + for (var _iterator = _createForOfIteratorHelperLoose(ast.nodes), _step; !(_step = _iterator()).done;) { + var node = _step.value; + + if (node.type === 'function' && node.value === this.name) { + node.nodes = this.newDirection(node.nodes); + node.nodes = this.normalize(node.nodes); + + if (prefix === '-webkit- old') { + var changes = this.oldWebkit(node); + + if (!changes) { + return false; + } + } else { + node.nodes = this.convertDirection(node.nodes); + node.value = prefix + node.value; + } + } + } + + return ast.toString(); + } + /** + * Replace first token + */ + ; + + _proto.replaceFirst = function replaceFirst(params) { + for (var _len2 = arguments.length, words = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + words[_key2 - 1] = arguments[_key2]; + } + + var prefix = words.map(function (i) { + if (i === ' ') { + return { + type: 'space', + value: i + }; + } + + return { + type: 'word', + value: i + }; + }); + return prefix.concat(params.slice(1)); + } + /** + * Convert angle unit to deg + */ + ; + + _proto.normalizeUnit = function normalizeUnit(str, full) { + var num = parseFloat(str); + var deg = num / full * 360; + return deg + "deg"; + } + /** + * Normalize angle + */ + ; + + _proto.normalize = function normalize(nodes) { + if (!nodes[0]) return nodes; + + if (/-?\d+(.\d+)?grad/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 400); + } else if (/-?\d+(.\d+)?rad/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 2 * Math.PI); + } else if (/-?\d+(.\d+)?turn/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 1); + } else if (nodes[0].value.includes('deg')) { + var num = parseFloat(nodes[0].value); + num = range.wrap(0, 360, num); + nodes[0].value = num + "deg"; + } + + if (nodes[0].value === '0deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'top'); + } else if (nodes[0].value === '90deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'right'); + } else if (nodes[0].value === '180deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'bottom'); + } else if (nodes[0].value === '270deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'left'); + } + + return nodes; + } + /** + * Replace old direction to new + */ + ; + + _proto.newDirection = function newDirection(params) { + if (params[0].value === 'to') { + return params; + } + + IS_DIRECTION.lastIndex = 0; // reset search index of global regexp + + if (!IS_DIRECTION.test(params[0].value)) { + return params; + } + + params.unshift({ + type: 'word', + value: 'to' + }, { + type: 'space', + value: ' ' + }); + + for (var i = 2; i < params.length; i++) { + if (params[i].type === 'div') { + break; + } + + if (params[i].type === 'word') { + params[i].value = this.revertDirection(params[i].value); + } + } + + return params; + } + /** + * Look for at word + */ + ; + + _proto.isRadial = function isRadial(params) { + var state = 'before'; + + for (var _iterator2 = _createForOfIteratorHelperLoose(params), _step2; !(_step2 = _iterator2()).done;) { + var param = _step2.value; + + if (state === 'before' && param.type === 'space') { + state = 'at'; + } else if (state === 'at' && param.value === 'at') { + state = 'after'; + } else if (state === 'after' && param.type === 'space') { + return true; + } else if (param.type === 'div') { + break; + } else { + state = 'before'; + } + } + + return false; + } + /** + * Change new direction to old + */ + ; + + _proto.convertDirection = function convertDirection(params) { + if (params.length > 0) { + if (params[0].value === 'to') { + this.fixDirection(params); + } else if (params[0].value.includes('deg')) { + this.fixAngle(params); + } else if (this.isRadial(params)) { + this.fixRadial(params); + } + } + + return params; + } + /** + * Replace `to top left` to `bottom right` + */ + ; + + _proto.fixDirection = function fixDirection(params) { + params.splice(0, 2); + + for (var _iterator3 = _createForOfIteratorHelperLoose(params), _step3; !(_step3 = _iterator3()).done;) { + var param = _step3.value; + + if (param.type === 'div') { + break; + } + + if (param.type === 'word') { + param.value = this.revertDirection(param.value); + } + } + } + /** + * Add 90 degrees + */ + ; + + _proto.fixAngle = function fixAngle(params) { + var first = params[0].value; + first = parseFloat(first); + first = Math.abs(450 - first) % 360; + first = this.roundFloat(first, 3); + params[0].value = first + "deg"; + } + /** + * Fix radial direction syntax + */ + ; + + _proto.fixRadial = function fixRadial(params) { + var first = []; + var second = []; + var a, b, c, i, next; + + for (i = 0; i < params.length - 2; i++) { + a = params[i]; + b = params[i + 1]; + c = params[i + 2]; + + if (a.type === 'space' && b.value === 'at' && c.type === 'space') { + next = i + 3; + break; + } else { + first.push(a); + } + } + + var div; + + for (i = next; i < params.length; i++) { + if (params[i].type === 'div') { + div = params[i]; + break; + } else { + second.push(params[i]); + } + } + + params.splice.apply(params, [0, i].concat(second, [div], first)); + }; + + _proto.revertDirection = function revertDirection(word) { + return this.directions[word.toLowerCase()] || word; + } + /** + * Round float and save digits under dot + */ + ; + + _proto.roundFloat = function roundFloat(_float, digits) { + return parseFloat(_float.toFixed(digits)); + } + /** + * Convert to old webkit syntax + */ + ; + + _proto.oldWebkit = function oldWebkit(node) { + var nodes = node.nodes; + var string = parser.stringify(node.nodes); + + if (this.name !== 'linear-gradient') { + return false; + } + + if (nodes[0] && nodes[0].value.includes('deg')) { + return false; + } + + if (string.includes('px') || string.includes('-corner') || string.includes('-side')) { + return false; + } + + var params = [[]]; + + for (var _iterator4 = _createForOfIteratorHelperLoose(nodes), _step4; !(_step4 = _iterator4()).done;) { + var i = _step4.value; + params[params.length - 1].push(i); + + if (i.type === 'div' && i.value === ',') { + params.push([]); + } + } + + this.oldDirection(params); + this.colorStops(params); + node.nodes = []; + + for (var _i = 0, _params = params; _i < _params.length; _i++) { + var param = _params[_i]; + node.nodes = node.nodes.concat(param); + } + + node.nodes.unshift({ + type: 'word', + value: 'linear' + }, this.cloneDiv(node.nodes)); + node.value = '-webkit-gradient'; + return true; + } + /** + * Change direction syntax to old webkit + */ + ; + + _proto.oldDirection = function oldDirection(params) { + var div = this.cloneDiv(params[0]); + + if (params[0][0].value !== 'to') { + return params.unshift([{ + type: 'word', + value: this.oldDirections.bottom + }, div]); + } else { + var words = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose(params[0].slice(2)), _step5; !(_step5 = _iterator5()).done;) { + var node = _step5.value; + + if (node.type === 'word') { + words.push(node.value.toLowerCase()); + } + } + + words = words.join(' '); + var old = this.oldDirections[words] || words; + params[0] = [{ + type: 'word', + value: old + }, div]; + return params[0]; + } + } + /** + * Get div token from exists parameters + */ + ; + + _proto.cloneDiv = function cloneDiv(params) { + for (var _iterator6 = _createForOfIteratorHelperLoose(params), _step6; !(_step6 = _iterator6()).done;) { + var i = _step6.value; + + if (i.type === 'div' && i.value === ',') { + return i; + } + } + + return { + type: 'div', + value: ',', + after: ' ' + }; + } + /** + * Change colors syntax to old webkit + */ + ; + + _proto.colorStops = function colorStops(params) { + var result = []; + + for (var i = 0; i < params.length; i++) { + var pos = void 0; + var param = params[i]; + var item = void 0; + + if (i === 0) { + continue; + } + + var color = parser.stringify(param[0]); + + if (param[1] && param[1].type === 'word') { + pos = param[1].value; + } else if (param[2] && param[2].type === 'word') { + pos = param[2].value; + } + + var stop = void 0; + + if (i === 1 && (!pos || pos === '0%')) { + stop = "from(" + color + ")"; + } else if (i === params.length - 1 && (!pos || pos === '100%')) { + stop = "to(" + color + ")"; + } else if (pos) { + stop = "color-stop(" + pos + ", " + color + ")"; + } else { + stop = "color-stop(" + color + ")"; + } + + var div = param[param.length - 1]; + params[i] = [{ + type: 'word', + value: stop + }]; + + if (div.type === 'div' && div.value === ',') { + item = params[i].push(div); + } + + result.push(item); + } + + return result; + } + /** + * Remove old WebKit gradient too + */ + ; + + _proto.old = function old(prefix) { + if (prefix === '-webkit-') { + var type = this.name === 'linear-gradient' ? 'linear' : 'radial'; + var string = '-gradient'; + var regexp = utils.regexp("-webkit-(" + type + "-gradient|gradient\\(\\s*" + type + ")", false); + return new OldValue(this.name, prefix + this.name, string, regexp); + } else { + return _Value.prototype.old.call(this, prefix); + } + } + /** + * Do not add non-webkit prefixes for list-style and object + */ + ; + + _proto.add = function add(decl, prefix) { + var p = decl.prop; + + if (p.includes('mask')) { + if (prefix === '-webkit-' || prefix === '-webkit- old') { + return _Value.prototype.add.call(this, decl, prefix); + } + } else if (p === 'list-style' || p === 'list-style-image' || p === 'content') { + if (prefix === '-webkit-' || prefix === '-webkit- old') { + return _Value.prototype.add.call(this, decl, prefix); + } + } else { + return _Value.prototype.add.call(this, decl, prefix); + } + + return undefined; + }; + + return Gradient; +}(Value); + +_defineProperty(Gradient, "names", ['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient']); + +module.exports = Gradient; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-area.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-area.js new file mode 100644 index 000000000000..e02c1e2b669a --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-area.js @@ -0,0 +1,64 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var GridArea = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridArea, _Declaration); + + var _super = _createSuper(GridArea); + + function GridArea() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridArea.prototype; + + /** + * Translate grid-area to separate -ms- prefixed properties + */ + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var values = utils.parse(decl); + + var _utils$translate = utils.translate(values, 0, 2), + rowStart = _utils$translate[0], + rowSpan = _utils$translate[1]; + + var _utils$translate2 = utils.translate(values, 1, 3), + columnStart = _utils$translate2[0], + columnSpan = _utils$translate2[1]; + + [['grid-row', rowStart], ['grid-row-span', rowSpan], ['grid-column', columnStart], ['grid-column-span', columnSpan]].forEach(function (_ref) { + var prop = _ref[0], + value = _ref[1]; + utils.insertDecl(decl, prop, value); + }); + utils.warnTemplateSelectorNotFound(decl, result); + utils.warnIfGridRowColumnExists(decl, result); + return undefined; + }; + + return GridArea; +}(Declaration); + +_defineProperty(GridArea, "names", ['grid-area']); + +module.exports = GridArea; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-column-align.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-column-align.js new file mode 100644 index 000000000000..9e4d7da183e3 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-column-align.js @@ -0,0 +1,60 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var GridColumnAlign = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridColumnAlign, _Declaration); + + var _super = _createSuper(GridColumnAlign); + + function GridColumnAlign() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridColumnAlign.prototype; + + /** + * Do not prefix flexbox values + */ + _proto.check = function check(decl) { + return !decl.value.includes('flex-') && decl.value !== 'baseline'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'grid-column-align'; + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize() { + return 'justify-self'; + }; + + return GridColumnAlign; +}(Declaration); + +_defineProperty(GridColumnAlign, "names", ['grid-column-align']); + +module.exports = GridColumnAlign; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-end.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-end.js new file mode 100644 index 000000000000..f80fe811e66d --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-end.js @@ -0,0 +1,74 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var GridEnd = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridEnd, _Declaration); + + var _super = _createSuper(GridEnd); + + function GridEnd() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridEnd.prototype; + + /** + * Change repeating syntax for IE + */ + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var clonedDecl = this.clone(decl); + var startProp = decl.prop.replace(/end$/, 'start'); + var spanProp = prefix + decl.prop.replace(/end$/, 'span'); + + if (decl.parent.some(function (i) { + return i.prop === spanProp; + })) { + return undefined; + } + + clonedDecl.prop = spanProp; + + if (decl.value.includes('span')) { + clonedDecl.value = decl.value.replace(/span\s/i, ''); + } else { + var startDecl; + decl.parent.walkDecls(startProp, function (d) { + startDecl = d; + }); + + if (startDecl) { + var value = Number(decl.value) - Number(startDecl.value) + ''; + clonedDecl.value = value; + } else { + decl.warn(result, "Can not prefix " + decl.prop + " (" + startProp + " is not found)"); + } + } + + decl.cloneBefore(clonedDecl); + return undefined; + }; + + return GridEnd; +}(Declaration); + +_defineProperty(GridEnd, "names", ['grid-row-end', 'grid-column-end']); + +module.exports = GridEnd; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-row-align.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-row-align.js new file mode 100644 index 000000000000..d5b2f5eae22b --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-row-align.js @@ -0,0 +1,60 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var GridRowAlign = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowAlign, _Declaration); + + var _super = _createSuper(GridRowAlign); + + function GridRowAlign() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowAlign.prototype; + + /** + * Do not prefix flexbox values + */ + _proto.check = function check(decl) { + return !decl.value.includes('flex-') && decl.value !== 'baseline'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'grid-row-align'; + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize() { + return 'align-self'; + }; + + return GridRowAlign; +}(Declaration); + +_defineProperty(GridRowAlign, "names", ['grid-row-align']); + +module.exports = GridRowAlign; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-row-column.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-row-column.js new file mode 100644 index 000000000000..f2186403f302 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-row-column.js @@ -0,0 +1,64 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var GridRowColumn = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowColumn, _Declaration); + + var _super = _createSuper(GridRowColumn); + + function GridRowColumn() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowColumn.prototype; + + /** + * Translate grid-row / grid-column to separate -ms- prefixed properties + */ + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var values = utils.parse(decl); + + var _utils$translate = utils.translate(values, 0, 1), + start = _utils$translate[0], + span = _utils$translate[1]; + + var hasStartValueSpan = values[0] && values[0].includes('span'); + + if (hasStartValueSpan) { + span = values[0].join('').replace(/\D/g, ''); + } + + [[decl.prop, start], [decl.prop + "-span", span]].forEach(function (_ref) { + var prop = _ref[0], + value = _ref[1]; + utils.insertDecl(decl, prop, value); + }); + return undefined; + }; + + return GridRowColumn; +}(Declaration); + +_defineProperty(GridRowColumn, "names", ['grid-row', 'grid-column']); + +module.exports = GridRowColumn; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js new file mode 100644 index 000000000000..222f2505ba94 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js @@ -0,0 +1,161 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + prefixTrackProp = _require.prefixTrackProp, + prefixTrackValue = _require.prefixTrackValue, + autoplaceGridItems = _require.autoplaceGridItems, + getGridGap = _require.getGridGap, + inheritGridGap = _require.inheritGridGap; + +var Processor = require('../processor'); + +var GridRowsColumns = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowsColumns, _Declaration); + + var _super = _createSuper(GridRowsColumns); + + function GridRowsColumns() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowsColumns.prototype; + + /** + * Change property name for IE + */ + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-ms-') { + return prefixTrackProp({ + prop: prop, + prefix: prefix + }); + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace(/^grid-(rows|columns)/, 'grid-template-$1'); + }; + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var parent = decl.parent, + prop = decl.prop, + value = decl.value; + var isRowProp = prop.includes('rows'); + var isColumnProp = prop.includes('columns'); + var hasGridTemplate = parent.some(function (i) { + return i.prop === 'grid-template' || i.prop === 'grid-template-areas'; + }); + /** + * Not to prefix rows declaration if grid-template(-areas) is present + */ + + if (hasGridTemplate && isRowProp) { + return false; + } + + var processor = new Processor({ + options: {} + }); + var status = processor.gridStatus(parent, result); + var gap = getGridGap(decl); + gap = inheritGridGap(decl, gap) || gap; + var gapValue = isRowProp ? gap.row : gap.column; + + if ((status === 'no-autoplace' || status === true) && !hasGridTemplate) { + gapValue = null; + } + + var prefixValue = prefixTrackValue({ + value: value, + gap: gapValue + }); + /** + * Insert prefixes + */ + + decl.cloneBefore({ + prop: prefixTrackProp({ + prop: prop, + prefix: prefix + }), + value: prefixValue + }); + var autoflow = parent.nodes.find(function (i) { + return i.prop === 'grid-auto-flow'; + }); + var autoflowValue = 'row'; + + if (autoflow && !processor.disabled(autoflow, result)) { + autoflowValue = autoflow.value.trim(); + } + + if (status === 'autoplace') { + /** + * Show warning if grid-template-rows decl is not found + */ + var rowDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-rows'; + }); + + if (!rowDecl && hasGridTemplate) { + return undefined; + } else if (!rowDecl && !hasGridTemplate) { + decl.warn(result, 'Autoplacement does not work without grid-template-rows property'); + return undefined; + } + /** + * Show warning if grid-template-columns decl is not found + */ + + + var columnDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-columns'; + }); + + if (!columnDecl && !hasGridTemplate) { + decl.warn(result, 'Autoplacement does not work without grid-template-columns property'); + } + /** + * Autoplace grid items + */ + + + if (isColumnProp && !hasGridTemplate) { + autoplaceGridItems(decl, result, gap, autoflowValue); + } + } + + return undefined; + }; + + return GridRowsColumns; +}(Declaration); + +_defineProperty(GridRowsColumns, "names", ['grid-template-rows', 'grid-template-columns', 'grid-rows', 'grid-columns']); + +module.exports = GridRowsColumns; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-start.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-start.js new file mode 100644 index 000000000000..c52a935e9bb0 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-start.js @@ -0,0 +1,67 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var GridStart = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridStart, _Declaration); + + var _super = _createSuper(GridStart); + + function GridStart() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridStart.prototype; + + /** + * Do not add prefix for unsupported value in IE + */ + _proto.check = function check(decl) { + var value = decl.value; + return !value.includes('/') || value.includes('span'); + } + /** + * Return a final spec property + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace('-start', ''); + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var result = _Declaration.prototype.prefixed.call(this, prop, prefix); + + if (prefix === '-ms-') { + result = result.replace('-start', ''); + } + + return result; + }; + + return GridStart; +}(Declaration); + +_defineProperty(GridStart, "names", ['grid-row-start', 'grid-column-start']); + +module.exports = GridStart; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-template-areas.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-template-areas.js new file mode 100644 index 000000000000..e05363ea74dd --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-template-areas.js @@ -0,0 +1,113 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + parseGridAreas = _require.parseGridAreas, + warnMissedAreas = _require.warnMissedAreas, + prefixTrackProp = _require.prefixTrackProp, + prefixTrackValue = _require.prefixTrackValue, + getGridGap = _require.getGridGap, + warnGridGap = _require.warnGridGap, + inheritGridGap = _require.inheritGridGap; + +function getGridRows(tpl) { + return tpl.trim().slice(1, -1).split(/["']\s*["']?/g); +} + +var GridTemplateAreas = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridTemplateAreas, _Declaration); + + var _super = _createSuper(GridTemplateAreas); + + function GridTemplateAreas() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridTemplateAreas.prototype; + + /** + * Translate grid-template-areas to separate -ms- prefixed properties + */ + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var hasColumns = false; + var hasRows = false; + var parent = decl.parent; + var gap = getGridGap(decl); + gap = inheritGridGap(decl, gap) || gap; // remove already prefixed rows + // to prevent doubling prefixes + + parent.walkDecls(/-ms-grid-rows/, function (i) { + return i.remove(); + }); // add empty tracks to rows + + parent.walkDecls(/grid-template-(rows|columns)/, function (trackDecl) { + if (trackDecl.prop === 'grid-template-rows') { + hasRows = true; + var prop = trackDecl.prop, + value = trackDecl.value; + trackDecl.cloneBefore({ + prop: prefixTrackProp({ + prop: prop, + prefix: prefix + }), + value: prefixTrackValue({ + value: value, + gap: gap.row + }) + }); + } else { + hasColumns = true; + } + }); + var gridRows = getGridRows(decl.value); + + if (hasColumns && !hasRows && gap.row && gridRows.length > 1) { + decl.cloneBefore({ + prop: '-ms-grid-rows', + value: prefixTrackValue({ + value: "repeat(" + gridRows.length + ", auto)", + gap: gap.row + }), + raws: {} + }); + } // warnings + + + warnGridGap({ + gap: gap, + hasColumns: hasColumns, + decl: decl, + result: result + }); + var areas = parseGridAreas({ + rows: gridRows, + gap: gap + }); + warnMissedAreas(areas, decl, result); + return decl; + }; + + return GridTemplateAreas; +}(Declaration); + +_defineProperty(GridTemplateAreas, "names", ['grid-template-areas']); + +module.exports = GridTemplateAreas; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-template.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-template.js new file mode 100644 index 000000000000..55956510f6e4 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-template.js @@ -0,0 +1,102 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + parseTemplate = _require.parseTemplate, + warnMissedAreas = _require.warnMissedAreas, + getGridGap = _require.getGridGap, + warnGridGap = _require.warnGridGap, + inheritGridGap = _require.inheritGridGap; + +var GridTemplate = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridTemplate, _Declaration); + + var _super = _createSuper(GridTemplate); + + function GridTemplate() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridTemplate.prototype; + + /** + * Translate grid-template to separate -ms- prefixed properties + */ + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + + if (decl.parent.some(function (i) { + return i.prop === '-ms-grid-rows'; + })) { + return undefined; + } + + var gap = getGridGap(decl); + /** + * we must insert inherited gap values in some cases: + * if we are inside media query && if we have no grid-gap value + */ + + var inheritedGap = inheritGridGap(decl, gap); + + var _parseTemplate = parseTemplate({ + decl: decl, + gap: inheritedGap || gap + }), + rows = _parseTemplate.rows, + columns = _parseTemplate.columns, + areas = _parseTemplate.areas; + + var hasAreas = Object.keys(areas).length > 0; + var hasRows = Boolean(rows); + var hasColumns = Boolean(columns); + warnGridGap({ + gap: gap, + hasColumns: hasColumns, + decl: decl, + result: result + }); + warnMissedAreas(areas, decl, result); + + if (hasRows && hasColumns || hasAreas) { + decl.cloneBefore({ + prop: '-ms-grid-rows', + value: rows, + raws: {} + }); + } + + if (hasColumns) { + decl.cloneBefore({ + prop: '-ms-grid-columns', + value: columns, + raws: {} + }); + } + + return decl; + }; + + return GridTemplate; +}(Declaration); + +_defineProperty(GridTemplate, "names", ['grid-template']); + +module.exports = GridTemplate; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/grid-utils.js b/website/www/node_modules/autoprefixer/lib/hacks/grid-utils.js new file mode 100644 index 000000000000..db78425115ab --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/grid-utils.js @@ -0,0 +1,1123 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var parser = require('postcss-value-parser'); + +var list = require('postcss').list; + +var uniq = require('../utils').uniq; + +var escapeRegexp = require('../utils').escapeRegexp; + +var splitSelector = require('../utils').splitSelector; + +function convert(value) { + if (value && value.length === 2 && value[0] === 'span' && parseInt(value[1], 10) > 0) { + return [false, parseInt(value[1], 10)]; + } + + if (value && value.length === 1 && parseInt(value[0], 10) > 0) { + return [parseInt(value[0], 10), false]; + } + + return [false, false]; +} + +function translate(values, startIndex, endIndex) { + var startValue = values[startIndex]; + var endValue = values[endIndex]; + + if (!startValue) { + return [false, false]; + } + + var _convert = convert(startValue), + start = _convert[0], + spanStart = _convert[1]; + + var _convert2 = convert(endValue), + end = _convert2[0], + spanEnd = _convert2[1]; + + if (start && !endValue) { + return [start, false]; + } + + if (spanStart && end) { + return [end - spanStart, spanStart]; + } + + if (start && spanEnd) { + return [start, spanEnd]; + } + + if (start && end) { + return [start, end - start]; + } + + return [false, false]; +} + +function parse(decl) { + var node = parser(decl.value); + var values = []; + var current = 0; + values[current] = []; + + for (var _iterator = _createForOfIteratorHelperLoose(node.nodes), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (i.type === 'div') { + current += 1; + values[current] = []; + } else if (i.type === 'word') { + values[current].push(i.value); + } + } + + return values; +} + +function insertDecl(decl, prop, value) { + if (value && !decl.parent.some(function (i) { + return i.prop === "-ms-" + prop; + })) { + decl.cloneBefore({ + prop: "-ms-" + prop, + value: value.toString() + }); + } +} // Track transforms + + +function prefixTrackProp(_ref) { + var prop = _ref.prop, + prefix = _ref.prefix; + return prefix + prop.replace('template-', ''); +} + +function transformRepeat(_ref2, _ref3) { + var nodes = _ref2.nodes; + var gap = _ref3.gap; + + var _nodes$reduce = nodes.reduce(function (result, node) { + if (node.type === 'div' && node.value === ',') { + result.key = 'size'; + } else { + result[result.key].push(parser.stringify(node)); + } + + return result; + }, { + key: 'count', + size: [], + count: [] + }), + count = _nodes$reduce.count, + size = _nodes$reduce.size; // insert gap values + + + if (gap) { + var _ret = function () { + size = size.filter(function (i) { + return i.trim(); + }); + var val = []; + + var _loop = function _loop(i) { + size.forEach(function (item, index) { + if (index > 0 || i > 1) { + val.push(gap); + } + + val.push(item); + }); + }; + + for (var i = 1; i <= count; i++) { + _loop(i); + } + + return { + v: val.join(' ') + }; + }(); + + if (typeof _ret === "object") return _ret.v; + } + + return "(" + size.join('') + ")[" + count.join('') + "]"; +} + +function prefixTrackValue(_ref4) { + var value = _ref4.value, + gap = _ref4.gap; + var result = parser(value).nodes.reduce(function (nodes, node) { + if (node.type === 'function' && node.value === 'repeat') { + return nodes.concat({ + type: 'word', + value: transformRepeat(node, { + gap: gap + }) + }); + } + + if (gap && node.type === 'space') { + return nodes.concat({ + type: 'space', + value: ' ' + }, { + type: 'word', + value: gap + }, node); + } + + return nodes.concat(node); + }, []); + return parser.stringify(result); +} // Parse grid-template-areas + + +var DOTS = /^\.+$/; + +function track(start, end) { + return { + start: start, + end: end, + span: end - start + }; +} + +function getColumns(line) { + return line.trim().split(/\s+/g); +} + +function parseGridAreas(_ref5) { + var rows = _ref5.rows, + gap = _ref5.gap; + return rows.reduce(function (areas, line, rowIndex) { + if (gap.row) rowIndex *= 2; + if (line.trim() === '') return areas; + getColumns(line).forEach(function (area, columnIndex) { + if (DOTS.test(area)) return; + if (gap.column) columnIndex *= 2; + + if (typeof areas[area] === 'undefined') { + areas[area] = { + column: track(columnIndex + 1, columnIndex + 2), + row: track(rowIndex + 1, rowIndex + 2) + }; + } else { + var _areas$area = areas[area], + column = _areas$area.column, + row = _areas$area.row; + column.start = Math.min(column.start, columnIndex + 1); + column.end = Math.max(column.end, columnIndex + 2); + column.span = column.end - column.start; + row.start = Math.min(row.start, rowIndex + 1); + row.end = Math.max(row.end, rowIndex + 2); + row.span = row.end - row.start; + } + }); + return areas; + }, {}); +} // Parse grid-template + + +function testTrack(node) { + return node.type === 'word' && /^\[.+]$/.test(node.value); +} + +function verifyRowSize(result) { + if (result.areas.length > result.rows.length) { + result.rows.push('auto'); + } + + return result; +} + +function parseTemplate(_ref6) { + var decl = _ref6.decl, + gap = _ref6.gap; + var gridTemplate = parser(decl.value).nodes.reduce(function (result, node) { + var type = node.type, + value = node.value; + if (testTrack(node) || type === 'space') return result; // area + + if (type === 'string') { + result = verifyRowSize(result); + result.areas.push(value); + } // values and function + + + if (type === 'word' || type === 'function') { + result[result.key].push(parser.stringify(node)); + } // divider(/) + + + if (type === 'div' && value === '/') { + result.key = 'columns'; + result = verifyRowSize(result); + } + + return result; + }, { + key: 'rows', + columns: [], + rows: [], + areas: [] + }); + return { + areas: parseGridAreas({ + rows: gridTemplate.areas, + gap: gap + }), + columns: prefixTrackValue({ + value: gridTemplate.columns.join(' '), + gap: gap.column + }), + rows: prefixTrackValue({ + value: gridTemplate.rows.join(' '), + gap: gap.row + }) + }; +} // Insert parsed grid areas + +/** + * Get an array of -ms- prefixed props and values + * @param {Object} [area] area object with column and row data + * @param {Boolean} [addRowSpan] should we add grid-column-row value? + * @param {Boolean} [addColumnSpan] should we add grid-column-span value? + * @return {Array} + */ + + +function getMSDecls(area, addRowSpan, addColumnSpan) { + if (addRowSpan === void 0) { + addRowSpan = false; + } + + if (addColumnSpan === void 0) { + addColumnSpan = false; + } + + return [].concat({ + prop: '-ms-grid-row', + value: String(area.row.start) + }, area.row.span > 1 || addRowSpan ? { + prop: '-ms-grid-row-span', + value: String(area.row.span) + } : [], { + prop: '-ms-grid-column', + value: String(area.column.start) + }, area.column.span > 1 || addColumnSpan ? { + prop: '-ms-grid-column-span', + value: String(area.column.span) + } : []); +} + +function getParentMedia(parent) { + if (parent.type === 'atrule' && parent.name === 'media') { + return parent; + } + + if (!parent.parent) { + return false; + } + + return getParentMedia(parent.parent); +} +/** + * change selectors for rules with duplicate grid-areas. + * @param {Array} rules + * @param {Array} templateSelectors + * @return {Array} rules with changed selectors + */ + + +function changeDuplicateAreaSelectors(ruleSelectors, templateSelectors) { + ruleSelectors = ruleSelectors.map(function (selector) { + var selectorBySpace = list.space(selector); + var selectorByComma = list.comma(selector); + + if (selectorBySpace.length > selectorByComma.length) { + selector = selectorBySpace.slice(-1).join(''); + } + + return selector; + }); + return ruleSelectors.map(function (ruleSelector) { + var newSelector = templateSelectors.map(function (tplSelector, index) { + var space = index === 0 ? '' : ' '; + return "" + space + tplSelector + " > " + ruleSelector; + }); + return newSelector; + }); +} +/** + * check if selector of rules are equal + * @param {Rule} ruleA + * @param {Rule} ruleB + * @return {Boolean} + */ + + +function selectorsEqual(ruleA, ruleB) { + return ruleA.selectors.some(function (sel) { + return ruleB.selectors.some(function (s) { + return s === sel; + }); + }); +} +/** + * Parse data from all grid-template(-areas) declarations + * @param {Root} css css root + * @return {Object} parsed data + */ + + +function parseGridTemplatesData(css) { + var parsed = []; // we walk through every grid-template(-areas) declaration and store + // data with the same area names inside the item + + css.walkDecls(/grid-template(-areas)?$/, function (d) { + var rule = d.parent; + var media = getParentMedia(rule); + var gap = getGridGap(d); + var inheritedGap = inheritGridGap(d, gap); + + var _parseTemplate = parseTemplate({ + decl: d, + gap: inheritedGap || gap + }), + areas = _parseTemplate.areas; + + var areaNames = Object.keys(areas); // skip node if it doesn't have areas + + if (areaNames.length === 0) { + return true; + } // check parsed array for item that include the same area names + // return index of that item + + + var index = parsed.reduce(function (acc, _ref7, idx) { + var allAreas = _ref7.allAreas; + var hasAreas = allAreas && areaNames.some(function (area) { + return allAreas.includes(area); + }); + return hasAreas ? idx : acc; + }, null); + + if (index !== null) { + // index is found, add the grid-template data to that item + var _parsed$index = parsed[index], + allAreas = _parsed$index.allAreas, + rules = _parsed$index.rules; // check if rule has no duplicate area names + + var hasNoDuplicates = rules.some(function (r) { + return r.hasDuplicates === false && selectorsEqual(r, rule); + }); + var duplicatesFound = false; // check need to gather all duplicate area names + + var duplicateAreaNames = rules.reduce(function (acc, r) { + if (!r.params && selectorsEqual(r, rule)) { + duplicatesFound = true; + return r.duplicateAreaNames; + } + + if (!duplicatesFound) { + areaNames.forEach(function (name) { + if (r.areas[name]) { + acc.push(name); + } + }); + } + + return uniq(acc); + }, []); // update grid-row/column-span values for areas with duplicate + // area names. @see #1084 and #1146 + + rules.forEach(function (r) { + areaNames.forEach(function (name) { + var area = r.areas[name]; + + if (area && area.row.span !== areas[name].row.span) { + areas[name].row.updateSpan = true; + } + + if (area && area.column.span !== areas[name].column.span) { + areas[name].column.updateSpan = true; + } + }); + }); + parsed[index].allAreas = uniq([].concat(allAreas, areaNames)); + parsed[index].rules.push({ + hasDuplicates: !hasNoDuplicates, + params: media.params, + selectors: rule.selectors, + node: rule, + duplicateAreaNames: duplicateAreaNames, + areas: areas + }); + } else { + // index is NOT found, push the new item to the parsed array + parsed.push({ + allAreas: areaNames, + areasCount: 0, + rules: [{ + hasDuplicates: false, + duplicateRules: [], + params: media.params, + selectors: rule.selectors, + node: rule, + duplicateAreaNames: [], + areas: areas + }] + }); + } + + return undefined; + }); + return parsed; +} +/** + * insert prefixed grid-area declarations + * @param {Root} css css root + * @param {Function} isDisabled check if the rule is disabled + * @return {void} + */ + + +function insertAreas(css, isDisabled) { + // parse grid-template declarations + var gridTemplatesData = parseGridTemplatesData(css); // return undefined if no declarations found + + if (gridTemplatesData.length === 0) { + return undefined; + } // we need to store the rules that we will insert later + + + var rulesToInsert = {}; + css.walkDecls('grid-area', function (gridArea) { + var gridAreaRule = gridArea.parent; + var hasPrefixedRow = gridAreaRule.first.prop === '-ms-grid-row'; + var gridAreaMedia = getParentMedia(gridAreaRule); + + if (isDisabled(gridArea)) { + return undefined; + } + + var gridAreaRuleIndex = gridAreaMedia ? css.index(gridAreaMedia) : css.index(gridAreaRule); + var value = gridArea.value; // found the data that matches grid-area identifier + + var data = gridTemplatesData.filter(function (d) { + return d.allAreas.includes(value); + })[0]; + + if (!data) { + return true; + } + + var lastArea = data.allAreas[data.allAreas.length - 1]; + var selectorBySpace = list.space(gridAreaRule.selector); + var selectorByComma = list.comma(gridAreaRule.selector); + var selectorIsComplex = selectorBySpace.length > 1 && selectorBySpace.length > selectorByComma.length; // prevent doubling of prefixes + + if (hasPrefixedRow) { + return false; + } // create the empty object with the key as the last area name + // e.g if we have templates with "a b c" values, "c" will be the last area + + + if (!rulesToInsert[lastArea]) { + rulesToInsert[lastArea] = {}; + } + + var lastRuleIsSet = false; // walk through every grid-template rule data + + for (var _iterator2 = _createForOfIteratorHelperLoose(data.rules), _step2; !(_step2 = _iterator2()).done;) { + var rule = _step2.value; + var area = rule.areas[value]; + var hasDuplicateName = rule.duplicateAreaNames.includes(value); // if we can't find the area name, update lastRule and continue + + if (!area) { + var lastRuleIndex = css.index(rulesToInsert[lastArea].lastRule); + + if (gridAreaRuleIndex > lastRuleIndex) { + rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule; + } + + continue; + } // for grid-templates inside media rule we need to create empty + // array to push prefixed grid-area rules later + + + if (rule.params && !rulesToInsert[lastArea][rule.params]) { + rulesToInsert[lastArea][rule.params] = []; + } + + if ((!rule.hasDuplicates || !hasDuplicateName) && !rule.params) { + // grid-template has no duplicates and not inside media rule + getMSDecls(area, false, false).reverse().forEach(function (i) { + return gridAreaRule.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + rulesToInsert[lastArea].lastRule = gridAreaRule; + lastRuleIsSet = true; + } else if (rule.hasDuplicates && !rule.params && !selectorIsComplex) { + (function () { + // grid-template has duplicates and not inside media rule + var cloned = gridAreaRule.clone(); + cloned.removeAll(); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return cloned.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + cloned.selectors = changeDuplicateAreaSelectors(cloned.selectors, rule.selectors); + + if (rulesToInsert[lastArea].lastRule) { + rulesToInsert[lastArea].lastRule.after(cloned); + } + + rulesToInsert[lastArea].lastRule = cloned; + lastRuleIsSet = true; + })(); + } else if (rule.hasDuplicates && !rule.params && selectorIsComplex && gridAreaRule.selector.includes(rule.selectors[0])) { + // grid-template has duplicates and not inside media rule + // and the selector is complex + gridAreaRule.walkDecls(/-ms-grid-(row|column)/, function (d) { + return d.remove(); + }); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return gridAreaRule.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + } else if (rule.params) { + (function () { + // grid-template is inside media rule + // if we're inside media rule, we need to store prefixed rules + // inside rulesToInsert object to be able to preserve the order of media + // rules and merge them easily + var cloned = gridAreaRule.clone(); + cloned.removeAll(); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return cloned.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + + if (rule.hasDuplicates && hasDuplicateName) { + cloned.selectors = changeDuplicateAreaSelectors(cloned.selectors, rule.selectors); + } + + cloned.raws = rule.node.raws; + + if (css.index(rule.node.parent) > gridAreaRuleIndex) { + // append the prefixed rules right inside media rule + // with grid-template + rule.node.parent.append(cloned); + } else { + // store the rule to insert later + rulesToInsert[lastArea][rule.params].push(cloned); + } // set new rule as last rule ONLY if we didn't set lastRule for + // this grid-area before + + + if (!lastRuleIsSet) { + rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule; + } + })(); + } + } + + return undefined; + }); // append stored rules inside the media rules + + Object.keys(rulesToInsert).forEach(function (area) { + var data = rulesToInsert[area]; + var lastRule = data.lastRule; + Object.keys(data).reverse().filter(function (p) { + return p !== 'lastRule'; + }).forEach(function (params) { + if (data[params].length > 0 && lastRule) { + lastRule.after({ + name: 'media', + params: params + }); + lastRule.next().append(data[params]); + } + }); + }); + return undefined; +} +/** + * Warn user if grid area identifiers are not found + * @param {Object} areas + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnMissedAreas(areas, decl, result) { + var missed = Object.keys(areas); + decl.root().walkDecls('grid-area', function (gridArea) { + missed = missed.filter(function (e) { + return e !== gridArea.value; + }); + }); + + if (missed.length > 0) { + decl.warn(result, 'Can not find grid areas: ' + missed.join(', ')); + } + + return undefined; +} +/** + * compare selectors with grid-area rule and grid-template rule + * show warning if grid-template selector is not found + * (this function used for grid-area rule) + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnTemplateSelectorNotFound(decl, result) { + var rule = decl.parent; + var root = decl.root(); + var duplicatesFound = false; // slice selector array. Remove the last part (for comparison) + + var slicedSelectorArr = list.space(rule.selector).filter(function (str) { + return str !== '>'; + }).slice(0, -1); // we need to compare only if selector is complex. + // e.g '.grid-cell' is simple, but '.parent > .grid-cell' is complex + + if (slicedSelectorArr.length > 0) { + var gridTemplateFound = false; + var foundAreaSelector = null; + root.walkDecls(/grid-template(-areas)?$/, function (d) { + var parent = d.parent; + var templateSelectors = parent.selectors; + + var _parseTemplate2 = parseTemplate({ + decl: d, + gap: getGridGap(d) + }), + areas = _parseTemplate2.areas; + + var hasArea = areas[decl.value]; // find the the matching selectors + + for (var _iterator3 = _createForOfIteratorHelperLoose(templateSelectors), _step3; !(_step3 = _iterator3()).done;) { + var tplSelector = _step3.value; + + if (gridTemplateFound) { + break; + } + + var tplSelectorArr = list.space(tplSelector).filter(function (str) { + return str !== '>'; + }); + gridTemplateFound = tplSelectorArr.every(function (item, idx) { + return item === slicedSelectorArr[idx]; + }); + } + + if (gridTemplateFound || !hasArea) { + return true; + } + + if (!foundAreaSelector) { + foundAreaSelector = parent.selector; + } // if we found the duplicate area with different selector + + + if (foundAreaSelector && foundAreaSelector !== parent.selector) { + duplicatesFound = true; + } + + return undefined; + }); // warn user if we didn't find template + + if (!gridTemplateFound && duplicatesFound) { + decl.warn(result, 'Autoprefixer cannot find a grid-template ' + ("containing the duplicate grid-area \"" + decl.value + "\" ") + ("with full selector matching: " + slicedSelectorArr.join(' '))); + } + } +} +/** + * warn user if both grid-area and grid-(row|column) + * declarations are present in the same rule + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnIfGridRowColumnExists(decl, result) { + var rule = decl.parent; + var decls = []; + rule.walkDecls(/^grid-(row|column)/, function (d) { + if (!d.prop.endsWith('-end') && !d.value.startsWith('span')) { + decls.push(d); + } + }); + + if (decls.length > 0) { + decls.forEach(function (d) { + d.warn(result, 'You already have a grid-area declaration present in the rule. ' + ("You should use either grid-area or " + d.prop + ", not both")); + }); + } + + return undefined; +} // Gap utils + + +function getGridGap(decl) { + var gap = {}; // try to find gap + + var testGap = /^(grid-)?((row|column)-)?gap$/; + decl.parent.walkDecls(testGap, function (_ref8) { + var prop = _ref8.prop, + value = _ref8.value; + + if (/^(grid-)?gap$/.test(prop)) { + var _parser$nodes = parser(value).nodes, + row = _parser$nodes[0], + column = _parser$nodes[2]; + gap.row = row && parser.stringify(row); + gap.column = column ? parser.stringify(column) : gap.row; + } + + if (/^(grid-)?row-gap$/.test(prop)) gap.row = value; + if (/^(grid-)?column-gap$/.test(prop)) gap.column = value; + }); + return gap; +} +/** + * parse media parameters (for example 'min-width: 500px') + * @param {String} params parameter to parse + * @return {} + */ + + +function parseMediaParams(params) { + if (!params) { + return false; + } + + var parsed = parser(params); + var prop; + var value; + parsed.walk(function (node) { + if (node.type === 'word' && /min|max/g.test(node.value)) { + prop = node.value; + } else if (node.value.includes('px')) { + value = parseInt(node.value.replace(/\D/g, '')); + } + }); + return [prop, value]; +} +/** + * Compare the selectors and decide if we + * need to inherit gap from compared selector or not. + * @type {String} selA + * @type {String} selB + * @return {Boolean} + */ + + +function shouldInheritGap(selA, selB) { + var result; // get arrays of selector split in 3-deep array + + var splitSelectorArrA = splitSelector(selA); + var splitSelectorArrB = splitSelector(selB); + + if (splitSelectorArrA[0].length < splitSelectorArrB[0].length) { + // abort if selectorA has lower descendant specificity then selectorB + // (e.g '.grid' and '.hello .world .grid') + return false; + } else if (splitSelectorArrA[0].length > splitSelectorArrB[0].length) { + // if selectorA has higher descendant specificity then selectorB + // (e.g '.foo .bar .grid' and '.grid') + var idx = splitSelectorArrA[0].reduce(function (res, _ref9, index) { + var item = _ref9[0]; + var firstSelectorPart = splitSelectorArrB[0][0][0]; + + if (item === firstSelectorPart) { + return index; + } + + return false; + }, false); + + if (idx) { + result = splitSelectorArrB[0].every(function (arr, index) { + return arr.every(function (part, innerIndex) { + return (// because selectorA has more space elements, we need to slice + // selectorA array by 'idx' number to compare them + splitSelectorArrA[0].slice(idx)[index][innerIndex] === part + ); + }); + }); + } + } else { + // if selectorA has the same descendant specificity as selectorB + // this condition covers cases such as: '.grid.foo.bar' and '.grid' + result = splitSelectorArrB.some(function (byCommaArr) { + return byCommaArr.every(function (bySpaceArr, index) { + return bySpaceArr.every(function (part, innerIndex) { + return splitSelectorArrA[0][index][innerIndex] === part; + }); + }); + }); + } + + return result; +} +/** + * inherit grid gap values from the closest rule above + * with the same selector + * @param {Declaration} decl + * @param {Object} gap gap values + * @return {Object | Boolean} return gap values or false (if not found) + */ + + +function inheritGridGap(decl, gap) { + var rule = decl.parent; + var mediaRule = getParentMedia(rule); + var root = rule.root(); // get an array of selector split in 3-deep array + + var splitSelectorArr = splitSelector(rule.selector); // abort if the rule already has gaps + + if (Object.keys(gap).length > 0) { + return false; + } // e.g ['min-width'] + + + var _parseMediaParams = parseMediaParams(mediaRule.params), + prop = _parseMediaParams[0]; + + var lastBySpace = splitSelectorArr[0]; // get escaped value from the selector + // if we have '.grid-2.foo.bar' selector, will be '\.grid\-2' + + var escaped = escapeRegexp(lastBySpace[lastBySpace.length - 1][0]); + var regexp = new RegExp("(" + escaped + "$)|(" + escaped + "[,.])"); // find the closest rule with the same selector + + var closestRuleGap; + root.walkRules(regexp, function (r) { + var gridGap; // abort if are checking the same rule + + if (rule.toString() === r.toString()) { + return false; + } // find grid-gap values + + + r.walkDecls('grid-gap', function (d) { + return gridGap = getGridGap(d); + }); // skip rule without gaps + + if (!gridGap || Object.keys(gridGap).length === 0) { + return true; + } // skip rules that should not be inherited from + + + if (!shouldInheritGap(rule.selector, r.selector)) { + return true; + } + + var media = getParentMedia(r); + + if (media) { + // if we are inside media, we need to check that media props match + // e.g ('min-width' === 'min-width') + var propToCompare = parseMediaParams(media.params)[0]; + + if (propToCompare === prop) { + closestRuleGap = gridGap; + return true; + } + } else { + closestRuleGap = gridGap; + return true; + } + + return undefined; + }); // if we find the closest gap object + + if (closestRuleGap && Object.keys(closestRuleGap).length > 0) { + return closestRuleGap; + } + + return false; +} + +function warnGridGap(_ref10) { + var gap = _ref10.gap, + hasColumns = _ref10.hasColumns, + decl = _ref10.decl, + result = _ref10.result; + var hasBothGaps = gap.row && gap.column; + + if (!hasColumns && (hasBothGaps || gap.column && !gap.row)) { + delete gap.column; + decl.warn(result, 'Can not implement grid-gap without grid-template-columns'); + } +} +/** + * normalize the grid-template-rows/columns values + * @param {String} str grid-template-rows/columns value + * @return {Array} normalized array with values + * @example + * let normalized = normalizeRowColumn('1fr repeat(2, 20px 50px) 1fr') + * normalized // <= ['1fr', '20px', '50px', '20px', '50px', '1fr'] + */ + + +function normalizeRowColumn(str) { + var normalized = parser(str).nodes.reduce(function (result, node) { + if (node.type === 'function' && node.value === 'repeat') { + var key = 'count'; + + var _node$nodes$reduce = node.nodes.reduce(function (acc, n) { + if (n.type === 'word' && key === 'count') { + acc[0] = Math.abs(parseInt(n.value)); + return acc; + } + + if (n.type === 'div' && n.value === ',') { + key = 'value'; + return acc; + } + + if (key === 'value') { + acc[1] += parser.stringify(n); + } + + return acc; + }, [0, '']), + count = _node$nodes$reduce[0], + value = _node$nodes$reduce[1]; + + if (count) { + for (var i = 0; i < count; i++) { + result.push(value); + } + } + + return result; + } + + if (node.type === 'space') { + return result; + } + + return result.concat(parser.stringify(node)); + }, []); + return normalized; +} +/** + * Autoplace grid items + * @param {Declaration} decl + * @param {Result} result + * @param {Object} gap gap values + * @param {String} autoflowValue grid-auto-flow value + * @return {void} + * @see https://github.com/postcss/autoprefixer/issues/1148 + */ + + +function autoplaceGridItems(decl, result, gap, autoflowValue) { + if (autoflowValue === void 0) { + autoflowValue = 'row'; + } + + var parent = decl.parent; + var rowDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-rows'; + }); + var rows = normalizeRowColumn(rowDecl.value); + var columns = normalizeRowColumn(decl.value); // Build array of area names with dummy values. If we have 3 columns and + // 2 rows, filledRows will be equal to ['1 2 3', '4 5 6'] + + var filledRows = rows.map(function (_, rowIndex) { + return Array.from({ + length: columns.length + }, function (v, k) { + return k + rowIndex * columns.length + 1; + }).join(' '); + }); + var areas = parseGridAreas({ + rows: filledRows, + gap: gap + }); + var keys = Object.keys(areas); + var items = keys.map(function (i) { + return areas[i]; + }); // Change the order of cells if grid-auto-flow value is 'column' + + if (autoflowValue.includes('column')) { + items = items.sort(function (a, b) { + return a.column.start - b.column.start; + }); + } // Insert new rules + + + items.reverse().forEach(function (item, index) { + var column = item.column, + row = item.row; + var nodeSelector = parent.selectors.map(function (sel) { + return sel + (" > *:nth-child(" + (keys.length - index) + ")"); + }).join(', '); // create new rule + + var node = parent.clone().removeAll(); // change rule selector + + node.selector = nodeSelector; // insert prefixed row/column values + + node.append({ + prop: '-ms-grid-row', + value: row.start + }); + node.append({ + prop: '-ms-grid-column', + value: column.start + }); // insert rule + + parent.after(node); + }); + return undefined; +} + +module.exports = { + parse: parse, + translate: translate, + parseTemplate: parseTemplate, + parseGridAreas: parseGridAreas, + warnMissedAreas: warnMissedAreas, + insertAreas: insertAreas, + insertDecl: insertDecl, + prefixTrackProp: prefixTrackProp, + prefixTrackValue: prefixTrackValue, + getGridGap: getGridGap, + warnGridGap: warnGridGap, + warnTemplateSelectorNotFound: warnTemplateSelectorNotFound, + warnIfGridRowColumnExists: warnIfGridRowColumnExists, + inheritGridGap: inheritGridGap, + autoplaceGridItems: autoplaceGridItems +}; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/image-rendering.js b/website/www/node_modules/autoprefixer/lib/hacks/image-rendering.js new file mode 100644 index 000000000000..2a5cdf1f7b67 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/image-rendering.js @@ -0,0 +1,83 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var ImageRendering = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(ImageRendering, _Declaration); + + var _super = _createSuper(ImageRendering); + + function ImageRendering() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = ImageRendering.prototype; + + /** + * Add hack only for crisp-edges + */ + _proto.check = function check(decl) { + return decl.value === 'pixelated'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-ms-') { + return '-ms-interpolation-mode'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Change property and value for IE + */ + ; + + _proto.set = function set(decl, prefix) { + if (prefix !== '-ms-') return _Declaration.prototype.set.call(this, decl, prefix); + decl.prop = '-ms-interpolation-mode'; + decl.value = 'nearest-neighbor'; + return decl; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'image-rendering'; + } + /** + * Warn on old value + */ + ; + + _proto.process = function process(node, result) { + return _Declaration.prototype.process.call(this, node, result); + }; + + return ImageRendering; +}(Declaration); + +_defineProperty(ImageRendering, "names", ['image-rendering', 'interpolation-mode']); + +module.exports = ImageRendering; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/image-set.js b/website/www/node_modules/autoprefixer/lib/hacks/image-set.js new file mode 100644 index 000000000000..2267ec1b93e4 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/image-set.js @@ -0,0 +1,50 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Value = require('../value'); + +var ImageSet = /*#__PURE__*/function (_Value) { + _inheritsLoose(ImageSet, _Value); + + var _super = _createSuper(ImageSet); + + function ImageSet() { + return _Value.apply(this, arguments) || this; + } + + var _proto = ImageSet.prototype; + + /** + * Use non-standard name for WebKit and Firefox + */ + _proto.replace = function replace(string, prefix) { + var fixed = _Value.prototype.replace.call(this, string, prefix); + + if (prefix === '-webkit-') { + fixed = fixed.replace(/("[^"]+"|'[^']+')(\s+\d+\w)/gi, 'url($1)$2'); + } + + return fixed; + }; + + return ImageSet; +}(Value); + +_defineProperty(ImageSet, "names", ['image-set']); + +module.exports = ImageSet; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/inline-logical.js b/website/www/node_modules/autoprefixer/lib/hacks/inline-logical.js new file mode 100644 index 000000000000..3255c2142fe3 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/inline-logical.js @@ -0,0 +1,52 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var InlineLogical = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(InlineLogical, _Declaration); + + var _super = _createSuper(InlineLogical); + + function InlineLogical() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = InlineLogical.prototype; + + /** + * Use old syntax for -moz- and -webkit- + */ + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + prop.replace('-inline', ''); + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace(/(margin|padding|border)-(start|end)/, '$1-inline-$2'); + }; + + return InlineLogical; +}(Declaration); + +_defineProperty(InlineLogical, "names", ['border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end', 'border-start', 'border-end', 'margin-start', 'margin-end', 'padding-start', 'padding-end']); + +module.exports = InlineLogical; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/intrinsic.js b/website/www/node_modules/autoprefixer/lib/hacks/intrinsic.js new file mode 100644 index 000000000000..42882fe21e37 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/intrinsic.js @@ -0,0 +1,86 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +function _regexp(name) { + return new RegExp("(^|[\\s,(])(" + name + "($|[\\s),]))", 'gi'); +} + +var Intrinsic = /*#__PURE__*/function (_Value) { + _inheritsLoose(Intrinsic, _Value); + + var _super = _createSuper(Intrinsic); + + function Intrinsic() { + return _Value.apply(this, arguments) || this; + } + + var _proto = Intrinsic.prototype; + + _proto.regexp = function regexp() { + if (!this.regexpCache) this.regexpCache = _regexp(this.name); + return this.regexpCache; + }; + + _proto.isStretch = function isStretch() { + return this.name === 'stretch' || this.name === 'fill' || this.name === 'fill-available'; + }; + + _proto.replace = function replace(string, prefix) { + if (prefix === '-moz-' && this.isStretch()) { + return string.replace(this.regexp(), '$1-moz-available$3'); + } + + if (prefix === '-webkit-' && this.isStretch()) { + return string.replace(this.regexp(), '$1-webkit-fill-available$3'); + } + + return _Value.prototype.replace.call(this, string, prefix); + }; + + _proto.old = function old(prefix) { + var prefixed = prefix + this.name; + + if (this.isStretch()) { + if (prefix === '-moz-') { + prefixed = '-moz-available'; + } else if (prefix === '-webkit-') { + prefixed = '-webkit-fill-available'; + } + } + + return new OldValue(this.name, prefixed, prefixed, _regexp(prefixed)); + }; + + _proto.add = function add(decl, prefix) { + if (decl.prop.includes('grid') && prefix !== '-webkit-') { + return undefined; + } + + return _Value.prototype.add.call(this, decl, prefix); + }; + + return Intrinsic; +}(Value); + +_defineProperty(Intrinsic, "names", ['max-content', 'min-content', 'fit-content', 'fill', 'fill-available', 'stretch']); + +module.exports = Intrinsic; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/justify-content.js b/website/www/node_modules/autoprefixer/lib/hacks/justify-content.js new file mode 100644 index 000000000000..c25872b0d9af --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/justify-content.js @@ -0,0 +1,97 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var JustifyContent = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(JustifyContent, _Declaration); + + var _super = _createSuper(JustifyContent); + + function JustifyContent() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = JustifyContent.prototype; + + /** + * Change property name for 2009 and 2012 specs + */ + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-pack'; + } + + if (spec === 2012) { + return prefix + 'flex-pack'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'justify-content'; + } + /** + * Change value for 2009 and 2012 specs + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 || spec === 2012) { + var value = JustifyContent.oldValues[decl.value] || decl.value; + decl.value = value; + + if (spec !== 2009 || value !== 'distribute') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + } else if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return JustifyContent; +}(Declaration); + +_defineProperty(JustifyContent, "names", ['justify-content', 'flex-pack', 'box-pack']); + +_defineProperty(JustifyContent, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' +}); + +module.exports = JustifyContent; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/mask-border.js b/website/www/node_modules/autoprefixer/lib/hacks/mask-border.js new file mode 100644 index 000000000000..2d32f899d033 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/mask-border.js @@ -0,0 +1,58 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var MaskBorder = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(MaskBorder, _Declaration); + + var _super = _createSuper(MaskBorder); + + function MaskBorder() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = MaskBorder.prototype; + + /** + * Return property name by final spec + */ + _proto.normalize = function normalize() { + return this.name.replace('box-image', 'border'); + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var result = _Declaration.prototype.prefixed.call(this, prop, prefix); + + if (prefix === '-webkit-') { + result = result.replace('border', 'box-image'); + } + + return result; + }; + + return MaskBorder; +}(Declaration); + +_defineProperty(MaskBorder, "names", ['mask-border', 'mask-border-source', 'mask-border-slice', 'mask-border-width', 'mask-border-outset', 'mask-border-repeat', 'mask-box-image', 'mask-box-image-source', 'mask-box-image-slice', 'mask-box-image-width', 'mask-box-image-outset', 'mask-box-image-repeat']); + +module.exports = MaskBorder; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/mask-composite.js b/website/www/node_modules/autoprefixer/lib/hacks/mask-composite.js new file mode 100644 index 000000000000..9a369b6c4c99 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/mask-composite.js @@ -0,0 +1,116 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var MaskComposite = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(MaskComposite, _Declaration); + + var _super = _createSuper(MaskComposite); + + function MaskComposite() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = MaskComposite.prototype; + + /** + * Prefix mask-composite for webkit + */ + _proto.insert = function insert(decl, prefix, prefixes) { + var isCompositeProp = decl.prop === 'mask-composite'; + var compositeValues; + + if (isCompositeProp) { + compositeValues = decl.value.split(','); + } else { + compositeValues = decl.value.match(MaskComposite.regexp) || []; + } + + compositeValues = compositeValues.map(function (el) { + return el.trim(); + }).filter(function (el) { + return el; + }); + var hasCompositeValues = compositeValues.length; + var compositeDecl; + + if (hasCompositeValues) { + compositeDecl = this.clone(decl); + compositeDecl.value = compositeValues.map(function (value) { + return MaskComposite.oldValues[value] || value; + }).join(', '); + + if (compositeValues.includes('intersect')) { + compositeDecl.value += ', xor'; + } + + compositeDecl.prop = prefix + 'mask-composite'; + } + + if (isCompositeProp) { + if (!hasCompositeValues) { + return undefined; + } + + if (this.needCascade(decl)) { + compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, compositeDecl); + } + + var cloned = this.clone(decl); + cloned.prop = prefix + cloned.prop; + + if (hasCompositeValues) { + cloned.value = cloned.value.replace(MaskComposite.regexp, ''); + } + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + + if (!hasCompositeValues) { + return decl; + } + + if (this.needCascade(decl)) { + compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, compositeDecl); + }; + + return MaskComposite; +}(Declaration); + +_defineProperty(MaskComposite, "names", ['mask', 'mask-composite']); + +_defineProperty(MaskComposite, "oldValues", { + add: 'source-over', + substract: 'source-out', + intersect: 'source-in', + exclude: 'xor' +}); + +_defineProperty(MaskComposite, "regexp", new RegExp("\\s+(" + Object.keys(MaskComposite.oldValues).join('|') + ")\\b(?!\\))\\s*(?=[,])", 'ig')); + +module.exports = MaskComposite; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/order.js b/website/www/node_modules/autoprefixer/lib/hacks/order.js new file mode 100644 index 000000000000..f911f2908b49 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/order.js @@ -0,0 +1,84 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Order = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Order, _Declaration); + + var _super = _createSuper(Order); + + function Order() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Order.prototype; + + /** + * Change property name for 2009 and 2012 specs + */ + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-ordinal-group'; + } + + if (spec === 2012) { + return prefix + 'flex-order'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'order'; + } + /** + * Fix value for 2009 spec + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 && /\d/.test(decl.value)) { + decl.value = (parseInt(decl.value) + 1).toString(); + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return Order; +}(Declaration); + +_defineProperty(Order, "names", ['order', 'flex-order', 'box-ordinal-group']); + +module.exports = Order; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js b/website/www/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js new file mode 100644 index 000000000000..cf9f0bed17fa --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js @@ -0,0 +1,66 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var OverscrollBehavior = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(OverscrollBehavior, _Declaration); + + var _super = _createSuper(OverscrollBehavior); + + function OverscrollBehavior() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = OverscrollBehavior.prototype; + + /** + * Change property name for IE + */ + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'scroll-chaining'; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'overscroll-behavior'; + } + /** + * Change value for IE + */ + ; + + _proto.set = function set(decl, prefix) { + if (decl.value === 'auto') { + decl.value = 'chained'; + } else if (decl.value === 'none' || decl.value === 'contain') { + decl.value = 'none'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return OverscrollBehavior; +}(Declaration); + +_defineProperty(OverscrollBehavior, "names", ['overscroll-behavior', 'scroll-chaining']); + +module.exports = OverscrollBehavior; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/pixelated.js b/website/www/node_modules/autoprefixer/lib/hacks/pixelated.js new file mode 100644 index 000000000000..63b4b16c3b9d --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/pixelated.js @@ -0,0 +1,70 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var Pixelated = /*#__PURE__*/function (_Value) { + _inheritsLoose(Pixelated, _Value); + + var _super = _createSuper(Pixelated); + + function Pixelated() { + return _Value.apply(this, arguments) || this; + } + + var _proto = Pixelated.prototype; + + /** + * Use non-standard name for WebKit and Firefox + */ + _proto.replace = function replace(string, prefix) { + if (prefix === '-webkit-') { + return string.replace(this.regexp(), '$1-webkit-optimize-contrast'); + } + + if (prefix === '-moz-') { + return string.replace(this.regexp(), '$1-moz-crisp-edges'); + } + + return _Value.prototype.replace.call(this, string, prefix); + } + /** + * Different name for WebKit and Firefox + */ + ; + + _proto.old = function old(prefix) { + if (prefix === '-webkit-') { + return new OldValue(this.name, '-webkit-optimize-contrast'); + } + + if (prefix === '-moz-') { + return new OldValue(this.name, '-moz-crisp-edges'); + } + + return _Value.prototype.old.call(this, prefix); + }; + + return Pixelated; +}(Value); + +_defineProperty(Pixelated, "names", ['pixelated']); + +module.exports = Pixelated; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/place-self.js b/website/www/node_modules/autoprefixer/lib/hacks/place-self.js new file mode 100644 index 000000000000..75b2d08c56a7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/place-self.js @@ -0,0 +1,67 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var PlaceSelf = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(PlaceSelf, _Declaration); + + var _super = _createSuper(PlaceSelf); + + function PlaceSelf() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = PlaceSelf.prototype; + + /** + * Translate place-self to separate -ms- prefixed properties + */ + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); // prevent doubling of prefixes + + if (decl.parent.some(function (i) { + return i.prop === '-ms-grid-row-align'; + })) { + return undefined; + } + + var _utils$parse = utils.parse(decl), + _utils$parse$ = _utils$parse[0], + first = _utils$parse$[0], + second = _utils$parse$[1]; + + if (second) { + utils.insertDecl(decl, 'grid-row-align', first); + utils.insertDecl(decl, 'grid-column-align', second); + } else { + utils.insertDecl(decl, 'grid-row-align', first); + utils.insertDecl(decl, 'grid-column-align', first); + } + + return undefined; + }; + + return PlaceSelf; +}(Declaration); + +_defineProperty(PlaceSelf, "names", ['place-self']); + +module.exports = PlaceSelf; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/placeholder.js b/website/www/node_modules/autoprefixer/lib/hacks/placeholder.js new file mode 100644 index 000000000000..32ce8365700b --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/placeholder.js @@ -0,0 +1,68 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Selector = require('../selector'); + +var Placeholder = /*#__PURE__*/function (_Selector) { + _inheritsLoose(Placeholder, _Selector); + + var _super = _createSuper(Placeholder); + + function Placeholder() { + return _Selector.apply(this, arguments) || this; + } + + var _proto = Placeholder.prototype; + + /** + * Add old mozilla to possible prefixes + */ + _proto.possible = function possible() { + return _Selector.prototype.possible.call(this).concat(['-moz- old', '-ms- old']); + } + /** + * Return different selectors depend on prefix + */ + ; + + _proto.prefixed = function prefixed(prefix) { + if (prefix === '-webkit-') { + return '::-webkit-input-placeholder'; + } + + if (prefix === '-ms-') { + return '::-ms-input-placeholder'; + } + + if (prefix === '-ms- old') { + return ':-ms-input-placeholder'; + } + + if (prefix === '-moz- old') { + return ':-moz-placeholder'; + } + + return "::" + prefix + "placeholder"; + }; + + return Placeholder; +}(Selector); + +_defineProperty(Placeholder, "names", ['::placeholder']); + +module.exports = Placeholder; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js b/website/www/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js new file mode 100644 index 000000000000..353a113120c8 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js @@ -0,0 +1,50 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var TextDecorationSkipInk = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextDecorationSkipInk, _Declaration); + + var _super = _createSuper(TextDecorationSkipInk); + + function TextDecorationSkipInk() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextDecorationSkipInk.prototype; + + /** + * Change prefix for ink value + */ + _proto.set = function set(decl, prefix) { + if (decl.prop === 'text-decoration-skip-ink' && decl.value === 'auto') { + decl.prop = prefix + 'text-decoration-skip'; + decl.value = 'ink'; + return decl; + } else { + return _Declaration.prototype.set.call(this, decl, prefix); + } + }; + + return TextDecorationSkipInk; +}(Declaration); + +_defineProperty(TextDecorationSkipInk, "names", ['text-decoration-skip-ink', 'text-decoration-skip']); + +module.exports = TextDecorationSkipInk; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/text-decoration.js b/website/www/node_modules/autoprefixer/lib/hacks/text-decoration.js new file mode 100644 index 000000000000..703873f413b7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/text-decoration.js @@ -0,0 +1,48 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var BASIC = ['none', 'underline', 'overline', 'line-through', 'blink', 'inherit', 'initial', 'unset']; + +var TextDecoration = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextDecoration, _Declaration); + + var _super = _createSuper(TextDecoration); + + function TextDecoration() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextDecoration.prototype; + + /** + * Do not add prefixes for basic values. + */ + _proto.check = function check(decl) { + return decl.value.split(/\s+/).some(function (i) { + return !BASIC.includes(i); + }); + }; + + return TextDecoration; +}(Declaration); + +_defineProperty(TextDecoration, "names", ['text-decoration']); + +module.exports = TextDecoration; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js b/website/www/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js new file mode 100644 index 000000000000..ebb45312c29d --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js @@ -0,0 +1,45 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var TextEmphasisPosition = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextEmphasisPosition, _Declaration); + + var _super = _createSuper(TextEmphasisPosition); + + function TextEmphasisPosition() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextEmphasisPosition.prototype; + + _proto.set = function set(decl, prefix) { + if (prefix === '-webkit-') { + decl.value = decl.value.replace(/\s*(right|left)\s*/i, ''); + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return TextEmphasisPosition; +}(Declaration); + +_defineProperty(TextEmphasisPosition, "names", ['text-emphasis-position']); + +module.exports = TextEmphasisPosition; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/transform-decl.js b/website/www/node_modules/autoprefixer/lib/hacks/transform-decl.js new file mode 100644 index 000000000000..07e37dae9ff7 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/transform-decl.js @@ -0,0 +1,117 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var TransformDecl = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TransformDecl, _Declaration); + + var _super = _createSuper(TransformDecl); + + function TransformDecl() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TransformDecl.prototype; + + /** + * Recursively check all parents for @keyframes + */ + _proto.keyframeParents = function keyframeParents(decl) { + var parent = decl.parent; + + while (parent) { + if (parent.type === 'atrule' && parent.name === 'keyframes') { + return true; + } + + var _parent = parent; + parent = _parent.parent; + } + + return false; + } + /** + * Is transform contain 3D commands + */ + ; + + _proto.contain3d = function contain3d(decl) { + if (decl.prop === 'transform-origin') { + return false; + } + + for (var _iterator = _createForOfIteratorHelperLoose(TransformDecl.functions3d), _step; !(_step = _iterator()).done;) { + var func = _step.value; + + if (decl.value.includes(func + "(")) { + return true; + } + } + + return false; + } + /** + * Replace rotateZ to rotate for IE 9 + */ + ; + + _proto.set = function set(decl, prefix) { + decl = _Declaration.prototype.set.call(this, decl, prefix); + + if (prefix === '-ms-') { + decl.value = decl.value.replace(/rotatez/gi, 'rotate'); + } + + return decl; + } + /** + * Don't add prefix for IE in keyframes + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix === '-ms-') { + if (!this.contain3d(decl) && !this.keyframeParents(decl)) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + } else if (prefix === '-o-') { + if (!this.contain3d(decl)) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + } else { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + return undefined; + }; + + return TransformDecl; +}(Declaration); + +_defineProperty(TransformDecl, "names", ['transform', 'transform-origin']); + +_defineProperty(TransformDecl, "functions3d", ['matrix3d', 'translate3d', 'translateZ', 'scale3d', 'scaleZ', 'rotate3d', 'rotateX', 'rotateY', 'perspective']); + +module.exports = TransformDecl; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/user-select.js b/website/www/node_modules/autoprefixer/lib/hacks/user-select.js new file mode 100644 index 000000000000..c556c92268ed --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/user-select.js @@ -0,0 +1,48 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var UserSelect = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(UserSelect, _Declaration); + + var _super = _createSuper(UserSelect); + + function UserSelect() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = UserSelect.prototype; + + /** + * Change prefixed value for IE + */ + _proto.set = function set(decl, prefix) { + if (prefix === '-ms-' && decl.value === 'contain') { + decl.value = 'element'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return UserSelect; +}(Declaration); + +_defineProperty(UserSelect, "names", ['user-select']); + +module.exports = UserSelect; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/hacks/writing-mode.js b/website/www/node_modules/autoprefixer/lib/hacks/writing-mode.js new file mode 100644 index 000000000000..599cff007d32 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/hacks/writing-mode.js @@ -0,0 +1,71 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var Declaration = require('../declaration'); + +var WritingMode = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(WritingMode, _Declaration); + + var _super = _createSuper(WritingMode); + + function WritingMode() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = WritingMode.prototype; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix === '-ms-') { + var cloned = this.set(this.clone(decl), prefix); + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + var direction = 'ltr'; + decl.parent.nodes.forEach(function (i) { + if (i.prop === 'direction') { + if (i.value === 'rtl' || i.value === 'ltr') direction = i.value; + } + }); + cloned.value = WritingMode.msValues[direction][decl.value] || decl.value; + return decl.parent.insertBefore(decl, cloned); + } + + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + }; + + return WritingMode; +}(Declaration); + +_defineProperty(WritingMode, "names", ['writing-mode']); + +_defineProperty(WritingMode, "msValues", { + ltr: { + 'horizontal-tb': 'lr-tb', + 'vertical-rl': 'tb-rl', + 'vertical-lr': 'tb-lr' + }, + rtl: { + 'horizontal-tb': 'rl-tb', + 'vertical-rl': 'bt-rl', + 'vertical-lr': 'bt-lr' + } +}); + +module.exports = WritingMode; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/info.js b/website/www/node_modules/autoprefixer/lib/info.js new file mode 100644 index 000000000000..76cb388ac008 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/info.js @@ -0,0 +1,149 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var browserslist = require('browserslist'); + +function capitalize(str) { + return str.slice(0, 1).toUpperCase() + str.slice(1); +} + +var NAMES = { + ie: 'IE', + ie_mob: 'IE Mobile', + ios_saf: 'iOS', + op_mini: 'Opera Mini', + op_mob: 'Opera Mobile', + and_chr: 'Chrome for Android', + and_ff: 'Firefox for Android', + and_uc: 'UC for Android' +}; + +function prefix(name, prefixes, note) { + var out = " " + name; + if (note) out += ' *'; + out += ': '; + out += prefixes.map(function (i) { + return i.replace(/^-(.*)-$/g, '$1'); + }).join(', '); + out += '\n'; + return out; +} + +module.exports = function (prefixes) { + if (prefixes.browsers.selected.length === 0) { + return 'No browsers selected'; + } + + var versions = {}; + + for (var _iterator = _createForOfIteratorHelperLoose(prefixes.browsers.selected), _step; !(_step = _iterator()).done;) { + var _browser = _step.value; + + var parts = _browser.split(' '); + + var _name2 = parts[0]; + var version = parts[1]; + _name2 = NAMES[_name2] || capitalize(_name2); + + if (versions[_name2]) { + versions[_name2].push(version); + } else { + versions[_name2] = [version]; + } + } + + var out = 'Browsers:\n'; + + for (var browser in versions) { + var list = versions[browser]; + list = list.sort(function (a, b) { + return parseFloat(b) - parseFloat(a); + }); + out += " " + browser + ": " + list.join(', ') + "\n"; + } + + var coverage = browserslist.coverage(prefixes.browsers.selected); + var round = Math.round(coverage * 100) / 100.0; + out += "\nThese browsers account for " + round + "% of all users globally\n"; + var atrules = []; + + for (var name in prefixes.add) { + var data = prefixes.add[name]; + + if (name[0] === '@' && data.prefixes) { + atrules.push(prefix(name, data.prefixes)); + } + } + + if (atrules.length > 0) { + out += "\nAt-Rules:\n" + atrules.sort().join(''); + } + + var selectors = []; + + for (var _iterator2 = _createForOfIteratorHelperLoose(prefixes.add.selectors), _step2; !(_step2 = _iterator2()).done;) { + var selector = _step2.value; + + if (selector.prefixes) { + selectors.push(prefix(selector.name, selector.prefixes)); + } + } + + if (selectors.length > 0) { + out += "\nSelectors:\n" + selectors.sort().join(''); + } + + var values = []; + var props = []; + var hadGrid = false; + + for (var _name in prefixes.add) { + var _data = prefixes.add[_name]; + + if (_name[0] !== '@' && _data.prefixes) { + var grid = _name.indexOf('grid-') === 0; + if (grid) hadGrid = true; + props.push(prefix(_name, _data.prefixes, grid)); + } + + if (!Array.isArray(_data.values)) { + continue; + } + + for (var _iterator3 = _createForOfIteratorHelperLoose(_data.values), _step3; !(_step3 = _iterator3()).done;) { + var value = _step3.value; + + var _grid = value.name.includes('grid'); + + if (_grid) hadGrid = true; + var string = prefix(value.name, value.prefixes, _grid); + + if (!values.includes(string)) { + values.push(string); + } + } + } + + if (props.length > 0) { + out += "\nProperties:\n" + props.sort().join(''); + } + + if (values.length > 0) { + out += "\nValues:\n" + values.sort().join(''); + } + + if (hadGrid) { + out += '\n* - Prefixes will be added only on grid: true option.\n'; + } + + if (!atrules.length && !selectors.length && !props.length && !values.length) { + out += '\nAwesome! Your browsers don\'t require any vendor prefixes.' + '\nNow you can remove Autoprefixer from build steps.'; + } + + return out; +}; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/old-selector.js b/website/www/node_modules/autoprefixer/lib/old-selector.js new file mode 100644 index 000000000000..5737fb8077dd --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/old-selector.js @@ -0,0 +1,88 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var OldSelector = /*#__PURE__*/function () { + function OldSelector(selector, prefix) { + this.prefix = prefix; + this.prefixed = selector.prefixed(this.prefix); + this.regexp = selector.regexp(this.prefix); + this.prefixeds = selector.possible().map(function (x) { + return [selector.prefixed(x), selector.regexp(x)]; + }); + this.unprefixed = selector.name; + this.nameRegexp = selector.regexp(); + } + /** + * Is rule a hack without unprefixed version bottom + */ + + + var _proto = OldSelector.prototype; + + _proto.isHack = function isHack(rule) { + var index = rule.parent.index(rule) + 1; + var rules = rule.parent.nodes; + + while (index < rules.length) { + var before = rules[index].selector; + + if (!before) { + return true; + } + + if (before.includes(this.unprefixed) && before.match(this.nameRegexp)) { + return false; + } + + var some = false; + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixeds), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + string = _step$value[0], + regexp = _step$value[1]; + + if (before.includes(string) && before.match(regexp)) { + some = true; + break; + } + } + + if (!some) { + return true; + } + + index += 1; + } + + return true; + } + /** + * Does rule contain an unnecessary prefixed selector + */ + ; + + _proto.check = function check(rule) { + if (!rule.selector.includes(this.prefixed)) { + return false; + } + + if (!rule.selector.match(this.regexp)) { + return false; + } + + if (this.isHack(rule)) { + return false; + } + + return true; + }; + + return OldSelector; +}(); + +module.exports = OldSelector; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/old-value.js b/website/www/node_modules/autoprefixer/lib/old-value.js new file mode 100644 index 000000000000..cc0570437431 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/old-value.js @@ -0,0 +1,30 @@ +"use strict"; + +var utils = require('./utils'); + +var OldValue = /*#__PURE__*/function () { + function OldValue(unprefixed, prefixed, string, regexp) { + this.unprefixed = unprefixed; + this.prefixed = prefixed; + this.string = string || prefixed; + this.regexp = regexp || utils.regexp(prefixed); + } + /** + * Check, that value contain old value + */ + + + var _proto = OldValue.prototype; + + _proto.check = function check(value) { + if (value.includes(this.string)) { + return !!value.match(this.regexp); + } + + return false; + }; + + return OldValue; +}(); + +module.exports = OldValue; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/prefixer.js b/website/www/node_modules/autoprefixer/lib/prefixer.js new file mode 100644 index 000000000000..7923d964a072 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/prefixer.js @@ -0,0 +1,167 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var vendor = require('postcss').vendor; + +var Browsers = require('./browsers'); + +var utils = require('./utils'); +/** + * Recursively clone objects + */ + + +function _clone(obj, parent) { + var cloned = new obj.constructor(); + + for (var _i = 0, _Object$keys = Object.keys(obj || {}); _i < _Object$keys.length; _i++) { + var i = _Object$keys[_i]; + var value = obj[i]; + + if (i === 'parent' && typeof value === 'object') { + if (parent) { + cloned[i] = parent; + } + } else if (i === 'source' || i === null) { + cloned[i] = value; + } else if (Array.isArray(value)) { + cloned[i] = value.map(function (x) { + return _clone(x, cloned); + }); + } else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') { + if (typeof value === 'object' && value !== null) { + value = _clone(value, cloned); + } + + cloned[i] = value; + } + } + + return cloned; +} + +var Prefixer = /*#__PURE__*/function () { + /** + * Add hack to selected names + */ + Prefixer.hack = function hack(klass) { + var _this = this; + + if (!this.hacks) { + this.hacks = {}; + } + + return klass.names.map(function (name) { + _this.hacks[name] = klass; + return _this.hacks[name]; + }); + } + /** + * Load hacks for some names + */ + ; + + Prefixer.load = function load(name, prefixes, all) { + var Klass = this.hacks && this.hacks[name]; + + if (Klass) { + return new Klass(name, prefixes, all); + } else { + return new this(name, prefixes, all); + } + } + /** + * Clone node and clean autprefixer custom caches + */ + ; + + Prefixer.clone = function clone(node, overrides) { + var cloned = _clone(node); + + for (var name in overrides) { + cloned[name] = overrides[name]; + } + + return cloned; + }; + + function Prefixer(name, prefixes, all) { + this.prefixes = prefixes; + this.name = name; + this.all = all; + } + /** + * Find prefix in node parents + */ + + + var _proto = Prefixer.prototype; + + _proto.parentPrefix = function parentPrefix(node) { + var prefix; + + if (typeof node._autoprefixerPrefix !== 'undefined') { + prefix = node._autoprefixerPrefix; + } else if (node.type === 'decl' && node.prop[0] === '-') { + prefix = vendor.prefix(node.prop); + } else if (node.type === 'root') { + prefix = false; + } else if (node.type === 'rule' && node.selector.includes(':-') && /:(-\w+-)/.test(node.selector)) { + prefix = node.selector.match(/:(-\w+-)/)[1]; + } else if (node.type === 'atrule' && node.name[0] === '-') { + prefix = vendor.prefix(node.name); + } else { + prefix = this.parentPrefix(node.parent); + } + + if (!Browsers.prefixes().includes(prefix)) { + prefix = false; + } + + node._autoprefixerPrefix = prefix; + return node._autoprefixerPrefix; + } + /** + * Clone node with prefixes + */ + ; + + _proto.process = function process(node, result) { + if (!this.check(node)) { + return undefined; + } + + var parent = this.parentPrefix(node); + var prefixes = this.prefixes.filter(function (prefix) { + return !parent || parent === utils.removeNote(prefix); + }); + var added = []; + + for (var _iterator = _createForOfIteratorHelperLoose(prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + + if (this.add(node, prefix, added.concat([prefix]), result)) { + added.push(prefix); + } + } + + return added; + } + /** + * Shortcut for Prefixer.clone + */ + ; + + _proto.clone = function clone(node, overrides) { + return Prefixer.clone(node, overrides); + }; + + return Prefixer; +}(); + +module.exports = Prefixer; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/prefixes.js b/website/www/node_modules/autoprefixer/lib/prefixes.js new file mode 100644 index 000000000000..068597806834 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/prefixes.js @@ -0,0 +1,470 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var vendor = require('postcss').vendor; + +var Declaration = require('./declaration'); + +var Resolution = require('./resolution'); + +var Transition = require('./transition'); + +var Processor = require('./processor'); + +var Supports = require('./supports'); + +var Browsers = require('./browsers'); + +var Selector = require('./selector'); + +var AtRule = require('./at-rule'); + +var Value = require('./value'); + +var utils = require('./utils'); + +Selector.hack(require('./hacks/fullscreen')); +Selector.hack(require('./hacks/placeholder')); +Declaration.hack(require('./hacks/flex')); +Declaration.hack(require('./hacks/order')); +Declaration.hack(require('./hacks/filter')); +Declaration.hack(require('./hacks/grid-end')); +Declaration.hack(require('./hacks/animation')); +Declaration.hack(require('./hacks/flex-flow')); +Declaration.hack(require('./hacks/flex-grow')); +Declaration.hack(require('./hacks/flex-wrap')); +Declaration.hack(require('./hacks/grid-area')); +Declaration.hack(require('./hacks/place-self')); +Declaration.hack(require('./hacks/grid-start')); +Declaration.hack(require('./hacks/align-self')); +Declaration.hack(require('./hacks/appearance')); +Declaration.hack(require('./hacks/flex-basis')); +Declaration.hack(require('./hacks/mask-border')); +Declaration.hack(require('./hacks/mask-composite')); +Declaration.hack(require('./hacks/align-items')); +Declaration.hack(require('./hacks/user-select')); +Declaration.hack(require('./hacks/flex-shrink')); +Declaration.hack(require('./hacks/break-props')); +Declaration.hack(require('./hacks/color-adjust')); +Declaration.hack(require('./hacks/writing-mode')); +Declaration.hack(require('./hacks/border-image')); +Declaration.hack(require('./hacks/align-content')); +Declaration.hack(require('./hacks/border-radius')); +Declaration.hack(require('./hacks/block-logical')); +Declaration.hack(require('./hacks/grid-template')); +Declaration.hack(require('./hacks/inline-logical')); +Declaration.hack(require('./hacks/grid-row-align')); +Declaration.hack(require('./hacks/transform-decl')); +Declaration.hack(require('./hacks/flex-direction')); +Declaration.hack(require('./hacks/image-rendering')); +Declaration.hack(require('./hacks/backdrop-filter')); +Declaration.hack(require('./hacks/background-clip')); +Declaration.hack(require('./hacks/text-decoration')); +Declaration.hack(require('./hacks/justify-content')); +Declaration.hack(require('./hacks/background-size')); +Declaration.hack(require('./hacks/grid-row-column')); +Declaration.hack(require('./hacks/grid-rows-columns')); +Declaration.hack(require('./hacks/grid-column-align')); +Declaration.hack(require('./hacks/overscroll-behavior')); +Declaration.hack(require('./hacks/grid-template-areas')); +Declaration.hack(require('./hacks/text-emphasis-position')); +Declaration.hack(require('./hacks/text-decoration-skip-ink')); +Value.hack(require('./hacks/gradient')); +Value.hack(require('./hacks/intrinsic')); +Value.hack(require('./hacks/pixelated')); +Value.hack(require('./hacks/image-set')); +Value.hack(require('./hacks/cross-fade')); +Value.hack(require('./hacks/display-flex')); +Value.hack(require('./hacks/display-grid')); +Value.hack(require('./hacks/filter-value')); +var declsCache = {}; + +var Prefixes = /*#__PURE__*/function () { + function Prefixes(data, browsers, options) { + if (options === void 0) { + options = {}; + } + + this.data = data; + this.browsers = browsers; + this.options = options; + + var _this$preprocess = this.preprocess(this.select(this.data)); + + this.add = _this$preprocess[0]; + this.remove = _this$preprocess[1]; + this.transition = new Transition(this); + this.processor = new Processor(this); + } + /** + * Return clone instance to remove all prefixes + */ + + + var _proto = Prefixes.prototype; + + _proto.cleaner = function cleaner() { + if (this.cleanerCache) { + return this.cleanerCache; + } + + if (this.browsers.selected.length) { + var empty = new Browsers(this.browsers.data, []); + this.cleanerCache = new Prefixes(this.data, empty, this.options); + } else { + return this; + } + + return this.cleanerCache; + } + /** + * Select prefixes from data, which is necessary for selected browsers + */ + ; + + _proto.select = function select(list) { + var _this = this; + + var selected = { + add: {}, + remove: {} + }; + + var _loop = function _loop(name) { + var data = list[name]; + var add = data.browsers.map(function (i) { + var params = i.split(' '); + return { + browser: params[0] + " " + params[1], + note: params[2] + }; + }); + var notes = add.filter(function (i) { + return i.note; + }).map(function (i) { + return _this.browsers.prefix(i.browser) + " " + i.note; + }); + notes = utils.uniq(notes); + add = add.filter(function (i) { + return _this.browsers.isSelected(i.browser); + }).map(function (i) { + var prefix = _this.browsers.prefix(i.browser); + + if (i.note) { + return prefix + " " + i.note; + } else { + return prefix; + } + }); + add = _this.sort(utils.uniq(add)); + + if (_this.options.flexbox === 'no-2009') { + add = add.filter(function (i) { + return !i.includes('2009'); + }); + } + + var all = data.browsers.map(function (i) { + return _this.browsers.prefix(i); + }); + + if (data.mistakes) { + all = all.concat(data.mistakes); + } + + all = all.concat(notes); + all = utils.uniq(all); + + if (add.length) { + selected.add[name] = add; + + if (add.length < all.length) { + selected.remove[name] = all.filter(function (i) { + return !add.includes(i); + }); + } + } else { + selected.remove[name] = all; + } + }; + + for (var name in list) { + _loop(name); + } + + return selected; + } + /** + * Sort vendor prefixes + */ + ; + + _proto.sort = function sort(prefixes) { + return prefixes.sort(function (a, b) { + var aLength = utils.removeNote(a).length; + var bLength = utils.removeNote(b).length; + + if (aLength === bLength) { + return b.length - a.length; + } else { + return bLength - aLength; + } + }); + } + /** + * Cache prefixes data to fast CSS processing + */ + ; + + _proto.preprocess = function preprocess(selected) { + var add = { + 'selectors': [], + '@supports': new Supports(Prefixes, this) + }; + + for (var name in selected.add) { + var prefixes = selected.add[name]; + + if (name === '@keyframes' || name === '@viewport') { + add[name] = new AtRule(name, prefixes, this); + } else if (name === '@resolution') { + add[name] = new Resolution(name, prefixes, this); + } else if (this.data[name].selector) { + add.selectors.push(Selector.load(name, prefixes, this)); + } else { + var props = this.data[name].props; + + if (props) { + var value = Value.load(name, prefixes, this); + + for (var _iterator = _createForOfIteratorHelperLoose(props), _step; !(_step = _iterator()).done;) { + var prop = _step.value; + + if (!add[prop]) { + add[prop] = { + values: [] + }; + } + + add[prop].values.push(value); + } + } else { + var values = add[name] && add[name].values || []; + add[name] = Declaration.load(name, prefixes, this); + add[name].values = values; + } + } + } + + var remove = { + selectors: [] + }; + + for (var _name in selected.remove) { + var _prefixes = selected.remove[_name]; + + if (this.data[_name].selector) { + var selector = Selector.load(_name, _prefixes); + + for (var _iterator2 = _createForOfIteratorHelperLoose(_prefixes), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + remove.selectors.push(selector.old(prefix)); + } + } else if (_name === '@keyframes' || _name === '@viewport') { + for (var _iterator3 = _createForOfIteratorHelperLoose(_prefixes), _step3; !(_step3 = _iterator3()).done;) { + var _prefix = _step3.value; + + var prefixed = "@" + _prefix + _name.slice(1); + + remove[prefixed] = { + remove: true + }; + } + } else if (_name === '@resolution') { + remove[_name] = new Resolution(_name, _prefixes, this); + } else { + var _props = this.data[_name].props; + + if (_props) { + var _value = Value.load(_name, [], this); + + for (var _iterator4 = _createForOfIteratorHelperLoose(_prefixes), _step4; !(_step4 = _iterator4()).done;) { + var _prefix2 = _step4.value; + + var old = _value.old(_prefix2); + + if (old) { + for (var _iterator5 = _createForOfIteratorHelperLoose(_props), _step5; !(_step5 = _iterator5()).done;) { + var _prop = _step5.value; + + if (!remove[_prop]) { + remove[_prop] = {}; + } + + if (!remove[_prop].values) { + remove[_prop].values = []; + } + + remove[_prop].values.push(old); + } + } + } + } else { + for (var _iterator6 = _createForOfIteratorHelperLoose(_prefixes), _step6; !(_step6 = _iterator6()).done;) { + var p = _step6.value; + var olds = this.decl(_name).old(_name, p); + + if (_name === 'align-self') { + var a = add[_name] && add[_name].prefixes; + + if (a) { + if (p === '-webkit- 2009' && a.includes('-webkit-')) { + continue; + } else if (p === '-webkit-' && a.includes('-webkit- 2009')) { + continue; + } + } + } + + for (var _iterator7 = _createForOfIteratorHelperLoose(olds), _step7; !(_step7 = _iterator7()).done;) { + var _prefixed = _step7.value; + + if (!remove[_prefixed]) { + remove[_prefixed] = {}; + } + + remove[_prefixed].remove = true; + } + } + } + } + } + + return [add, remove]; + } + /** + * Declaration loader with caching + */ + ; + + _proto.decl = function decl(prop) { + var decl = declsCache[prop]; + + if (decl) { + return decl; + } else { + declsCache[prop] = Declaration.load(prop); + return declsCache[prop]; + } + } + /** + * Return unprefixed version of property + */ + ; + + _proto.unprefixed = function unprefixed(prop) { + var value = this.normalize(vendor.unprefixed(prop)); + + if (value === 'flex-direction') { + value = 'flex-flow'; + } + + return value; + } + /** + * Normalize prefix for remover + */ + ; + + _proto.normalize = function normalize(prop) { + return this.decl(prop).normalize(prop); + } + /** + * Return prefixed version of property + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + prop = vendor.unprefixed(prop); + return this.decl(prop).prefixed(prop, prefix); + } + /** + * Return values, which must be prefixed in selected property + */ + ; + + _proto.values = function values(type, prop) { + var data = this[type]; + var global = data['*'] && data['*'].values; + var values = data[prop] && data[prop].values; + + if (global && values) { + return utils.uniq(global.concat(values)); + } else { + return global || values || []; + } + } + /** + * Group declaration by unprefixed property to check them + */ + ; + + _proto.group = function group(decl) { + var _this2 = this; + + var rule = decl.parent; + var index = rule.index(decl); + var length = rule.nodes.length; + var unprefixed = this.unprefixed(decl.prop); + + var checker = function checker(step, callback) { + index += step; + + while (index >= 0 && index < length) { + var other = rule.nodes[index]; + + if (other.type === 'decl') { + if (step === -1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + + if (_this2.unprefixed(other.prop) !== unprefixed) { + break; + } else if (callback(other) === true) { + return true; + } + + if (step === +1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + } + + index += step; + } + + return false; + }; + + return { + up: function up(callback) { + return checker(-1, callback); + }, + down: function down(callback) { + return checker(+1, callback); + } + }; + }; + + return Prefixes; +}(); + +module.exports = Prefixes; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/processor.js b/website/www/node_modules/autoprefixer/lib/processor.js new file mode 100644 index 000000000000..2c71d2df1352 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/processor.js @@ -0,0 +1,699 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var parser = require('postcss-value-parser'); + +var Value = require('./value'); + +var insertAreas = require('./hacks/grid-utils').insertAreas; + +var OLD_LINEAR = /(^|[^-])linear-gradient\(\s*(top|left|right|bottom)/i; +var OLD_RADIAL = /(^|[^-])radial-gradient\(\s*\d+(\w*|%)\s+\d+(\w*|%)\s*,/i; +var IGNORE_NEXT = /(!\s*)?autoprefixer:\s*ignore\s+next/i; +var GRID_REGEX = /(!\s*)?autoprefixer\s*grid:\s*(on|off|(no-)?autoplace)/i; +var SIZES = ['width', 'height', 'min-width', 'max-width', 'min-height', 'max-height', 'inline-size', 'min-inline-size', 'max-inline-size', 'block-size', 'min-block-size', 'max-block-size']; + +function hasGridTemplate(decl) { + return decl.parent.some(function (i) { + return i.prop === 'grid-template' || i.prop === 'grid-template-areas'; + }); +} + +function hasRowsAndColumns(decl) { + var hasRows = decl.parent.some(function (i) { + return i.prop === 'grid-template-rows'; + }); + var hasColumns = decl.parent.some(function (i) { + return i.prop === 'grid-template-columns'; + }); + return hasRows && hasColumns; +} + +var Processor = /*#__PURE__*/function () { + function Processor(prefixes) { + this.prefixes = prefixes; + } + /** + * Add necessary prefixes + */ + + + var _proto = Processor.prototype; + + _proto.add = function add(css, result) { + var _this = this; + + // At-rules + var resolution = this.prefixes.add['@resolution']; + var keyframes = this.prefixes.add['@keyframes']; + var viewport = this.prefixes.add['@viewport']; + var supports = this.prefixes.add['@supports']; + css.walkAtRules(function (rule) { + if (rule.name === 'keyframes') { + if (!_this.disabled(rule, result)) { + return keyframes && keyframes.process(rule); + } + } else if (rule.name === 'viewport') { + if (!_this.disabled(rule, result)) { + return viewport && viewport.process(rule); + } + } else if (rule.name === 'supports') { + if (_this.prefixes.options.supports !== false && !_this.disabled(rule, result)) { + return supports.process(rule); + } + } else if (rule.name === 'media' && rule.params.includes('-resolution')) { + if (!_this.disabled(rule, result)) { + return resolution && resolution.process(rule); + } + } + + return undefined; + }); // Selectors + + css.walkRules(function (rule) { + if (_this.disabled(rule, result)) return undefined; + return _this.prefixes.add.selectors.map(function (selector) { + return selector.process(rule, result); + }); + }); + + function insideGrid(decl) { + return decl.parent.nodes.some(function (node) { + if (node.type !== 'decl') return false; + var displayGrid = node.prop === 'display' && /(inline-)?grid/.test(node.value); + var gridTemplate = node.prop.startsWith('grid-template'); + var gridGap = /^grid-([A-z]+-)?gap/.test(node.prop); + return displayGrid || gridTemplate || gridGap; + }); + } + + function insideFlex(decl) { + return decl.parent.some(function (node) { + return node.prop === 'display' && /(inline-)?flex/.test(node.value); + }); + } + + var gridPrefixes = this.gridStatus(css, result) && this.prefixes.add['grid-area'] && this.prefixes.add['grid-area'].prefixes; + css.walkDecls(function (decl) { + if (_this.disabledDecl(decl, result)) return undefined; + var parent = decl.parent; + var prop = decl.prop; + var value = decl.value; + + if (prop === 'grid-row-span') { + result.warn('grid-row-span is not part of final Grid Layout. Use grid-row.', { + node: decl + }); + return undefined; + } else if (prop === 'grid-column-span') { + result.warn('grid-column-span is not part of final Grid Layout. Use grid-column.', { + node: decl + }); + return undefined; + } else if (prop === 'display' && value === 'box') { + result.warn('You should write display: flex by final spec ' + 'instead of display: box', { + node: decl + }); + return undefined; + } else if (prop === 'text-emphasis-position') { + if (value === 'under' || value === 'over') { + result.warn('You should use 2 values for text-emphasis-position ' + 'For example, `under left` instead of just `under`.', { + node: decl + }); + } + } else if (/^(align|justify|place)-(items|content)$/.test(prop) && insideFlex(decl)) { + if (value === 'start' || value === 'end') { + result.warn(value + " value has mixed support, consider using " + ("flex-" + value + " instead"), { + node: decl + }); + } + } else if (prop === 'text-decoration-skip' && value === 'ink') { + result.warn('Replace text-decoration-skip: ink to ' + 'text-decoration-skip-ink: auto, because spec had been changed', { + node: decl + }); + } else { + if (gridPrefixes) { + if (/^(align|justify|place)-items$/.test(prop) && insideGrid(decl)) { + var fixed = prop.replace('-items', '-self'); + result.warn("IE does not support " + prop + " on grid containers. " + ("Try using " + fixed + " on child elements instead: ") + (decl.parent.selector + " > * { " + fixed + ": " + decl.value + " }"), { + node: decl + }); + } else if (/^(align|justify|place)-content$/.test(prop) && insideGrid(decl)) { + result.warn("IE does not support " + decl.prop + " on grid containers", { + node: decl + }); + } else if (prop === 'display' && decl.value === 'contents') { + result.warn('Please do not use display: contents; ' + 'if you have grid setting enabled', { + node: decl + }); + return undefined; + } else if (decl.prop === 'grid-gap') { + var status = _this.gridStatus(decl, result); + + if (status === 'autoplace' && !hasRowsAndColumns(decl) && !hasGridTemplate(decl)) { + result.warn('grid-gap only works if grid-template(-areas) is being ' + 'used or both rows and columns have been declared ' + 'and cells have not been manually ' + 'placed inside the explicit grid', { + node: decl + }); + } else if ((status === true || status === 'no-autoplace') && !hasGridTemplate(decl)) { + result.warn('grid-gap only works if grid-template(-areas) is being used', { + node: decl + }); + } + } else if (prop === 'grid-auto-columns') { + result.warn('grid-auto-columns is not supported by IE', { + node: decl + }); + return undefined; + } else if (prop === 'grid-auto-rows') { + result.warn('grid-auto-rows is not supported by IE', { + node: decl + }); + return undefined; + } else if (prop === 'grid-auto-flow') { + var hasRows = parent.some(function (i) { + return i.prop === 'grid-template-rows'; + }); + var hasCols = parent.some(function (i) { + return i.prop === 'grid-template-columns'; + }); + + if (hasGridTemplate(decl)) { + result.warn('grid-auto-flow is not supported by IE', { + node: decl + }); + } else if (value.includes('dense')) { + result.warn('grid-auto-flow: dense is not supported by IE', { + node: decl + }); + } else if (!hasRows && !hasCols) { + result.warn('grid-auto-flow works only if grid-template-rows and ' + 'grid-template-columns are present in the same rule', { + node: decl + }); + } + + return undefined; + } else if (value.includes('auto-fit')) { + result.warn('auto-fit value is not supported by IE', { + node: decl, + word: 'auto-fit' + }); + return undefined; + } else if (value.includes('auto-fill')) { + result.warn('auto-fill value is not supported by IE', { + node: decl, + word: 'auto-fill' + }); + return undefined; + } else if (prop.startsWith('grid-template') && value.includes('[')) { + result.warn('Autoprefixer currently does not support line names. ' + 'Try using grid-template-areas instead.', { + node: decl, + word: '[' + }); + } + } + + if (value.includes('radial-gradient')) { + if (OLD_RADIAL.test(decl.value)) { + result.warn('Gradient has outdated direction syntax. ' + 'New syntax is like `closest-side at 0 0` ' + 'instead of `0 0, closest-side`.', { + node: decl + }); + } else { + var ast = parser(value); + + for (var _iterator = _createForOfIteratorHelperLoose(ast.nodes), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (i.type === 'function' && i.value === 'radial-gradient') { + for (var _iterator2 = _createForOfIteratorHelperLoose(i.nodes), _step2; !(_step2 = _iterator2()).done;) { + var word = _step2.value; + + if (word.type === 'word') { + if (word.value === 'cover') { + result.warn('Gradient has outdated direction syntax. ' + 'Replace `cover` to `farthest-corner`.', { + node: decl + }); + } else if (word.value === 'contain') { + result.warn('Gradient has outdated direction syntax. ' + 'Replace `contain` to `closest-side`.', { + node: decl + }); + } + } + } + } + } + } + } + + if (value.includes('linear-gradient')) { + if (OLD_LINEAR.test(value)) { + result.warn('Gradient has outdated direction syntax. ' + 'New syntax is like `to left` instead of `right`.', { + node: decl + }); + } + } + } + + if (SIZES.includes(decl.prop)) { + if (!decl.value.includes('-fill-available')) { + if (decl.value.includes('fill-available')) { + result.warn('Replace fill-available to stretch, ' + 'because spec had been changed', { + node: decl + }); + } else if (decl.value.includes('fill')) { + var _ast = parser(value); + + if (_ast.nodes.some(function (i) { + return i.type === 'word' && i.value === 'fill'; + })) { + result.warn('Replace fill to stretch, because spec had been changed', { + node: decl + }); + } + } + } + } + + var prefixer; + + if (decl.prop === 'transition' || decl.prop === 'transition-property') { + // Transition + return _this.prefixes.transition.add(decl, result); + } else if (decl.prop === 'align-self') { + // align-self flexbox or grid + var display = _this.displayType(decl); + + if (display !== 'grid' && _this.prefixes.options.flexbox !== false) { + prefixer = _this.prefixes.add['align-self']; + + if (prefixer && prefixer.prefixes) { + prefixer.process(decl); + } + } + + if (display !== 'flex' && _this.gridStatus(decl, result) !== false) { + prefixer = _this.prefixes.add['grid-row-align']; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + } else if (decl.prop === 'justify-self') { + // justify-self flexbox or grid + var _display = _this.displayType(decl); + + if (_display !== 'flex' && _this.gridStatus(decl, result) !== false) { + prefixer = _this.prefixes.add['grid-column-align']; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + } else if (decl.prop === 'place-self') { + prefixer = _this.prefixes.add['place-self']; + + if (prefixer && prefixer.prefixes && _this.gridStatus(decl, result) !== false) { + return prefixer.process(decl, result); + } + } else { + // Properties + prefixer = _this.prefixes.add[decl.prop]; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + + return undefined; + }); // Insert grid-area prefixes. We need to be able to store the different + // rules as a data and hack API is not enough for this + + if (this.gridStatus(css, result)) { + insertAreas(css, this.disabled); + } // Values + + + return css.walkDecls(function (decl) { + if (_this.disabledValue(decl, result)) return; + + var unprefixed = _this.prefixes.unprefixed(decl.prop); + + var list = _this.prefixes.values('add', unprefixed); + + if (Array.isArray(list)) { + for (var _iterator3 = _createForOfIteratorHelperLoose(list), _step3; !(_step3 = _iterator3()).done;) { + var value = _step3.value; + if (value.process) value.process(decl, result); + } + } + + Value.save(_this.prefixes, decl); + }); + } + /** + * Remove unnecessary pefixes + */ + ; + + _proto.remove = function remove(css, result) { + var _this2 = this; + + // At-rules + var resolution = this.prefixes.remove['@resolution']; + css.walkAtRules(function (rule, i) { + if (_this2.prefixes.remove["@" + rule.name]) { + if (!_this2.disabled(rule, result)) { + rule.parent.removeChild(i); + } + } else if (rule.name === 'media' && rule.params.includes('-resolution') && resolution) { + resolution.clean(rule); + } + }); // Selectors + + var _loop = function _loop() { + var checker = _step4.value; + css.walkRules(function (rule, i) { + if (checker.check(rule)) { + if (!_this2.disabled(rule, result)) { + rule.parent.removeChild(i); + } + } + }); + }; + + for (var _iterator4 = _createForOfIteratorHelperLoose(this.prefixes.remove.selectors), _step4; !(_step4 = _iterator4()).done;) { + _loop(); + } + + return css.walkDecls(function (decl, i) { + if (_this2.disabled(decl, result)) return; + var rule = decl.parent; + + var unprefixed = _this2.prefixes.unprefixed(decl.prop); // Transition + + + if (decl.prop === 'transition' || decl.prop === 'transition-property') { + _this2.prefixes.transition.remove(decl); + } // Properties + + + if (_this2.prefixes.remove[decl.prop] && _this2.prefixes.remove[decl.prop].remove) { + var notHack = _this2.prefixes.group(decl).down(function (other) { + return _this2.prefixes.normalize(other.prop) === unprefixed; + }); + + if (unprefixed === 'flex-flow') { + notHack = true; + } + + if (decl.prop === '-webkit-box-orient') { + var hacks = { + 'flex-direction': true, + 'flex-flow': true + }; + if (!decl.parent.some(function (j) { + return hacks[j.prop]; + })) return; + } + + if (notHack && !_this2.withHackValue(decl)) { + if (decl.raw('before').includes('\n')) { + _this2.reduceSpaces(decl); + } + + rule.removeChild(i); + return; + } + } // Values + + + for (var _iterator5 = _createForOfIteratorHelperLoose(_this2.prefixes.values('remove', unprefixed)), _step5; !(_step5 = _iterator5()).done;) { + var checker = _step5.value; + if (!checker.check) continue; + if (!checker.check(decl.value)) continue; + unprefixed = checker.unprefixed; + + var _notHack = _this2.prefixes.group(decl).down(function (other) { + return other.value.includes(unprefixed); + }); + + if (_notHack) { + rule.removeChild(i); + return; + } + } + }); + } + /** + * Some rare old values, which is not in standard + */ + ; + + _proto.withHackValue = function withHackValue(decl) { + return decl.prop === '-webkit-background-clip' && decl.value === 'text'; + } + /** + * Check for grid/flexbox options. + */ + ; + + _proto.disabledValue = function disabledValue(node, result) { + if (this.gridStatus(node, result) === false && node.type === 'decl') { + if (node.prop === 'display' && node.value.includes('grid')) { + return true; + } + } + + if (this.prefixes.options.flexbox === false && node.type === 'decl') { + if (node.prop === 'display' && node.value.includes('flex')) { + return true; + } + } + + return this.disabled(node, result); + } + /** + * Check for grid/flexbox options. + */ + ; + + _proto.disabledDecl = function disabledDecl(node, result) { + if (this.gridStatus(node, result) === false && node.type === 'decl') { + if (node.prop.includes('grid') || node.prop === 'justify-items') { + return true; + } + } + + if (this.prefixes.options.flexbox === false && node.type === 'decl') { + var other = ['order', 'justify-content', 'align-items', 'align-content']; + + if (node.prop.includes('flex') || other.includes(node.prop)) { + return true; + } + } + + return this.disabled(node, result); + } + /** + * Check for control comment and global options + */ + ; + + _proto.disabled = function disabled(node, result) { + if (!node) return false; + + if (node._autoprefixerDisabled !== undefined) { + return node._autoprefixerDisabled; + } + + if (node.parent) { + var p = node.prev(); + + if (p && p.type === 'comment' && IGNORE_NEXT.test(p.text)) { + node._autoprefixerDisabled = true; + node._autoprefixerSelfDisabled = true; + return true; + } + } + + var value = null; + + if (node.nodes) { + var status; + node.each(function (i) { + if (i.type !== 'comment') return; + + if (/(!\s*)?autoprefixer:\s*(off|on)/i.test(i.text)) { + if (typeof status !== 'undefined') { + result.warn('Second Autoprefixer control comment ' + 'was ignored. Autoprefixer applies control ' + 'comment to whole block, not to next rules.', { + node: i + }); + } else { + status = /on/i.test(i.text); + } + } + }); + + if (status !== undefined) { + value = !status; + } + } + + if (!node.nodes || value === null) { + if (node.parent) { + var isParentDisabled = this.disabled(node.parent, result); + + if (node.parent._autoprefixerSelfDisabled === true) { + value = false; + } else { + value = isParentDisabled; + } + } else { + value = false; + } + } + + node._autoprefixerDisabled = value; + return value; + } + /** + * Normalize spaces in cascade declaration group + */ + ; + + _proto.reduceSpaces = function reduceSpaces(decl) { + var stop = false; + this.prefixes.group(decl).up(function () { + stop = true; + return true; + }); + + if (stop) { + return; + } + + var parts = decl.raw('before').split('\n'); + var prevMin = parts[parts.length - 1].length; + var diff = false; + this.prefixes.group(decl).down(function (other) { + parts = other.raw('before').split('\n'); + var last = parts.length - 1; + + if (parts[last].length > prevMin) { + if (diff === false) { + diff = parts[last].length - prevMin; + } + + parts[last] = parts[last].slice(0, -diff); + other.raws.before = parts.join('\n'); + } + }); + } + /** + * Is it flebox or grid rule + */ + ; + + _proto.displayType = function displayType(decl) { + for (var _iterator6 = _createForOfIteratorHelperLoose(decl.parent.nodes), _step6; !(_step6 = _iterator6()).done;) { + var i = _step6.value; + + if (i.prop !== 'display') { + continue; + } + + if (i.value.includes('flex')) { + return 'flex'; + } + + if (i.value.includes('grid')) { + return 'grid'; + } + } + + return false; + } + /** + * Set grid option via control comment + */ + ; + + _proto.gridStatus = function gridStatus(node, result) { + if (!node) return false; + + if (node._autoprefixerGridStatus !== undefined) { + return node._autoprefixerGridStatus; + } + + var value = null; + + if (node.nodes) { + var status; + node.each(function (i) { + if (i.type !== 'comment') return; + + if (GRID_REGEX.test(i.text)) { + var hasAutoplace = /:\s*autoplace/i.test(i.text); + var noAutoplace = /no-autoplace/i.test(i.text); + + if (typeof status !== 'undefined') { + result.warn('Second Autoprefixer grid control comment was ' + 'ignored. Autoprefixer applies control comments to the whole ' + 'block, not to the next rules.', { + node: i + }); + } else if (hasAutoplace) { + status = 'autoplace'; + } else if (noAutoplace) { + status = true; + } else { + status = /on/i.test(i.text); + } + } + }); + + if (status !== undefined) { + value = status; + } + } + + if (node.type === 'atrule' && node.name === 'supports') { + var params = node.params; + + if (params.includes('grid') && params.includes('auto')) { + value = false; + } + } + + if (!node.nodes || value === null) { + if (node.parent) { + var isParentGrid = this.gridStatus(node.parent, result); + + if (node.parent._autoprefixerSelfDisabled === true) { + value = false; + } else { + value = isParentGrid; + } + } else if (typeof this.prefixes.options.grid !== 'undefined') { + value = this.prefixes.options.grid; + } else if (typeof process.env.AUTOPREFIXER_GRID !== 'undefined') { + if (process.env.AUTOPREFIXER_GRID === 'autoplace') { + value = 'autoplace'; + } else { + value = true; + } + } else { + value = false; + } + } + + node._autoprefixerGridStatus = value; + return value; + }; + + return Processor; +}(); + +module.exports = Processor; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/resolution.js b/website/www/node_modules/autoprefixer/lib/resolution.js new file mode 100644 index 000000000000..89b345f7e3bd --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/resolution.js @@ -0,0 +1,137 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +var n2f = require('num2fraction'); + +var Prefixer = require('./prefixer'); + +var utils = require('./utils'); + +var REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpi|x)/gi; +var SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpi|x)/i; + +var Resolution = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Resolution, _Prefixer); + + var _super = _createSuper(Resolution); + + function Resolution() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = Resolution.prototype; + + /** + * Return prefixed query name + */ + _proto.prefixName = function prefixName(prefix, name) { + if (prefix === '-moz-') { + return name + '--moz-device-pixel-ratio'; + } else { + return prefix + name + '-device-pixel-ratio'; + } + } + /** + * Return prefixed query + */ + ; + + _proto.prefixQuery = function prefixQuery(prefix, name, colon, value, units) { + if (units === 'dpi') { + value = Number(value / 96); + } + + if (prefix === '-o-') { + value = n2f(value); + } + + return this.prefixName(prefix, name) + colon + value; + } + /** + * Remove prefixed queries + */ + ; + + _proto.clean = function clean(rule) { + var _this = this; + + if (!this.bad) { + this.bad = []; + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + this.bad.push(this.prefixName(prefix, 'min')); + this.bad.push(this.prefixName(prefix, 'max')); + } + } + + rule.params = utils.editList(rule.params, function (queries) { + return queries.filter(function (query) { + return _this.bad.every(function (i) { + return !query.includes(i); + }); + }); + }); + } + /** + * Add prefixed queries + */ + ; + + _proto.process = function process(rule) { + var _this2 = this; + + var parent = this.parentPrefix(rule); + var prefixes = parent ? [parent] : this.prefixes; + rule.params = utils.editList(rule.params, function (origin, prefixed) { + for (var _iterator2 = _createForOfIteratorHelperLoose(origin), _step2; !(_step2 = _iterator2()).done;) { + var query = _step2.value; + + if (!query.includes('min-resolution') && !query.includes('max-resolution')) { + prefixed.push(query); + continue; + } + + var _loop = function _loop() { + var prefix = _step3.value; + var processed = query.replace(REGEXP, function (str) { + var parts = str.match(SPLIT); + return _this2.prefixQuery(prefix, parts[1], parts[2], parts[3], parts[4]); + }); + prefixed.push(processed); + }; + + for (var _iterator3 = _createForOfIteratorHelperLoose(prefixes), _step3; !(_step3 = _iterator3()).done;) { + _loop(); + } + + prefixed.push(query); + } + + return utils.uniq(prefixed); + }); + }; + + return Resolution; +}(Prefixer); + +module.exports = Resolution; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/selector.js b/website/www/node_modules/autoprefixer/lib/selector.js new file mode 100644 index 000000000000..e26eee8995fb --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/selector.js @@ -0,0 +1,210 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +var _require = require('postcss'), + list = _require.list; + +var OldSelector = require('./old-selector'); + +var Prefixer = require('./prefixer'); + +var Browsers = require('./browsers'); + +var utils = require('./utils'); + +var Selector = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Selector, _Prefixer); + + var _super = _createSuper(Selector); + + function Selector(name, prefixes, all) { + var _this; + + _this = _Prefixer.call(this, name, prefixes, all) || this; + _this.regexpCache = {}; + return _this; + } + /** + * Is rule selectors need to be prefixed + */ + + + var _proto = Selector.prototype; + + _proto.check = function check(rule) { + if (rule.selector.includes(this.name)) { + return !!rule.selector.match(this.regexp()); + } + + return false; + } + /** + * Return prefixed version of selector + */ + ; + + _proto.prefixed = function prefixed(prefix) { + return this.name.replace(/^(\W*)/, "$1" + prefix); + } + /** + * Lazy loadRegExp for name + */ + ; + + _proto.regexp = function regexp(prefix) { + if (this.regexpCache[prefix]) { + return this.regexpCache[prefix]; + } + + var name = prefix ? this.prefixed(prefix) : this.name; + this.regexpCache[prefix] = new RegExp("(^|[^:\"'=])" + utils.escapeRegexp(name), 'gi'); + return this.regexpCache[prefix]; + } + /** + * All possible prefixes + */ + ; + + _proto.possible = function possible() { + return Browsers.prefixes(); + } + /** + * Return all possible selector prefixes + */ + ; + + _proto.prefixeds = function prefixeds(rule) { + var _this2 = this; + + if (rule._autoprefixerPrefixeds) { + if (rule._autoprefixerPrefixeds[this.name]) { + return rule._autoprefixerPrefixeds; + } + } else { + rule._autoprefixerPrefixeds = {}; + } + + var prefixeds = {}; + + if (rule.selector.includes(',')) { + var ruleParts = list.comma(rule.selector); + var toProcess = ruleParts.filter(function (el) { + return el.includes(_this2.name); + }); + + var _loop = function _loop() { + var prefix = _step.value; + prefixeds[prefix] = toProcess.map(function (el) { + return _this2.replace(el, prefix); + }).join(', '); + }; + + for (var _iterator = _createForOfIteratorHelperLoose(this.possible()), _step; !(_step = _iterator()).done;) { + _loop(); + } + } else { + for (var _iterator2 = _createForOfIteratorHelperLoose(this.possible()), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + prefixeds[prefix] = this.replace(rule.selector, prefix); + } + } + + rule._autoprefixerPrefixeds[this.name] = prefixeds; + return rule._autoprefixerPrefixeds; + } + /** + * Is rule already prefixed before + */ + ; + + _proto.already = function already(rule, prefixeds, prefix) { + var index = rule.parent.index(rule) - 1; + + while (index >= 0) { + var before = rule.parent.nodes[index]; + + if (before.type !== 'rule') { + return false; + } + + var some = false; + + for (var key in prefixeds[this.name]) { + var prefixed = prefixeds[this.name][key]; + + if (before.selector === prefixed) { + if (prefix === key) { + return true; + } else { + some = true; + break; + } + } + } + + if (!some) { + return false; + } + + index -= 1; + } + + return false; + } + /** + * Replace selectors by prefixed one + */ + ; + + _proto.replace = function replace(selector, prefix) { + return selector.replace(this.regexp(), "$1" + this.prefixed(prefix)); + } + /** + * Clone and add prefixes for at-rule + */ + ; + + _proto.add = function add(rule, prefix) { + var prefixeds = this.prefixeds(rule); + + if (this.already(rule, prefixeds, prefix)) { + return; + } + + var cloned = this.clone(rule, { + selector: prefixeds[this.name][prefix] + }); + rule.parent.insertBefore(rule, cloned); + } + /** + * Return function to fast find prefixed selector + */ + ; + + _proto.old = function old(prefix) { + return new OldSelector(this, prefix); + }; + + return Selector; +}(Prefixer); + +module.exports = Selector; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/supports.js b/website/www/node_modules/autoprefixer/lib/supports.js new file mode 100644 index 000000000000..f50b9ad820d6 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/supports.js @@ -0,0 +1,346 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var postcss = require('postcss'); + +var data = require('caniuse-lite').feature(require('caniuse-lite/data/features/css-featurequeries.js')); + +var Browsers = require('./browsers'); + +var brackets = require('./brackets'); + +var Value = require('./value'); + +var utils = require('./utils'); + +var supported = []; + +for (var browser in data.stats) { + var versions = data.stats[browser]; + + for (var version in versions) { + var support = versions[version]; + + if (/y/.test(support)) { + supported.push(browser + ' ' + version); + } + } +} + +var Supports = /*#__PURE__*/function () { + function Supports(Prefixes, all) { + this.Prefixes = Prefixes; + this.all = all; + } + /** + * Return prefixer only with @supports supported browsers + */ + + + var _proto = Supports.prototype; + + _proto.prefixer = function prefixer() { + if (this.prefixerCache) { + return this.prefixerCache; + } + + var filtered = this.all.browsers.selected.filter(function (i) { + return supported.includes(i); + }); + var browsers = new Browsers(this.all.browsers.data, filtered, this.all.options); + this.prefixerCache = new this.Prefixes(this.all.data, browsers, this.all.options); + return this.prefixerCache; + } + /** + * Parse string into declaration property and value + */ + ; + + _proto.parse = function parse(str) { + var parts = str.split(':'); + var prop = parts[0]; + var value = parts[1]; + if (!value) value = ''; + return [prop.trim(), value.trim()]; + } + /** + * Create virtual rule to process it by prefixer + */ + ; + + _proto.virtual = function virtual(str) { + var _this$parse = this.parse(str), + prop = _this$parse[0], + value = _this$parse[1]; + + var rule = postcss.parse('a{}').first; + rule.append({ + prop: prop, + value: value, + raws: { + before: '' + } + }); + return rule; + } + /** + * Return array of Declaration with all necessary prefixes + */ + ; + + _proto.prefixed = function prefixed(str) { + var rule = this.virtual(str); + + if (this.disabled(rule.first)) { + return rule.nodes; + } + + var result = { + warn: function warn() { + return null; + } + }; + var prefixer = this.prefixer().add[rule.first.prop]; + prefixer && prefixer.process && prefixer.process(rule.first, result); + + for (var _iterator = _createForOfIteratorHelperLoose(rule.nodes), _step; !(_step = _iterator()).done;) { + var decl = _step.value; + + for (var _iterator2 = _createForOfIteratorHelperLoose(this.prefixer().values('add', rule.first.prop)), _step2; !(_step2 = _iterator2()).done;) { + var value = _step2.value; + value.process(decl); + } + + Value.save(this.all, decl); + } + + return rule.nodes; + } + /** + * Return true if brackets node is "not" word + */ + ; + + _proto.isNot = function isNot(node) { + return typeof node === 'string' && /not\s*/i.test(node); + } + /** + * Return true if brackets node is "or" word + */ + ; + + _proto.isOr = function isOr(node) { + return typeof node === 'string' && /\s*or\s*/i.test(node); + } + /** + * Return true if brackets node is (prop: value) + */ + ; + + _proto.isProp = function isProp(node) { + return typeof node === 'object' && node.length === 1 && typeof node[0] === 'string'; + } + /** + * Return true if prefixed property has no unprefixed + */ + ; + + _proto.isHack = function isHack(all, unprefixed) { + var check = new RegExp("(\\(|\\s)" + utils.escapeRegexp(unprefixed) + ":"); + return !check.test(all); + } + /** + * Return true if we need to remove node + */ + ; + + _proto.toRemove = function toRemove(str, all) { + var _this$parse2 = this.parse(str), + prop = _this$parse2[0], + value = _this$parse2[1]; + + var unprefixed = this.all.unprefixed(prop); + var cleaner = this.all.cleaner(); + + if (cleaner.remove[prop] && cleaner.remove[prop].remove && !this.isHack(all, unprefixed)) { + return true; + } + + for (var _iterator3 = _createForOfIteratorHelperLoose(cleaner.values('remove', unprefixed)), _step3; !(_step3 = _iterator3()).done;) { + var checker = _step3.value; + + if (checker.check(value)) { + return true; + } + } + + return false; + } + /** + * Remove all unnecessary prefixes + */ + ; + + _proto.remove = function remove(nodes, all) { + var i = 0; + + while (i < nodes.length) { + if (!this.isNot(nodes[i - 1]) && this.isProp(nodes[i]) && this.isOr(nodes[i + 1])) { + if (this.toRemove(nodes[i][0], all)) { + nodes.splice(i, 2); + continue; + } + + i += 2; + continue; + } + + if (typeof nodes[i] === 'object') { + nodes[i] = this.remove(nodes[i], all); + } + + i += 1; + } + + return nodes; + } + /** + * Clean brackets with one child + */ + ; + + _proto.cleanBrackets = function cleanBrackets(nodes) { + var _this = this; + + return nodes.map(function (i) { + if (typeof i !== 'object') { + return i; + } + + if (i.length === 1 && typeof i[0] === 'object') { + return _this.cleanBrackets(i[0]); + } + + return _this.cleanBrackets(i); + }); + } + /** + * Add " or " between properties and convert it to brackets format + */ + ; + + _proto.convert = function convert(progress) { + var result = ['']; + + for (var _iterator4 = _createForOfIteratorHelperLoose(progress), _step4; !(_step4 = _iterator4()).done;) { + var i = _step4.value; + result.push([i.prop + ": " + i.value]); + result.push(' or '); + } + + result[result.length - 1] = ''; + return result; + } + /** + * Compress value functions into a string nodes + */ + ; + + _proto.normalize = function normalize(nodes) { + var _this2 = this; + + if (typeof nodes !== 'object') { + return nodes; + } + + nodes = nodes.filter(function (i) { + return i !== ''; + }); + + if (typeof nodes[0] === 'string' && nodes[0].includes(':')) { + return [brackets.stringify(nodes)]; + } + + return nodes.map(function (i) { + return _this2.normalize(i); + }); + } + /** + * Add prefixes + */ + ; + + _proto.add = function add(nodes, all) { + var _this3 = this; + + return nodes.map(function (i) { + if (_this3.isProp(i)) { + var prefixed = _this3.prefixed(i[0]); + + if (prefixed.length > 1) { + return _this3.convert(prefixed); + } + + return i; + } + + if (typeof i === 'object') { + return _this3.add(i, all); + } + + return i; + }); + } + /** + * Add prefixed declaration + */ + ; + + _proto.process = function process(rule) { + var ast = brackets.parse(rule.params); + ast = this.normalize(ast); + ast = this.remove(ast, rule.params); + ast = this.add(ast, rule.params); + ast = this.cleanBrackets(ast); + rule.params = brackets.stringify(ast); + } + /** + * Check global options + */ + ; + + _proto.disabled = function disabled(node) { + if (!this.all.options.grid) { + if (node.prop === 'display' && node.value.includes('grid')) { + return true; + } + + if (node.prop.includes('grid') || node.prop === 'justify-items') { + return true; + } + } + + if (this.all.options.flexbox === false) { + if (node.prop === 'display' && node.value.includes('flex')) { + return true; + } + + var other = ['order', 'justify-content', 'align-items', 'align-content']; + + if (node.prop.includes('flex') || other.includes(node.prop)) { + return true; + } + } + + return false; + }; + + return Supports; +}(); + +module.exports = Supports; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/transition.js b/website/www/node_modules/autoprefixer/lib/transition.js new file mode 100644 index 000000000000..8a9e0a564c38 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/transition.js @@ -0,0 +1,411 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var parser = require('postcss-value-parser'); + +var vendor = require('postcss').vendor; + +var list = require('postcss').list; + +var Browsers = require('./browsers'); + +var Transition = /*#__PURE__*/function () { + function Transition(prefixes) { + _defineProperty(this, "props", ['transition', 'transition-property']); + + this.prefixes = prefixes; + } + /** + * Process transition and add prefixes for all necessary properties + */ + + + var _proto = Transition.prototype; + + _proto.add = function add(decl, result) { + var _this = this; + + var prefix, prop; + var add = this.prefixes.add[decl.prop]; + var vendorPrefixes = this.ruleVendorPrefixes(decl); + var declPrefixes = vendorPrefixes || add && add.prefixes || []; + var params = this.parse(decl.value); + var names = params.map(function (i) { + return _this.findProp(i); + }); + var added = []; + + if (names.some(function (i) { + return i[0] === '-'; + })) { + return; + } + + for (var _iterator = _createForOfIteratorHelperLoose(params), _step; !(_step = _iterator()).done;) { + var param = _step.value; + prop = this.findProp(param); + if (prop[0] === '-') continue; + var prefixer = this.prefixes.add[prop]; + if (!prefixer || !prefixer.prefixes) continue; + + for (var _iterator3 = _createForOfIteratorHelperLoose(prefixer.prefixes), _step3; !(_step3 = _iterator3()).done;) { + prefix = _step3.value; + + if (vendorPrefixes && !vendorPrefixes.some(function (p) { + return prefix.includes(p); + })) { + continue; + } + + var prefixed = this.prefixes.prefixed(prop, prefix); + + if (prefixed !== '-ms-transform' && !names.includes(prefixed)) { + if (!this.disabled(prop, prefix)) { + added.push(this.clone(prop, prefixed, param)); + } + } + } + } + + params = params.concat(added); + var value = this.stringify(params); + var webkitClean = this.stringify(this.cleanFromUnprefixed(params, '-webkit-')); + + if (declPrefixes.includes('-webkit-')) { + this.cloneBefore(decl, "-webkit-" + decl.prop, webkitClean); + } + + this.cloneBefore(decl, decl.prop, webkitClean); + + if (declPrefixes.includes('-o-')) { + var operaClean = this.stringify(this.cleanFromUnprefixed(params, '-o-')); + this.cloneBefore(decl, "-o-" + decl.prop, operaClean); + } + + for (var _iterator2 = _createForOfIteratorHelperLoose(declPrefixes), _step2; !(_step2 = _iterator2()).done;) { + prefix = _step2.value; + + if (prefix !== '-webkit-' && prefix !== '-o-') { + var prefixValue = this.stringify(this.cleanOtherPrefixes(params, prefix)); + this.cloneBefore(decl, prefix + decl.prop, prefixValue); + } + } + + if (value !== decl.value && !this.already(decl, decl.prop, value)) { + this.checkForWarning(result, decl); + decl.cloneBefore(); + decl.value = value; + } + } + /** + * Find property name + */ + ; + + _proto.findProp = function findProp(param) { + var prop = param[0].value; + + if (/^\d/.test(prop)) { + for (var _iterator4 = _createForOfIteratorHelperLoose(param.entries()), _step4; !(_step4 = _iterator4()).done;) { + var _step4$value = _step4.value, + i = _step4$value[0], + token = _step4$value[1]; + + if (i !== 0 && token.type === 'word') { + return token.value; + } + } + } + + return prop; + } + /** + * Does we already have this declaration + */ + ; + + _proto.already = function already(decl, prop, value) { + return decl.parent.some(function (i) { + return i.prop === prop && i.value === value; + }); + } + /** + * Add declaration if it is not exist + */ + ; + + _proto.cloneBefore = function cloneBefore(decl, prop, value) { + if (!this.already(decl, prop, value)) { + decl.cloneBefore({ + prop: prop, + value: value + }); + } + } + /** + * Show transition-property warning + */ + ; + + _proto.checkForWarning = function checkForWarning(result, decl) { + if (decl.prop !== 'transition-property') { + return; + } + + decl.parent.each(function (i) { + if (i.type !== 'decl') { + return undefined; + } + + if (i.prop.indexOf('transition-') !== 0) { + return undefined; + } + + if (i.prop === 'transition-property') { + return undefined; + } + + if (list.comma(i.value).length > 1) { + decl.warn(result, 'Replace transition-property to transition, ' + 'because Autoprefixer could not support ' + 'any cases of transition-property ' + 'and other transition-*'); + } + + return false; + }); + } + /** + * Process transition and remove all unnecessary properties + */ + ; + + _proto.remove = function remove(decl) { + var _this2 = this; + + var params = this.parse(decl.value); + params = params.filter(function (i) { + var prop = _this2.prefixes.remove[_this2.findProp(i)]; + + return !prop || !prop.remove; + }); + var value = this.stringify(params); + + if (decl.value === value) { + return; + } + + if (params.length === 0) { + decl.remove(); + return; + } + + var _double = decl.parent.some(function (i) { + return i.prop === decl.prop && i.value === value; + }); + + var smaller = decl.parent.some(function (i) { + return i !== decl && i.prop === decl.prop && i.value.length > value.length; + }); + + if (_double || smaller) { + decl.remove(); + return; + } + + decl.value = value; + } + /** + * Parse properties list to array + */ + ; + + _proto.parse = function parse(value) { + var ast = parser(value); + var result = []; + var param = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose(ast.nodes), _step5; !(_step5 = _iterator5()).done;) { + var node = _step5.value; + param.push(node); + + if (node.type === 'div' && node.value === ',') { + result.push(param); + param = []; + } + } + + result.push(param); + return result.filter(function (i) { + return i.length > 0; + }); + } + /** + * Return properties string from array + */ + ; + + _proto.stringify = function stringify(params) { + if (params.length === 0) { + return ''; + } + + var nodes = []; + + for (var _iterator6 = _createForOfIteratorHelperLoose(params), _step6; !(_step6 = _iterator6()).done;) { + var param = _step6.value; + + if (param[param.length - 1].type !== 'div') { + param.push(this.div(params)); + } + + nodes = nodes.concat(param); + } + + if (nodes[0].type === 'div') { + nodes = nodes.slice(1); + } + + if (nodes[nodes.length - 1].type === 'div') { + nodes = nodes.slice(0, +-2 + 1 || undefined); + } + + return parser.stringify({ + nodes: nodes + }); + } + /** + * Return new param array with different name + */ + ; + + _proto.clone = function clone(origin, name, param) { + var result = []; + var changed = false; + + for (var _iterator7 = _createForOfIteratorHelperLoose(param), _step7; !(_step7 = _iterator7()).done;) { + var i = _step7.value; + + if (!changed && i.type === 'word' && i.value === origin) { + result.push({ + type: 'word', + value: name + }); + changed = true; + } else { + result.push(i); + } + } + + return result; + } + /** + * Find or create separator + */ + ; + + _proto.div = function div(params) { + for (var _iterator8 = _createForOfIteratorHelperLoose(params), _step8; !(_step8 = _iterator8()).done;) { + var param = _step8.value; + + for (var _iterator9 = _createForOfIteratorHelperLoose(param), _step9; !(_step9 = _iterator9()).done;) { + var node = _step9.value; + + if (node.type === 'div' && node.value === ',') { + return node; + } + } + } + + return { + type: 'div', + value: ',', + after: ' ' + }; + }; + + _proto.cleanOtherPrefixes = function cleanOtherPrefixes(params, prefix) { + var _this3 = this; + + return params.filter(function (param) { + var current = vendor.prefix(_this3.findProp(param)); + return current === '' || current === prefix; + }); + } + /** + * Remove all non-webkit prefixes and unprefixed params if we have prefixed + */ + ; + + _proto.cleanFromUnprefixed = function cleanFromUnprefixed(params, prefix) { + var _this4 = this; + + var remove = params.map(function (i) { + return _this4.findProp(i); + }).filter(function (i) { + return i.slice(0, prefix.length) === prefix; + }).map(function (i) { + return _this4.prefixes.unprefixed(i); + }); + var result = []; + + for (var _iterator10 = _createForOfIteratorHelperLoose(params), _step10; !(_step10 = _iterator10()).done;) { + var param = _step10.value; + var prop = this.findProp(param); + var p = vendor.prefix(prop); + + if (!remove.includes(prop) && (p === prefix || p === '')) { + result.push(param); + } + } + + return result; + } + /** + * Check property for disabled by option + */ + ; + + _proto.disabled = function disabled(prop, prefix) { + var other = ['order', 'justify-content', 'align-self', 'align-content']; + + if (prop.includes('flex') || other.includes(prop)) { + if (this.prefixes.options.flexbox === false) { + return true; + } + + if (this.prefixes.options.flexbox === 'no-2009') { + return prefix.includes('2009'); + } + } + + return undefined; + } + /** + * Check if transition prop is inside vendor specific rule + */ + ; + + _proto.ruleVendorPrefixes = function ruleVendorPrefixes(decl) { + var parent = decl.parent; + + if (parent.type !== 'rule') { + return false; + } else if (!parent.selector.includes(':-')) { + return false; + } + + var selectors = Browsers.prefixes().filter(function (s) { + return parent.selector.includes(':' + s); + }); + return selectors.length > 0 ? selectors : false; + }; + + return Transition; +}(); + +module.exports = Transition; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/utils.js b/website/www/node_modules/autoprefixer/lib/utils.js new file mode 100644 index 000000000000..831e15d1911a --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/utils.js @@ -0,0 +1,103 @@ +"use strict"; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var list = require('postcss').list; + +module.exports = { + /** + * Throw special error, to tell beniary, + * that this error is from Autoprefixer. + */ + error: function error(text) { + var err = new Error(text); + err.autoprefixer = true; + throw err; + }, + + /** + * Return array, that doesn’t contain duplicates. + */ + uniq: function uniq(array) { + var filtered = []; + + for (var _iterator = _createForOfIteratorHelperLoose(array), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (!filtered.includes(i)) { + filtered.push(i); + } + } + + return filtered; + }, + + /** + * Return "-webkit-" on "-webkit- old" + */ + removeNote: function removeNote(string) { + if (!string.includes(' ')) { + return string; + } + + return string.split(' ')[0]; + }, + + /** + * Escape RegExp symbols + */ + escapeRegexp: function escapeRegexp(string) { + return string.replace(/[$()*+-.?[\\\]^{|}]/g, '\\$&'); + }, + + /** + * Return regexp to check, that CSS string contain word + */ + regexp: function regexp(word, escape) { + if (escape === void 0) { + escape = true; + } + + if (escape) { + word = this.escapeRegexp(word); + } + + return new RegExp("(^|[\\s,(])(" + word + "($|[\\s(,]))", 'gi'); + }, + + /** + * Change comma list + */ + editList: function editList(value, callback) { + var origin = list.comma(value); + var changed = callback(origin, []); + + if (origin === changed) { + return value; + } + + var join = value.match(/,\s*/); + join = join ? join[0] : ', '; + return changed.join(join); + }, + + /** + * Split the selector into parts. + * It returns 3 level deep array because selectors can be comma + * separated (1), space separated (2), and combined (3) + * @param {String} selector selector string + * @return {Array>} 3 level deep array of split selector + * @see utils.test.js for examples + */ + splitSelector: function splitSelector(selector) { + return list.comma(selector).map(function (i) { + return list.space(i).map(function (k) { + return k.split(/(?=\.|#)/g); + }); + }); + } +}; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/lib/value.js b/website/www/node_modules/autoprefixer/lib/value.js new file mode 100644 index 000000000000..c3cbc3e67165 --- /dev/null +++ b/website/www/node_modules/autoprefixer/lib/value.js @@ -0,0 +1,176 @@ +"use strict"; + +function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } + +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } + +var vendor = require('postcss').vendor; + +var Prefixer = require('./prefixer'); + +var OldValue = require('./old-value'); + +var utils = require('./utils'); + +var Value = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Value, _Prefixer); + + var _super = _createSuper(Value); + + function Value() { + return _Prefixer.apply(this, arguments) || this; + } + + /** + * Clone decl for each prefixed values + */ + Value.save = function save(prefixes, decl) { + var _this = this; + + var prop = decl.prop; + var result = []; + + var _loop = function _loop(prefix) { + var value = decl._autoprefixerValues[prefix]; + + if (value === decl.value) { + return "continue"; + } + + var item = void 0; + var propPrefix = vendor.prefix(prop); + + if (propPrefix === '-pie-') { + return "continue"; + } + + if (propPrefix === prefix) { + item = decl.value = value; + result.push(item); + return "continue"; + } + + var prefixed = prefixes.prefixed(prop, prefix); + var rule = decl.parent; + + if (!rule.every(function (i) { + return i.prop !== prefixed; + })) { + result.push(item); + return "continue"; + } + + var trimmed = value.replace(/\s+/, ' '); + var already = rule.some(function (i) { + return i.prop === decl.prop && i.value.replace(/\s+/, ' ') === trimmed; + }); + + if (already) { + result.push(item); + return "continue"; + } + + var cloned = _this.clone(decl, { + value: value + }); + + item = decl.parent.insertBefore(decl, cloned); + result.push(item); + }; + + for (var prefix in decl._autoprefixerValues) { + var _ret = _loop(prefix); + + if (_ret === "continue") continue; + } + + return result; + } + /** + * Is declaration need to be prefixed + */ + ; + + var _proto = Value.prototype; + + _proto.check = function check(decl) { + var value = decl.value; + + if (!value.includes(this.name)) { + return false; + } + + return !!value.match(this.regexp()); + } + /** + * Lazy regexp loading + */ + ; + + _proto.regexp = function regexp() { + return this.regexpCache || (this.regexpCache = utils.regexp(this.name)); + } + /** + * Add prefix to values in string + */ + ; + + _proto.replace = function replace(string, prefix) { + return string.replace(this.regexp(), "$1" + prefix + "$2"); + } + /** + * Get value with comments if it was not changed + */ + ; + + _proto.value = function value(decl) { + if (decl.raws.value && decl.raws.value.value === decl.value) { + return decl.raws.value.raw; + } else { + return decl.value; + } + } + /** + * Save values with next prefixed token + */ + ; + + _proto.add = function add(decl, prefix) { + if (!decl._autoprefixerValues) { + decl._autoprefixerValues = {}; + } + + var value = decl._autoprefixerValues[prefix] || this.value(decl); + var before; + + do { + before = value; + value = this.replace(value, prefix); + if (value === false) return; + } while (value !== before); + + decl._autoprefixerValues[prefix] = value; + } + /** + * Return function to fast find prefixed value + */ + ; + + _proto.old = function old(prefix) { + return new OldValue(this.name, prefix + this.name); + }; + + return Value; +}(Prefixer); + +module.exports = Value; \ No newline at end of file diff --git a/website/www/node_modules/autoprefixer/node_modules/.bin/browserslist b/website/www/node_modules/autoprefixer/node_modules/.bin/browserslist new file mode 100755 index 000000000000..526885fdb145 --- /dev/null +++ b/website/www/node_modules/autoprefixer/node_modules/.bin/browserslist @@ -0,0 +1,145 @@ +#!/usr/bin/env node + +var fs = require('fs') + +var browserslist = require('./') +var updateDb = require('./update-db') +var pkg = require('./package.json') + +var args = process.argv.slice(2) + +var USAGE = 'Usage:\n' + + ' npx browserslist\n' + + ' npx browserslist "QUERIES"\n' + + ' npx browserslist --json "QUERIES"\n' + + ' npx browserslist --config="path/to/browserlist/file"\n' + + ' npx browserslist --coverage "QUERIES"\n' + + ' npx browserslist --coverage=US "QUERIES"\n' + + ' npx browserslist --coverage=US,RU,global "QUERIES"\n' + + ' npx browserslist --env="environment name defined in config"\n' + + ' npx browserslist --stats="path/to/browserlist/stats/file"\n' + + ' npx browserslist --mobile-to-desktop\n' + + ' npx browserslist --update-db' + +function isArg (arg) { + return args.some(function (str) { + return str === arg || str.indexOf(arg + '=') === 0 + }) +} + +function error (msg) { + process.stderr.write('browserslist: ' + msg + '\n') + process.exit(1) +} + +if (isArg('--help') || isArg('-h')) { + process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n') +} else if (isArg('--version') || isArg('-v')) { + process.stdout.write('browserslist ' + pkg.version + '\n') +} else if (isArg('--update-db')) { + updateDb(function (str) { + process.stdout.write(str) + }) +} else { + var mode = 'browsers' + var opts = { } + var queries + var areas + + for (var i = 0; i < args.length; i++) { + if (args[i][0] !== '-') { + queries = args[i].replace(/^["']|["']$/g, '') + continue + } + + var arg = args[i].split('=') + var name = arg[0] + var value = arg[1] + + if (value) value = value.replace(/^["']|["']$/g, '') + + if (name === '--config' || name === '-b') { + opts.config = value + } else if (name === '--env' || name === '-e') { + opts.env = value + } else if (name === '--stats' || name === '-s') { + opts.stats = value + } else if (name === '--coverage' || name === '-c') { + if (mode !== 'json') mode = 'coverage' + if (value) { + areas = value.split(',') + } else { + areas = ['global'] + } + } else if (name === '--json') { + mode = 'json' + } else if (name === '--mobile-to-desktop') { + opts.mobileToDesktop = true + } else { + error('Unknown arguments ' + args[i] + '.\n\n' + USAGE) + } + } + + var browsers + try { + browsers = browserslist(queries, opts) + } catch (e) { + if (e.name === 'BrowserslistError') { + error(e.message) + } else { + throw e + } + } + + var coverage + if (mode === 'browsers') { + browsers.forEach(function (browser) { + process.stdout.write(browser + '\n') + }) + } else if (areas) { + coverage = areas.map(function (area) { + var stats + if (area !== 'global') { + stats = area + } else if (opts.stats) { + stats = JSON.parse(fs.readFileSync(opts.stats)) + } + var result = browserslist.coverage(browsers, stats) + var round = Math.round(result * 100) / 100.0 + + return [area, round] + }) + + if (mode === 'coverage') { + var prefix = 'These browsers account for ' + process.stdout.write(prefix) + coverage.forEach(function (data, index) { + var area = data[0] + var round = data[1] + var end = 'globally' + if (area && area !== 'global') { + end = 'in the ' + area.toUpperCase() + } else if (opts.stats) { + end = 'in custom statistics' + } + + if (index !== 0) { + process.stdout.write(prefix.replace(/./g, ' ')) + } + + process.stdout.write(round + '% of all users ' + end + '\n') + }) + } + } + + if (mode === 'json') { + var data = { browsers: browsers } + if (coverage) { + data.coverage = coverage.reduce(function (object, j) { + object[j[0]] = j[1] + return object + }, { }) + } + process.stdout.write(JSON.stringify(data, null, ' ') + '\n') + } +} diff --git a/website/www/node_modules/autoprefixer/package.json b/website/www/node_modules/autoprefixer/package.json new file mode 100644 index 000000000000..4761bc64b6a2 --- /dev/null +++ b/website/www/node_modules/autoprefixer/package.json @@ -0,0 +1,31 @@ +{ + "name": "autoprefixer", + "version": "9.7.6", + "description": "Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website", + "keywords": ["autoprefixer", "css", "prefix", "postcss", "postcss-plugin"], + "bin": "./bin/autoprefixer", + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + "author": "Andrey Sitnik ", + "license": "MIT", + "repository": "postcss/autoprefixer", + "engines": { + "node": ">=6.0.0" + }, + "dependencies": { + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "eslintIgnore": ["build/"], + "browser": { + "chalk": false + }, + "main": "lib/autoprefixer" +} \ No newline at end of file diff --git a/website/www/node_modules/binary-extensions/binary-extensions.json b/website/www/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 000000000000..725e53207cfc --- /dev/null +++ b/website/www/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,252 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "oga", + "ogg", + "ogv", + "otf", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/website/www/node_modules/binary-extensions/binary-extensions.json.d.ts b/website/www/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 000000000000..94a248c2bcff --- /dev/null +++ b/website/www/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/website/www/node_modules/binary-extensions/index.d.ts b/website/www/node_modules/binary-extensions/index.d.ts new file mode 100644 index 000000000000..f469ac5fb0fe --- /dev/null +++ b/website/www/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/website/www/node_modules/binary-extensions/index.js b/website/www/node_modules/binary-extensions/index.js new file mode 100644 index 000000000000..d46e46886711 --- /dev/null +++ b/website/www/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/website/www/node_modules/binary-extensions/license b/website/www/node_modules/binary-extensions/license new file mode 100644 index 000000000000..401b1c731bcd --- /dev/null +++ b/website/www/node_modules/binary-extensions/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/binary-extensions/package.json b/website/www/node_modules/binary-extensions/package.json new file mode 100644 index 000000000000..b19edd320e73 --- /dev/null +++ b/website/www/node_modules/binary-extensions/package.json @@ -0,0 +1,38 @@ +{ + "name": "binary-extensions", + "version": "2.0.0", + "description": "List of binary file extensions", + "license": "MIT", + "repository": "sindresorhus/binary-extensions", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/website/www/node_modules/binary-extensions/readme.md b/website/www/node_modules/binary-extensions/readme.md new file mode 100644 index 000000000000..8d711fa8d7a0 --- /dev/null +++ b/website/www/node_modules/binary-extensions/readme.md @@ -0,0 +1,33 @@ +# binary-extensions [![Build Status](https://travis-ci.org/sindresorhus/binary-extensions.svg?branch=master)](https://travis-ci.org/sindresorhus/binary-extensions) + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + + +## Install + +``` +$ npm install binary-extensions +``` + + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com) diff --git a/website/www/node_modules/braces/CHANGELOG.md b/website/www/node_modules/braces/CHANGELOG.md new file mode 100644 index 000000000000..36f798b004e0 --- /dev/null +++ b/website/www/node_modules/braces/CHANGELOG.md @@ -0,0 +1,184 @@ +# Release history + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +
    + Guiding Principles + +- Changelogs are for humans, not machines. +- There should be an entry for every single version. +- The same types of changes should be grouped. +- Versions and sections should be linkable. +- The latest version comes first. +- The release date of each versions is displayed. +- Mention whether you follow Semantic Versioning. + +
    + +
    + Types of changes + +Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +
    + +## [3.0.0] - 2018-04-08 + +v3.0 is a complete refactor, resulting in a faster, smaller codebase, with fewer deps, and a more accurate parser and compiler. + +**Breaking Changes** + +- The undocumented `.makeRe` method was removed + +**Non-breaking changes** + +- Caching was removed + +## [2.3.2] - 2018-04-08 + +- start refactoring +- cover sets +- better range handling + +## [2.3.1] - 2018-02-17 + +- Remove unnecessary escape in Regex. (#14) + +## [2.3.0] - 2017-10-19 + +- minor code reorganization +- optimize regex +- expose `maxLength` option + +## [2.2.1] - 2017-05-30 + +- don't condense when braces contain extglobs + +## [2.2.0] - 2017-05-28 + +- ensure word boundaries are preserved +- fixes edge case where extglob characters precede a brace pattern + +## [2.1.1] - 2017-04-27 + +- use snapdragon-node +- handle edge case +- optimizations, lint + +## [2.0.4] - 2017-04-11 + +- pass opts to compiler +- minor optimization in create method +- re-write parser handlers to remove negation regex + +## [2.0.3] - 2016-12-10 + +- use split-string +- clear queue at the end +- adds sequences example +- add unit tests + +## [2.0.2] - 2016-10-21 + +- fix comma handling in nested extglobs + +## [2.0.1] - 2016-10-20 + +- add comments +- more tests, ensure quotes are stripped + +## [2.0.0] - 2016-10-19 + +- don't expand braces inside character classes +- add quantifier pattern + +## [1.8.5] - 2016-05-21 + +- Refactor (#10) + +## [1.8.4] - 2016-04-20 + +- fixes https://github.com/jonschlinkert/micromatch/issues/66 + +## [1.8.0] - 2015-03-18 + +- adds exponent examples, tests +- fixes the first example in https://github.com/jonschlinkert/micromatch/issues/38 + +## [1.6.0] - 2015-01-30 + +- optimizations, `bash` mode: +- improve path escaping + +## [1.5.0] - 2015-01-28 + +- Merge pull request #5 from eush77/lib-files + +## [1.4.0] - 2015-01-24 + +- add extglob tests +- externalize exponent function +- better whitespace handling + +## [1.3.0] - 2015-01-24 + +- make regex patterns explicity + +## [1.1.0] - 2015-01-11 + +- don't create a match group with `makeRe` + +## [1.0.0] - 2014-12-23 + +- Merge commit '97b05f5544f8348736a8efaecf5c32bbe3e2ad6e' +- support empty brace syntax +- better bash coverage +- better support for regex strings + +## [0.1.4] - 2014-11-14 + +- improve recognition of bad args, recognize mismatched argument types +- support escaping +- remove pathname-expansion +- support whitespace in patterns + +## [0.1.0] + +- first commit + +[2.3.2]: https://github.com/micromatch/braces/compare/2.3.1...2.3.2 +[2.3.1]: https://github.com/micromatch/braces/compare/2.3.0...2.3.1 +[2.3.0]: https://github.com/micromatch/braces/compare/2.2.1...2.3.0 +[2.2.1]: https://github.com/micromatch/braces/compare/2.2.0...2.2.1 +[2.2.0]: https://github.com/micromatch/braces/compare/2.1.1...2.2.0 +[2.1.1]: https://github.com/micromatch/braces/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/micromatch/braces/compare/2.0.4...2.1.0 +[2.0.4]: https://github.com/micromatch/braces/compare/2.0.3...2.0.4 +[2.0.3]: https://github.com/micromatch/braces/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/micromatch/braces/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/micromatch/braces/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/micromatch/braces/compare/1.8.5...2.0.0 +[1.8.5]: https://github.com/micromatch/braces/compare/1.8.4...1.8.5 +[1.8.4]: https://github.com/micromatch/braces/compare/1.8.0...1.8.4 +[1.8.0]: https://github.com/micromatch/braces/compare/1.6.0...1.8.0 +[1.6.0]: https://github.com/micromatch/braces/compare/1.5.0...1.6.0 +[1.5.0]: https://github.com/micromatch/braces/compare/1.4.0...1.5.0 +[1.4.0]: https://github.com/micromatch/braces/compare/1.3.0...1.4.0 +[1.3.0]: https://github.com/micromatch/braces/compare/1.2.0...1.3.0 +[1.2.0]: https://github.com/micromatch/braces/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/micromatch/braces/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/micromatch/braces/compare/0.1.4...1.0.0 +[0.1.4]: https://github.com/micromatch/braces/compare/0.1.0...0.1.4 + +[Unreleased]: https://github.com/micromatch/braces/compare/0.1.0...HEAD +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog \ No newline at end of file diff --git a/website/www/node_modules/braces/LICENSE b/website/www/node_modules/braces/LICENSE new file mode 100644 index 000000000000..d32ab4426a5f --- /dev/null +++ b/website/www/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/website/www/node_modules/braces/README.md b/website/www/node_modules/braces/README.md new file mode 100644 index 000000000000..cba2f600d2e6 --- /dev/null +++ b/website/www/node_modules/braces/README.md @@ -0,0 +1,593 @@ +# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## v3.0.0 Released!! + +See the [changelog](CHANGELOG.md) for details. + +## Why use braces? + +Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. + +* **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +* **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +* **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up. +* **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). +* **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). +* [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +* [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` +* [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` +* [Supports escaping](#escaping) - To prevent evaluation of special characters. + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +const braces = require('braces'); +// braces(patterns[, options]); + +console.log(braces(['{01..05}', '{a..e}'])); +//=> ['(0[1-5])', '([a-e])'] + +console.log(braces(['{01..05}', '{a..e}'], { expand: true })); +//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] +``` + +### Brace Expansion vs. Compilation + +By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. + +**Compiled** + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); +//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] +``` + +**Expanded** + +Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): + +```js +console.log(braces('a/{x,y,z}/b', { expand: true })); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] + +console.log(braces.expand('{01..10}')); +//=> ['01','02','03','04','05','06','07','08','09','10'] +``` + +### Lists + +Expand lists (like Bash "sets"): + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Expand ranges of characters (like Bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] +console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] +console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] + +// supports zero-padded ranges +console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b'] +console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b'] +``` + +See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. + +### Steppped ranges + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `65,536` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', { expand: true })); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Remove duplicates from the returned array. + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `1000` + +**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. + +You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +**Example: Transforming non-numeric values** + +```js +const alpha = braces.expand('x/{a..e}/y', { + transform(value, index) { + // When non-numeric values are passed, "value" is a character code. + return 'foo/' + String.fromCharCode(value) + '-' + index; + } +}); +console.log(alpha); +//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] +``` + +**Example: Transforming numeric values** + +```js +const numeric = braces.expand('{1..5}', { + transform(value) { + // when numeric values are passed, "value" is a number + return 'foo/' + value * 2; + } +}); +console.log(numeric); +//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +const braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true})); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true, expand: true})); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.unescape + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +* [brace expansion](#brace-expansion) is for generating new lists +* [brace matching](#brace-matching) is for filtering existing lists + +
    +More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +* brace expansion can eat up a huge amount of processing resources +* as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +* users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +* [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +* [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +* [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
    + +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch][]** | +| --- | --- | --- | +| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs)| N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch][]** | +| --- | --- | --- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +Braces is more accurate, without sacrificing performance. + +```bash +# range (expanded) + braces x 29,040 ops/sec ±3.69% (91 runs sampled)) + minimatch x 4,735 ops/sec ±1.28% (90 runs sampled) + +# range (optimized for regex) + braces x 382,878 ops/sec ±0.56% (94 runs sampled) + minimatch x 1,040 ops/sec ±0.44% (93 runs sampled) + +# nested ranges (expanded) + braces x 19,744 ops/sec ±2.27% (92 runs sampled)) + minimatch x 4,579 ops/sec ±0.50% (93 runs sampled) + +# nested ranges (optimized for regex) + braces x 246,019 ops/sec ±2.02% (93 runs sampled) + minimatch x 1,028 ops/sec ±0.39% (94 runs sampled) + +# set (expanded) + braces x 138,641 ops/sec ±0.53% (95 runs sampled) + minimatch x 219,582 ops/sec ±0.98% (94 runs sampled) + +# set (optimized for regex) + braces x 388,408 ops/sec ±0.41% (95 runs sampled) + minimatch x 44,724 ops/sec ±0.91% (89 runs sampled) + +# nested sets (expanded) + braces x 84,966 ops/sec ±0.48% (94 runs sampled) + minimatch x 140,720 ops/sec ±0.37% (95 runs sampled) + +# nested sets (optimized for regex) + braces x 263,340 ops/sec ±2.06% (92 runs sampled) + minimatch x 28,714 ops/sec ±0.40% (90 runs sampled) +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 197 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/website/www/node_modules/braces/index.js b/website/www/node_modules/braces/index.js new file mode 100644 index 000000000000..0eee0f567049 --- /dev/null +++ b/website/www/node_modules/braces/index.js @@ -0,0 +1,170 @@ +'use strict'; + +const stringify = require('./lib/stringify'); +const compile = require('./lib/compile'); +const expand = require('./lib/expand'); +const parse = require('./lib/parse'); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. + * + * ```js + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; diff --git a/website/www/node_modules/braces/lib/compile.js b/website/www/node_modules/braces/lib/compile.js new file mode 100644 index 000000000000..3e984a4bbc29 --- /dev/null +++ b/website/www/node_modules/braces/lib/compile.js @@ -0,0 +1,57 @@ +'use strict'; + +const fill = require('fill-range'); +const utils = require('./utils'); + +const compile = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; + + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } + + if (node.type === 'open') { + return invalid ? (prefix + node.value) : '('; + } + + if (node.type === 'close') { + return invalid ? (prefix + node.value) : ')'; + } + + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); + } + + if (node.value) { + return node.value; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, { ...options, wrap: false, toRegex: true }); + + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); + } + } + return output; + }; + + return walk(ast); +}; + +module.exports = compile; diff --git a/website/www/node_modules/braces/lib/constants.js b/website/www/node_modules/braces/lib/constants.js new file mode 100644 index 000000000000..a93794366522 --- /dev/null +++ b/website/www/node_modules/braces/lib/constants.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = { + MAX_LENGTH: 1024 * 64, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; diff --git a/website/www/node_modules/braces/lib/expand.js b/website/www/node_modules/braces/lib/expand.js new file mode 100644 index 000000000000..376c748af238 --- /dev/null +++ b/website/www/node_modules/braces/lib/expand.js @@ -0,0 +1,113 @@ +'use strict'; + +const fill = require('fill-range'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +const append = (queue = '', stash = '', enclose = false) => { + let result = []; + + queue = [].concat(queue); + stash = [].concat(stash); + + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } + + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + } + } + } + return utils.flatten(result); +}; + +const expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; + + let walk = (node, parent = {}) => { + node.queue = []; + + let p = parent; + let q = parent.queue; + + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } + + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } + + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; + + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } + + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } + + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } + + if (child.nodes) { + walk(child, node); + } + } + + return queue; + }; + + return utils.flatten(walk(ast)); +}; + +module.exports = expand; diff --git a/website/www/node_modules/braces/lib/parse.js b/website/www/node_modules/braces/lib/parse.js new file mode 100644 index 000000000000..145ea2648069 --- /dev/null +++ b/website/www/node_modules/braces/lib/parse.js @@ -0,0 +1,333 @@ +'use strict'; + +const stringify = require('./stringify'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = require('./constants'); + +/** + * parse + */ + +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + let opts = options || {}; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + + let ast = { type: 'root', input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; + + /** + * Helpers + */ + + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } + + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; + } + + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + + push({ type: 'bos' }); + + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + + /** + * Invalid chars + */ + + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + + /** + * Escaped chars + */ + + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } + + /** + * Right square bracket (literal): ']' + */ + + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } + + /** + * Left square bracket: '[' + */ + + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + + let closed = true; + let next; + + while (index < length && (next = advance())) { + value += next; + + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + let brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + let type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; + } + + /** + * Text + */ + + push({ type: 'text', value }); + } + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + let parent = stack[stack.length - 1]; + let index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; diff --git a/website/www/node_modules/braces/lib/stringify.js b/website/www/node_modules/braces/lib/stringify.js new file mode 100644 index 000000000000..414b7bcc6b38 --- /dev/null +++ b/website/www/node_modules/braces/lib/stringify.js @@ -0,0 +1,32 @@ +'use strict'; + +const utils = require('./utils'); + +module.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; + } + + if (node.value) { + return node.value; + } + + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + diff --git a/website/www/node_modules/braces/lib/utils.js b/website/www/node_modules/braces/lib/utils.js new file mode 100644 index 000000000000..e3551a674916 --- /dev/null +++ b/website/www/node_modules/braces/lib/utils.js @@ -0,0 +1,112 @@ +'use strict'; + +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; + +/** + * Find a node of the given type + */ + +exports.find = (node, type) => node.nodes.find(node => node.type === type); + +/** + * Find a node of the given type + */ + +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; + +/** + * Escape the given node with '\\' before node.value + */ + +exports.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) return; + + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; + +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; +}; + +/** + * Reduce an array of text nodes. + */ + +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); + +/** + * Flatten an array + */ + +exports.flatten = (...args) => { + const result = []; + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; +}; diff --git a/website/www/node_modules/braces/package.json b/website/www/node_modules/braces/package.json new file mode 100644 index 000000000000..3f52e346f618 --- /dev/null +++ b/website/www/node_modules/braces/package.json @@ -0,0 +1,77 @@ +{ + "name": "braces", + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "version": "3.0.2", + "homepage": "https://github.com/micromatch/braces", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Elan Shanker (https://github.com/es128)", + "Eugene Sharygin (https://github.com/eush77)", + "hemanth.hm (http://h3manth.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/braces", + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "fill-range": "^7.0.1" + }, + "devDependencies": { + "ansi-colors": "^3.2.4", + "bash-path": "^2.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ] + } +} diff --git a/website/www/node_modules/browserslist/CHANGELOG.md b/website/www/node_modules/browserslist/CHANGELOG.md new file mode 100644 index 000000000000..1da840805bd9 --- /dev/null +++ b/website/www/node_modules/browserslist/CHANGELOG.md @@ -0,0 +1,459 @@ +# Change Log +This project adheres to [Semantic Versioning](http://semver.org/). + +## 4.12 +* Add environments to shared configs (by Yevgeny Petukhov). +* Fix docs (by Dmitry Statsenko and Thomas Pozzo di Borgo). + +## 4.11.1 +* FIx Node.js 6 support. + +## 4.11 +* Add `npx browserslist --mobile-to-desktop` (by James Ross). + +## 4.10 +* Add `npx browserslist --update-db` (by Ivan Solovev). + +## 4.9.1 +* Normalize incorrect Can I Use regional data (by Huáng Jùnliàng). + +## 4.9 +* Add `node X-Y` query support (by Yuping Zuo). + +## 4.8.7 +* Fix `last N major versions` (by Valeriy Trubachev). + +## 4.8.6 +* Fix `Unknown version 10 of op_mob` error in `mobileToDesktop` option. + +## 4.8.5 +* Fix `last N browsers` again after new `caniuse-db` API changes. + +## 4.8.4 +* Fix released versions detection for queries like `last N browsers`. +* Add IE 11 Mobile to `dead` browsers. + +## 4.8.3 +* Fix warning message (by Anton Ivanov). + +## 4.8.2 +* Fix `Cannot convert undefined or null to object` (by Antoine Clausse). +* Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng). + +## 4.8.1 +* Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng). + +## 4.8 +* Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham). +* Improve docs (by Danny van Kooten). + +## 4.7.3 +* Add funding link for `npm fund`. + +## 4.7.2 +* Add cache for query parsing. +* Improve config caching (by Kārlis Gaņģis). +* Update Firefox ESR. + +## 4.7.1 +* Improve caching. + +## 4.7 +* Add PhantomJS queries. +* Improve docs (by Dorian Koehring). + +## 4.6.6 +* Remove Safari from `dead` query. + +## 4.6.5 +* Add Samsung 4 browser to `dead` query. +* Remove dirty fix for `android all` error. + +## 4.6.4 +* Add Firefox 68 to `Firefox ESR` query. + +## 4.6.3 +* Dirty fix for `android all` error. + +## 4.6.2 +* Fix `last x version` and similar queries for Android (by Tony Ross). + +## 4.6.1 +* Fix patch version support for Electron (by Kilian Valkhof). + +## 4.6 +* Add `mobileToDesktop` option (by Nicolò Ribaudo). + +## 4.5.6 +* Make `Node > 5` and `node > 5` queries case insensitive. + +## 4.5.5 +* Fix CLI help (by Marcel Gerber). +* Add KaiOS browser to docs. + +## 4.5.4 +* Update docs (by Andrew Leedham and Dan Onoshko). + +## 4.5.3 +* Fix splitting string to queries. + +## 4.5.2 +* Show default browsers in CLI on project without config. + +## 4.5.1 +* Improve text for the warning about outdated `caniuse-lite`. + +## 4.5 +* Add `>=`, `>`, and `<=` support for Node.js version (by Mathspy Terabithian). + +## 4.4.2 +* Allow to have string in `package.json` (by @dmarkhas). + +## 4.4.1 +* Allow to use `.` in scope name of shareable config (by Gustav Nikolaj). + +## 4.4 +* Added `and` and `or` keywords to combine queries (by Jon Ege Ronnenberg). + +## 4.3.7 +* Fix fraction years support in `last 1.5 years` (by Clément P). +* Fix version-less browser support. + +## 4.3.6 +* Fix version-less browser support in custom statistics (by Alex Walter). + +## 4.3.5 +* Fix `not` query for wrong Can I Use data. + +## 4.3.4 +* Allow to update `node-releases` without new Browserslist releases. + +## 4.3.3 +* Fix Node.js 11 support. + +## 4.3.2 +* Fix `Unknown version 11 of Node.js` error (by Dan Onoshko). + +## 4.3.1 +* Fix conflict between `caniuse-lite` and custom browsers statistics. + +## 4.3 +* Allow to use `extends browserslist-config-a/file` (by @Schweinepriester). + +## 4.2.1 +* Use new `node-releases` support (by Sergey Rubanov). + +## 4.2 +* Add `--json` argument for CLI. +* Allow to pass multiple areas in CLI by `--coverage=US,alt-AS,global`. + +## 4.1.2 +* Better `unknow query` error message. +* Use latest `node-releases`. + +## 4.1.1 +* Update Firefox ESR versions. + +## 4.1 +* Add `current node` query. +* Add contributors widget to docs (by Sergey Surkov). + +## 4.0.2 +* Fix new `node-releases` support (by Sergey Rubanov). +* Fix error text (by Josh Smith). + +## 4.0.1 +* Reduce npm package size. +* Fix docs. + +## 4.0.0 “Erinaceus amurensis” +* Add `node X` and `maintained node versions` queries (by Pavel Vostrikov). +* Remove Node.js 4 support. +* Show warning if `caniuse-lite` is old (by Anton Tuzhik). +* Add comma support in config file. + +## 3.2.8 +* Add IE 9-5.5 to dead browsers. +* Remove development configs from npm package. + +## 3.2.7 +* Add Firefox 60 as Firefox ESR. + +## 3.2.6 +* Add Opera Mini 12 to dead browsers. +* Update docs (by Jamie Kyle). + +## 3.2.5 +* Fix excluding Opera Mini and other browsers with `all` version. + +## 3.2.4 +* Resolve shareable config from current working directory. + +## 3.2.3 +* Fix `package.json` config validation for single string case. +* Fix CLI error reporting. + +## 3.2.2 +* Add `package.json` config validation. +* Move project to `browserlist` GitHub organization. + +## 3.2.1 +* Fix error text (by Steve Schrab). + +## 3.2 +* Add `cover 99%` query (by Vasily Fedoseyev). +* Add `cover 99% in US` query (by Vasily Fedoseyev). +* Add `cover 99% in my stats` query (by Vasily Fedoseyev). +* Add `"my stats"` support to `browserlist.coverage()` (by Vasily Fedoseyev). + +## 3.1.2 +* Add more clear error on missed browser version. + +## 3.1.1 +* Fix JSDoc (by Sylvain Pollet-Villard). + +## 3.1 +* Add `ignoreUnknownVersions` option. +* Fix docs (by Pascal Duez). + +## 3.0 “Atelerix sclateri” +* Remove country statistics from client-side build of Browserslist. +* Change `> 1%` to `> 0.5%` in default query. +* Add `not dead` to default query. +* Change default environment to `production` (by Marco Fugaro). +* Add `dead` query support with IE 10 and BlackBerry browser. +* Add multiple environments in one section support (by Evilebot Tnawi). +* Add custom statistics support to `browserlist.coverage()`. +* Fix `path` option check. + +## 2.11.3 +* Fix for `path: undefined` option. + +## 2.11.2 +* Remove Node.js specific code from webpack build. + +## 2.11.1 +* Fix using Browserslist in browser with `path` but without `fs`. + +## 2.11 +* Add `last 2 years` query support (by James Harris). + +## 2.10.2 +* Fix Browserify support. + +## 2.10.1 +* Fix using Browserslist without `process` (by Andrew Patton). + +## 2.10 +* Add `< 1%` and `<= 1%` queries support (by August Kaiser). + +## 2.9.1 +* Fix unknown query on trailing spaces in query. + +## 2.9 +* Add `last Electron versions` and `last Electron major versions` queries + (by Louis Mouhat). + +## 2.8 +* Add `since 2016-03` and `since 2016-03-20` queries support (by Andrew Blick). + +## 2.7 +* Add `since 2016` queries support (by Igor Deryabin). + +## 2.6.1 +* Fix `Path must be a string` error. + +## 2.6 +* By default load config from current directory in CLI tool. + +## 2.5.1 +* Allow `@scope/browserlist-config` config name (by Jamie Connolly). + +## 2.5 +* Add `extends` query (by YellowKirby). + +## 2.4.1 +* Throw error if `package.json` contain `browserlist` instead of `browserslist`. + +## 2.4 +* Add `last n major versions` query (by John Sanders). + +## 2.3.3 +* Fix browsers support. + +## 2.3.2 +* Fix `> 0` query for browsers with one version (by Nikolay Solovyov). + +## 2.3.1 +* Reduce library size. + +## 2.3 +* Add `unreleased versions` and `unreleased Chrome versions` queries. + +## 2.2.2 +* Fix `Path must be a string` error (by Pieter Beulque). + +## 2.2.1 +* Fix security issue with regions dynamic `require`. + +## 2.2 +* Add region usage statistics support (by Clément P). + +## 2.1.5 +* Remove Firefox 45 from Firefox ESR. + +## 2.1.4 +* Use both ESR versions when they actual. + +## 2.1.3 +* Add warning on first exclude query. + +## 2.1.2 +* Fix non-Node.js environments support. + +## 2.1.1 +* Fix CLI arguments parsing. + +## 2.1 +* Add `>= 5%`, `>= 5% in US` and `>= 5% in my stats` queries. + +## 2.0 “Atelerix frontalis” +* `last n versions` returns versions for all browsers, not only main browsers. +* Cache file system operations (by Aarni Koskela). +* Use `caniuse-lite` 1 MB instead of `caniuse-db` 7 MB (by Ben Briggs). +* Add `.browserslistrc` config support. +* Add QQ Browser for Android support. +* Add tests for CLI (by Zhulduz Zhankenova). + +## 1.7.7 +* Update Firefox ESR. + +## 1.7.6 +* Fix Android Chrome selection. + +## 1.7.5 +* Fix combining `not` query with country based statistics. +* Fix `--env` argument in CLI (by Tuure Savuoja). + +## 1.7.4 +* Speed up browser sorting (by Aarni Koskela). + +## 1.7.3 +* Fix config finding when directory was passed to `path` (by Aarni Koskela). + +## 1.7.2 +* Fix config finding algorithm (by Aarni Koskela). + +## 1.7.1 +* Fix unreleased browsers version detection. + +## 1.7 +* Add `--config` and `--env` arguments to CLI (by Jarek Rencz). + +## 1.6 +* Convert Electron version to Chrome (by Kilian Valkhof). +* Fix `0` version mistake in Can I Use data. + +## 1.5.2 +* Fix browser versions ordering (by Marco Massarotto). + +## 1.5.1 +* Fix error on `package.json` and `browserslist` in same directory. + +## 1.5 +* Add `package.json` support (by Stepan Kuzmin). +* Add environments support (by Maksim Semenov and openlibser). +* Add `browserslist-stats.json` file support (by Oleh Aloshkin). +* Add `config` option to CLI (by Evilebot Tnawi). +* Add JSDoc. +* Fix tests on Windows (by Anna Stoliar). +* Don’t set custom usage statistics globally. + +## 1.4 +* Add `defaults` keyword. + +## 1.3.6 +* Add `UCAndroid` alias to `and_uc` (by Evilebot Tnawi). + +## 1.3.5 +* Fix Opera Mini support. Use `op_mini all`. + +## 1.3.4 +* Add space-less `>1%` and `>.5%` syntax support (by Andreas Lind). + +## 1.3.3 +* Clean `0` versions in some country-based requests. + +## 1.3.2 +* Update Firefox ESR. + +## 1.3.1 +* Add Safari TP support. + +## 1.3 +* Add coverage for specific country (by Joshua Wise). + +## 1.2 +* Add `browserslist.coverage()` method. +* Add `--coverage` and `-c` argument to CLI. +* Add `-v` argument support to CLI. +* Better error handling in CLI. + +## 1.1.3 +* Fix jspm support (by Sean Anderson). + +## 1.1.2 +* Fix jspm support (by Sean Anderson). + +## 1.1.1 +* Fix space-less `>10%` and `>10% in my stats` queries. +* Normalize error messages. +* Remove development files from npm package. + +## 1.1 +* Added query against custom browser usage data (by Daniel Rey). + +## 1.0.1 +* Update Firefox ESR (by Rouven Weßling). + +## 1.0 “Atelerix algirus” +* Remove Opera 12.1 from default query. +* Add `not` keyword and exclude browsers by query. +* Add Microsoft Edge support (by Andrey Polischuk). +* Add CLI for debug and non-JS usage (by Luke Horvat). +* Use own class in Browserslist errors. + +## 0.5 +* Add version ranges `IE 6-9` (by Ben Briggs). + +## 0.4 +* Add `config` option and `BROWSERSLIST_CONFIG` environment variable support. +* Add symlink config support. + +## 0.3.3 +* Fix DynJS compatibility (by Nick Howes). + +## 0.3.2 +* Fix joined versions on versions query (by Vincent De Oliveira). + +## 0.3.1 +* Fix global variable leak (by Peter Müller). + +## 0.3 +* Takes queries from `BROWSERSLIST` environment variable. + +## 0.2 +* Return Can I Use joined versions as `ios_saf 7.0-7.1`. + +## 0.1.3 +* Better work with Can I Use joined versions like `ios_saf 7.0-7.1`. +* Browserslist now understands `ios_saf 7.0` or `ios_saf 7`. + +## 0.1.2 +* Do not create global `browserslist` var (by Maxime Thirouin). + +## 0.1.1 +* Sort browsers by name and version. + +## 0.1 “Atelerix albiventris” +* Initial release. diff --git a/website/www/node_modules/browserslist/LICENSE b/website/www/node_modules/browserslist/LICENSE new file mode 100644 index 000000000000..90b6b9167337 --- /dev/null +++ b/website/www/node_modules/browserslist/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2014 Andrey Sitnik and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/browserslist/README.md b/website/www/node_modules/browserslist/README.md new file mode 100644 index 000000000000..b1cbde1125f1 --- /dev/null +++ b/website/www/node_modules/browserslist/README.md @@ -0,0 +1,640 @@ +# Browserslist [![Cult Of Martians][cult-img]][cult] + +Browserslist logo by Anton Lovchikov + +The config to share target browsers and Node.js versions between different +front-end tools. It is used in: + +* [Autoprefixer] +* [Babel] +* [postcss-preset-env] +* [eslint-plugin-compat] +* [stylelint-no-unsupported-browser-features] +* [postcss-normalize] +* [obsolete-webpack-plugin] + +All tools will find target browsers automatically, +when you add the following to `package.json`: + +```js + "browserslist": [ + "defaults", + "not IE 11", + "not IE_Mob 11", + "maintained node versions", + ] +``` + +Or in `.browserslistrc` config: + +```yaml +# Browsers that we support + +defaults +not IE 11 +not IE_Mob 11 +maintained node versions +``` + +Developers set their version lists using queries like `last 2 versions` +to be free from updating versions manually. +Browserslist will use [`caniuse-lite`] with [Can I Use] data for this queries. + +Browserslist will take queries from tool option, +`browserslist` config, `.browserslistrc` config, +`browserslist` section in `package.json` or environment variables. + +[Browserslist Example] shows how every tool uses Browserslist. + +[cult-img]: https://cultofmartians.com/assets/badges/badge.svg +[cult]: https://cultofmartians.com/done.html + + + Sponsored by Evil Martians + + +[stylelint-no-unsupported-browser-features]: https://github.com/ismay/stylelint-no-unsupported-browser-features +[eslint-plugin-compat]: https://github.com/amilajack/eslint-plugin-compat +[Browserslist Example]: https://github.com/browserslist/browserslist-example +[postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env +[postcss-normalize]: https://github.com/jonathantneal/postcss-normalize +[`caniuse-lite`]: https://github.com/ben-eb/caniuse-lite +[Autoprefixer]: https://github.com/postcss/autoprefixer +[Can I Use]: https://caniuse.com/ +[Babel]: https://github.com/babel/babel/tree/master/packages/babel-preset-env +[obsolete-webpack-plugin]: https://github.com/ElemeFE/obsolete-webpack-plugin + +## Table of Contents + +* [Tools](#tools) +* [Best Practices](#best-practices) +* [Queries](#queries) + * [Query Composition](#query-composition) + * [Full List](#full-list) + * [Debug](#debug) + * [Browsers](#browsers) +* [Config File](#config-file) + * [`package.json`](#packagejson) + * [`.browserslistrc`](#browserslistrc) +* [Shareable Configs](#shareable-configs) +* [Configuring for Different Environments](#configuring-for-different-environments) +* [Custom Usage Data](#custom-usage-data) +* [JS API](#js-api) +* [Environment Variables](#environment-variables) +* [Cache](#cache) +* [Security Contact](#security-contact) +* [For Enterprise](#for-enterprise) + +## Tools + +* [`browserl.ist`](https://browserl.ist/) is an online tool to check + what browsers will be selected by some query. +* [`browserslist-ga`] and [`browserslist-ga-export`] download your website + browsers statistics to use it in `> 0.5% in my stats` query. +* [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp + to test browser useragent. +* [`browserslist-useragent-ruby`] is a Ruby library to checks browser + by user agent string to match Browserslist. +* [`browserslist-browserstack`] runs BrowserStack tests for all browsers + in Browserslist config. +* [`browserslist-adobe-analytics`] use Adobe Analytics data to target browsers. +* [`caniuse-api`] returns browsers which support some specific feature. +* Run `npx browserslist` in your project directory to see project’s + target browsers. This CLI tool is built-in and available in any project + with Autoprefixer. + +[`browserslist-useragent-regexp`]: https://github.com/browserslist/browserslist-useragent-regexp +[`browserslist-adobe-analytics`]: https://github.com/xeroxinteractive/browserslist-adobe-analytics +[`browserslist-useragent-ruby`]: https://github.com/browserslist/browserslist-useragent-ruby +[`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack +[`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export +[`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent +[`browserslist-ga`]: https://github.com/browserslist/browserslist-ga +[`caniuse-api`]: https://github.com/Nyalab/caniuse-api + + +## Best Practices + +* There is a `defaults` query, which gives a reasonable configuration + for most users: + + ```json + "browserslist": [ + "defaults" + ] + ``` + +* If you want to change the default set of browsers, we recommend combining + `last 2 versions`, `not dead` with a usage number like `> 0.2%`. This is + because `last n versions` on its own does not add popular old versions, while + only using a percentage above `0.2%` will in the long run make popular + browsers even more popular. We might run into a monopoly and stagnation + situation, as we had with Internet Explorer 6. Please use this setting + with caution. +* Select browsers directly (`last 2 Chrome versions`) only if you are making + a web app for a kiosk with one browser. There are a lot of browsers + on the market. If you are making general web app you should respect + browsers diversity. +* Don’t remove browsers just because you don’t know them. Opera Mini has + 100 million users in Africa and it is more popular in the global market + than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox + and desktop Safari combined. + + +## Queries + +Browserslist will use browsers and Node.js versions query +from one of these sources: + +1. `browserslist` key in `package.json` file in current or parent directories. + **We recommend this way.** +2. `.browserslistrc` config file in current or parent directories. +3. `browserslist` config file in current or parent directories. +4. `BROWSERSLIST` environment variable. +5. If the above methods did not produce a valid result + Browserslist will use defaults: + `> 0.5%, last 2 versions, Firefox ESR, not dead`. + + +### Query Composition + +An `or` combiner can use the keyword `or` as well as `,`. +`last 1 version or > 1%` is equal to `last 1 version, > 1%`. + +`and` query combinations are also supported to perform an +intersection of the previous query: `last 1 version and > 1%`. + +There is 3 different ways to combine queries as depicted below. First you start +with a single query and then we combine the queries to get our final list. + +Obviously you can *not* start with a `not` combiner, since there is no left-hand +side query to combine it with. The left-hand is always resolved as `and` +combiner even if `or` is used (this is an API implementation specificity). + +`and` combiner has precedence over `or` combiner. + +| Query combiner type | Illustration | Example | +| ------------------- | :----------: | ------- | +|`or`/`,` combiner
    (union) | ![Union of queries](img/union.svg) | `> .5% or last 2 versions`
    `> .5%, last 2 versions` | +| `and` combiner
    (intersection) | ![intersection of queries](img/intersection.svg) | `> .5% and last 2 versions` | +| `not` combiner
    (relative complement) | ![Relative complement of queries](img/complement.svg) | All those three are equivalent to the first one
    `> .5% and not last 2 versions`
    `> .5% or not last 2 versions`
    `> .5%, not last 2 versions` | + +_A quick way to test your query is to do `npx browserslist '> 0.5%, not IE 11'` +in your terminal._ + + +### Full List + +You can specify the browser and Node.js versions by queries (case insensitive): + +* `defaults`: Browserslist’s default browsers + (`> 0.5%, last 2 versions, Firefox ESR, not dead`). +* `> 5%`: browsers versions selected by global usage statistics. + `>=`, `<` and `<=` work too. +* `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code]. +* `> 5% in alt-AS`: uses Asia region usage statistics. List of all region codes + can be found at [`caniuse-lite/data/regions`]. +* `> 5% in my stats`: uses [custom usage data]. +* `> 5% in browserslist-config-mycompany stats`: uses [custom usage data] + from `browserslist-config-mycompany/browserslist-stats.json`. +* `cover 99.5%`: most popular browsers that provide coverage. +* `cover 99.5% in US`: same as above, with [two-letter country code]. +* `cover 99.5% in my stats`: uses [custom usage data]. +* `maintained node versions`: all Node.js versions, which are [still maintained] + by Node.js Foundation. +* `node 10` and `node 10.4`: selects latest Node.js `10.x.x` + or `10.4.x` release. +* `current node`: Node.js version used by Browserslist right now. +* `extends browserslist-config-mycompany`: take queries from + `browserslist-config-mycompany` npm package. +* `ie 6-8`: selects an inclusive range of versions. +* `Firefox > 20`: versions of Firefox newer than 20. + `>=`, `<` and `<=` work too. It also works with Node.js. +* `iOS 7`: the iOS browser version 7 directly. +* `Firefox ESR`: the latest [Firefox ESR] version. +* `PhantomJS 2.1` and `PhantomJS 1.9`: selects Safari versions similar + to PhantomJS runtime. +* `unreleased versions` or `unreleased Chrome versions`: + alpha and beta versions. +* `last 2 major versions` or `last 2 iOS major versions`: + all minor/patch releases of last 2 major versions. +* `since 2015` or `last 2 years`: all versions released since year 2015 + (also `since 2015-03` and `since 2015-03-10`). +* `dead`: browsers without official support or updates for 24 months. + Right now it is `IE 10`, `IE_Mob 11`, `BlackBerry 10`, `BlackBerry 7`, + `Samsung 4` and `OperaMobile 12.1`. +* `last 2 versions`: the last 2 versions for *each* browser. +* `last 2 Chrome versions`: the last 2 versions of Chrome browser. +* `not ie <= 8`: exclude browsers selected by previous queries. + +You can add `not ` to any query. + +[`caniuse-lite/data/regions`]: https://github.com/ben-eb/caniuse-lite/tree/master/data/regions +[two-letter country code]: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements +[custom usage data]: #custom-usage-data +[still maintained]: https://github.com/nodejs/Release +[Can I Use]: https://caniuse.com/ + + +### Debug + +Run `npx browserslist` in project directory to see what browsers was selected +by your queries. + +```sh +$ npx browserslist +and_chr 61 +and_ff 56 +and_qq 1.2 +and_uc 11.4 +android 56 +baidu 7.12 +bb 10 +chrome 62 +edge 16 +firefox 56 +ios_saf 11 +opera 48 +safari 11 +samsung 5 +``` + + +### Browsers + +Names are case insensitive: + +* `Android` for Android WebView. +* `Baidu` for Baidu Browser. +* `BlackBerry` or `bb` for Blackberry browser. +* `Chrome` for Google Chrome. +* `ChromeAndroid` or `and_chr` for Chrome for Android +* `Edge` for Microsoft Edge. +* `Electron` for Electron framework. It will be converted to Chrome version. +* `Explorer` or `ie` for Internet Explorer. +* `ExplorerMobile` or `ie_mob` for Internet Explorer Mobile. +* `Firefox` or `ff` for Mozilla Firefox. +* `FirefoxAndroid` or `and_ff` for Firefox for Android. +* `iOS` or `ios_saf` for iOS Safari. +* `Node` for Node.js. +* `Opera` for Opera. +* `OperaMini` or `op_mini` for Opera Mini. +* `OperaMobile` or `op_mob` for Opera Mobile. +* `QQAndroid` or `and_qq` for QQ Browser for Android. +* `Safari` for desktop Safari. +* `Samsung` for Samsung Internet. +* `UCAndroid` or `and_uc` for UC Browser for Android. +* `kaios` for KaiOS Browser. + + +## Config File + +### `package.json` + +If you want to reduce config files in project root, you can specify +browsers in `package.json` with `browserslist` key: + +```json +{ + "private": true, + "dependencies": { + "autoprefixer": "^6.5.4" + }, + "browserslist": [ + "last 1 version", + "> 1%", + "IE 10" + ] +} +``` + + +### `.browserslistrc` + +Separated Browserslist config should be named `.browserslistrc` +and have browsers queries split by a new line. +Each line is combined with the `or` combiner. Comments starts with `#` symbol: + +```yaml +# Browsers that we support + +last 1 version +> 1% +IE 10 # sorry +``` + +Browserslist will check config in every directory in `path`. +So, if tool process `app/styles/main.css`, you can put config to root, +`app/` or `app/styles`. + +You can specify direct path in `BROWSERSLIST_CONFIG` environment variables. + + +## Shareable Configs + +You can use the following query to reference an exported Browserslist config +from another package: + +```json + "browserslist": [ + "extends browserslist-config-mycompany" + ] +``` + +For security reasons, external configuration only supports packages that have +the `browserslist-config-` prefix. npm scoped packages are also supported, by +naming or prefixing the module with `@scope/browserslist-config`, such as +`@scope/browserslist-config` or `@scope/browserslist-config-mycompany`. + +If you don’t accept Browserslist queries from users, you can disable the +validation by using the `dangerousExtend` option: + +```js +browserslist(queries, { path, dangerousExtend: true }) +``` + +Because this uses `npm`'s resolution, you can also reference specific files +in a package: + +```json + "browserslist": [ + "extends browserslist-config-mycompany/desktop", + "extends browserslist-config-mycompany/mobile" + ] +``` + +When writing a shared Browserslist package, just export an array. +`browserslist-config-mycompany/index.js`: + +```js +module.exports = [ + 'last 1 version', + '> 1%', + 'ie 10' +] +``` + +You can also include a `browserslist-stats.json` file as part of your shareable +config at the root and query it using +`> 5% in browserslist-config-mycompany stats`. It uses the same format +as `extends` and the `dangerousExtend` property as above. + +You can export configs for different environments and select environment +by `BROWSERSLIST_ENV` or `env` option in your tool: + +```js +module.exports = { + development: [ + 'last 1 version' + ], + production: [ + 'last 1 version', + '> 1%', + 'ie 10' + ] +} +``` + + +## Configuring for Different Environments + +You can also specify different browser queries for various environments. +Browserslist will choose query according to `BROWSERSLIST_ENV` or `NODE_ENV` +variables. If none of them is declared, Browserslist will firstly look +for `production` queries and then use defaults. + +In `package.json`: + +```js + "browserslist": { + "production": [ + "> 1%", + "ie 10" + ], + "modern": [ + "last 1 chrome version", + "last 1 firefox version" + ], + "ssr": [ + "node 12" + ] + } +``` + +In `.browserslistrc` config: + +```ini +[production] +> 1% +ie 10 + +[modern] +last 1 chrome version +last 1 firefox version + +[ssr] +node 12 +``` + + +## Custom Usage Data + +If you have a website, you can query against the usage statistics of your site. +[`browserslist-ga`] will ask access to Google Analytics and then generate +`browserslist-stats.json`: + +``` +npx browserslist-ga +``` + +Or you can use [`browserslist-ga-export`] to convert Google Analytics data without giving a password for Google account. + +You can generate usage statistics file by any other method. File format should +be like: + +```js +{ + "ie": { + "6": 0.01, + "7": 0.4, + "8": 1.5 + }, + "chrome": { + … + }, + … +} +``` + +Note that you can query against your custom usage data while also querying +against global or regional data. For example, the query +`> 1% in my stats, > 5% in US, 10%` is permitted. + +[`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export +[`browserslist-ga`]: https://github.com/browserslist/browserslist-ga +[Can I Use]: https://caniuse.com/ + + +## JS API + +```js +const browserslist = require('browserslist') + +// Your CSS/JS build tool code +function process (source, opts) { + const browsers = browserslist(opts.overrideBrowserslist, { + stats: opts.stats, + path: opts.file, + env: opts.env + }) + // Your code to add features for selected browsers +} +``` + +Queries can be a string `"> 1%, IE 10"` +or an array `['> 1%', 'IE 10']`. + +If a query is missing, Browserslist will look for a config file. +You can provide a `path` option (that can be a file) to find the config file +relatively to it. + +Options: + +* `path`: file or a directory path to look for config file. Default is `.`. +* `env`: what environment section use from config. Default is `production`. +* `stats`: custom usage statistics data. +* `config`: path to config if you want to set it manually. +* `ignoreUnknownVersions`: do not throw on direct query (like `ie 12`). + Default is `false.` +* `dangerousExtend`: Disable security checks for `extend` query. + Default is `false.` +* `mobileToDesktop`: Use desktop browsers if Can I Use doesn’t have data + about this mobile version. For instance, Browserslist will return + `chrome 20` on `and_chr 20` query (Can I Use has only data only about + latest versions of mobile browsers). Default is `false`. + +For non-JS environment and debug purpose you can use CLI tool: + +```sh +browserslist "> 1%, IE 10" +``` + +You can get total users coverage for selected browsers by JS API: + +```js +browserslist.coverage(browserslist('> 1%')) +//=> 81.4 +``` + +```js +browserslist.coverage(browserslist('> 1% in US'), 'US') +//=> 83.1 +``` + +```js +browserslist.coverage(browserslist('> 1% in my stats'), 'my stats') +//=> 83.1 +``` + +```js +browserslist.coverage(browserslist('> 1% in my stats', { stats }), stats) +//=> 82.2 +``` + +Or by CLI: + +```sh +$ browserslist --coverage "> 1%" +These browsers account for 81.4% of all users globally +``` + +```sh +$ browserslist --coverage=US "> 1% in US" +These browsers account for 83.1% of all users in the US +``` + +```sh +$ browserslist --coverage "> 1% in my stats" +These browsers account for 83.1% of all users in custom statistics +``` + +```sh +$ browserslist --coverage "> 1% in my stats" --stats=./stats.json +These browsers account for 83.1% of all users in custom statistics +``` + + +## Environment Variables + +If a tool uses Browserslist inside, you can change the Browserslist settings +with [environment variables]: + +* `BROWSERSLIST` with browsers queries. + + ```sh + BROWSERSLIST="> 5%" gulp css + ``` + +* `BROWSERSLIST_CONFIG` with path to config file. + + ```sh + BROWSERSLIST_CONFIG=./config/browserslist gulp css + ``` + +* `BROWSERSLIST_ENV` with environments string. + + ```sh + BROWSERSLIST_ENV="development" gulp css + ``` + +* `BROWSERSLIST_STATS` with path to the custom usage data + for `> 1% in my stats` query. + + ```sh + BROWSERSLIST_STATS=./config/usage_data.json gulp css + ``` + +* `BROWSERSLIST_DISABLE_CACHE` if you want to disable config reading cache. + + ```sh + BROWSERSLIST_DISABLE_CACHE=1 gulp css + ``` + +[environment variables]: https://en.wikipedia.org/wiki/Environment_variable + + +## Cache + +Browserslist caches the configuration it reads from `package.json` and +`browserslist` files, as well as knowledge about the existence of files, +for the duration of the hosting process. + +To clear these caches, use: + +```js +browserslist.clearCaches() +``` + +To disable the caching altogether, set the `BROWSERSLIST_DISABLE_CACHE` +environment variable. + + +## Security Contact + +To report a security vulnerability, please use the [Tidelift security contact]. +Tidelift will coordinate the fix and disclosure. + +[Tidelift security contact]: https://tidelift.com/security + + +## For Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `browserslist` and thousands of other packages are working +with Tidelift to deliver commercial support and maintenance for the open source +dependencies you use to build your applications. Save time, reduce risk, +and improve code health, while paying the maintainers of the exact dependencies +you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-browserslist?utm_source=npm-browserslist&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/website/www/node_modules/browserslist/browser.js b/website/www/node_modules/browserslist/browser.js new file mode 100644 index 000000000000..77a217acd180 --- /dev/null +++ b/website/www/node_modules/browserslist/browser.js @@ -0,0 +1,41 @@ +var BrowserslistError = require('./error') + +function noop () { } + +module.exports = { + loadQueries: function loadQueries () { + throw new BrowserslistError( + 'Sharable configs are not supported in client-side build of Browserslist') + }, + + getStat: function getStat (opts) { + return opts.stats + }, + + loadConfig: function loadConfig (opts) { + if (opts.config) { + throw new BrowserslistError( + 'Browserslist config are not supported in client-side build') + } + }, + + loadCountry: function loadCountry () { + throw new BrowserslistError( + 'Country statistics is not supported ' + + 'in client-side build of Browserslist') + }, + + currentNode: function currentNode (resolve, context) { + return resolve(['maintained node versions'], context)[0] + }, + + parseConfig: noop, + + readConfig: noop, + + findConfig: noop, + + clearCaches: noop, + + oldDataWarning: noop +} diff --git a/website/www/node_modules/browserslist/cli.js b/website/www/node_modules/browserslist/cli.js new file mode 100755 index 000000000000..526885fdb145 --- /dev/null +++ b/website/www/node_modules/browserslist/cli.js @@ -0,0 +1,145 @@ +#!/usr/bin/env node + +var fs = require('fs') + +var browserslist = require('./') +var updateDb = require('./update-db') +var pkg = require('./package.json') + +var args = process.argv.slice(2) + +var USAGE = 'Usage:\n' + + ' npx browserslist\n' + + ' npx browserslist "QUERIES"\n' + + ' npx browserslist --json "QUERIES"\n' + + ' npx browserslist --config="path/to/browserlist/file"\n' + + ' npx browserslist --coverage "QUERIES"\n' + + ' npx browserslist --coverage=US "QUERIES"\n' + + ' npx browserslist --coverage=US,RU,global "QUERIES"\n' + + ' npx browserslist --env="environment name defined in config"\n' + + ' npx browserslist --stats="path/to/browserlist/stats/file"\n' + + ' npx browserslist --mobile-to-desktop\n' + + ' npx browserslist --update-db' + +function isArg (arg) { + return args.some(function (str) { + return str === arg || str.indexOf(arg + '=') === 0 + }) +} + +function error (msg) { + process.stderr.write('browserslist: ' + msg + '\n') + process.exit(1) +} + +if (isArg('--help') || isArg('-h')) { + process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n') +} else if (isArg('--version') || isArg('-v')) { + process.stdout.write('browserslist ' + pkg.version + '\n') +} else if (isArg('--update-db')) { + updateDb(function (str) { + process.stdout.write(str) + }) +} else { + var mode = 'browsers' + var opts = { } + var queries + var areas + + for (var i = 0; i < args.length; i++) { + if (args[i][0] !== '-') { + queries = args[i].replace(/^["']|["']$/g, '') + continue + } + + var arg = args[i].split('=') + var name = arg[0] + var value = arg[1] + + if (value) value = value.replace(/^["']|["']$/g, '') + + if (name === '--config' || name === '-b') { + opts.config = value + } else if (name === '--env' || name === '-e') { + opts.env = value + } else if (name === '--stats' || name === '-s') { + opts.stats = value + } else if (name === '--coverage' || name === '-c') { + if (mode !== 'json') mode = 'coverage' + if (value) { + areas = value.split(',') + } else { + areas = ['global'] + } + } else if (name === '--json') { + mode = 'json' + } else if (name === '--mobile-to-desktop') { + opts.mobileToDesktop = true + } else { + error('Unknown arguments ' + args[i] + '.\n\n' + USAGE) + } + } + + var browsers + try { + browsers = browserslist(queries, opts) + } catch (e) { + if (e.name === 'BrowserslistError') { + error(e.message) + } else { + throw e + } + } + + var coverage + if (mode === 'browsers') { + browsers.forEach(function (browser) { + process.stdout.write(browser + '\n') + }) + } else if (areas) { + coverage = areas.map(function (area) { + var stats + if (area !== 'global') { + stats = area + } else if (opts.stats) { + stats = JSON.parse(fs.readFileSync(opts.stats)) + } + var result = browserslist.coverage(browsers, stats) + var round = Math.round(result * 100) / 100.0 + + return [area, round] + }) + + if (mode === 'coverage') { + var prefix = 'These browsers account for ' + process.stdout.write(prefix) + coverage.forEach(function (data, index) { + var area = data[0] + var round = data[1] + var end = 'globally' + if (area && area !== 'global') { + end = 'in the ' + area.toUpperCase() + } else if (opts.stats) { + end = 'in custom statistics' + } + + if (index !== 0) { + process.stdout.write(prefix.replace(/./g, ' ')) + } + + process.stdout.write(round + '% of all users ' + end + '\n') + }) + } + } + + if (mode === 'json') { + var data = { browsers: browsers } + if (coverage) { + data.coverage = coverage.reduce(function (object, j) { + object[j[0]] = j[1] + return object + }, { }) + } + process.stdout.write(JSON.stringify(data, null, ' ') + '\n') + } +} diff --git a/website/www/node_modules/browserslist/error.js b/website/www/node_modules/browserslist/error.js new file mode 100644 index 000000000000..b3bc0fe94c69 --- /dev/null +++ b/website/www/node_modules/browserslist/error.js @@ -0,0 +1,12 @@ +function BrowserslistError (message) { + this.name = 'BrowserslistError' + this.message = message + this.browserslist = true + if (Error.captureStackTrace) { + Error.captureStackTrace(this, BrowserslistError) + } +} + +BrowserslistError.prototype = Error.prototype + +module.exports = BrowserslistError diff --git a/website/www/node_modules/browserslist/index.js b/website/www/node_modules/browserslist/index.js new file mode 100644 index 000000000000..988f462f3067 --- /dev/null +++ b/website/www/node_modules/browserslist/index.js @@ -0,0 +1,1159 @@ +var jsReleases = require('node-releases/data/processed/envs.json') +var agents = require('caniuse-lite/dist/unpacker/agents').agents +var jsEOL = require('node-releases/data/release-schedule/release-schedule.json') +var path = require('path') +var e2c = require('electron-to-chromium/versions') + +var BrowserslistError = require('./error') +var env = require('./node') // Will load browser.js in webpack + +var YEAR = 365.259641 * 24 * 60 * 60 * 1000 +var ANDROID_EVERGREEN_FIRST = 37 + +var QUERY_OR = 1 +var QUERY_AND = 2 + +function isVersionsMatch (versionA, versionB) { + return (versionA + '.').indexOf(versionB + '.') === 0 +} + +function isEolReleased (name) { + var version = name.slice(1) + return jsReleases.some(function (i) { + return isVersionsMatch(i.version, version) + }) +} + +function normalize (versions) { + return versions.filter(function (version) { + return typeof version === 'string' + }) +} + +function normalizeElectron (version) { + var versionToUse = version + if (version.split('.').length === 3) { + versionToUse = version + .split('.') + .slice(0, -1) + .join('.') + } + return versionToUse +} + +function nameMapper (name) { + return function mapName (version) { + return name + ' ' + version + } +} + +function getMajor (version) { + return parseInt(version.split('.')[0]) +} + +function getMajorVersions (released, number) { + if (released.length === 0) return [] + var majorVersions = uniq(released.map(getMajor)) + var minimum = majorVersions[majorVersions.length - number] + if (!minimum) { + return released + } + var selected = [] + for (var i = released.length - 1; i >= 0; i--) { + if (minimum > getMajor(released[i])) break + selected.unshift(released[i]) + } + return selected +} + +function uniq (array) { + var filtered = [] + for (var i = 0; i < array.length; i++) { + if (filtered.indexOf(array[i]) === -1) filtered.push(array[i]) + } + return filtered +} + +// Helpers + +function fillUsage (result, name, data) { + for (var i in data) { + result[name + ' ' + i] = data[i] + } +} + +function generateFilter (sign, version) { + version = parseFloat(version) + if (sign === '>') { + return function (v) { + return parseFloat(v) > version + } + } else if (sign === '>=') { + return function (v) { + return parseFloat(v) >= version + } + } else if (sign === '<') { + return function (v) { + return parseFloat(v) < version + } + } else { + return function (v) { + return parseFloat(v) <= version + } + } +} + +function generateSemverFilter (sign, version) { + version = version.split('.').map(parseSimpleInt) + version[1] = version[1] || 0 + version[2] = version[2] || 0 + if (sign === '>') { + return function (v) { + v = v.split('.').map(parseSimpleInt) + return compareSemver(v, version) > 0 + } + } else if (sign === '>=') { + return function (v) { + v = v.split('.').map(parseSimpleInt) + return compareSemver(v, version) >= 0 + } + } else if (sign === '<') { + return function (v) { + v = v.split('.').map(parseSimpleInt) + return compareSemver(version, v) > 0 + } + } else { + return function (v) { + v = v.split('.').map(parseSimpleInt) + return compareSemver(version, v) >= 0 + } + } +} + +function parseSimpleInt (x) { + return parseInt(x) +} + +function compare (a, b) { + if (a < b) return -1 + if (a > b) return +1 + return 0 +} + +function compareSemver (a, b) { + return ( + compare(parseInt(a[0]), parseInt(b[0])) || + compare(parseInt(a[1] || '0'), parseInt(b[1] || '0')) || + compare(parseInt(a[2] || '0'), parseInt(b[2] || '0')) + ) +} + +// this follows the npm-like semver behavior +function semverFilterLoose (operator, range) { + range = range.split('.').map(parseSimpleInt) + if (typeof range[1] === 'undefined') { + range[1] = 'x' + } + // ignore any patch version because we only return minor versions + // range[2] = 'x' + switch (operator) { + case '<=': + return function (version) { + version = version.split('.').map(parseSimpleInt) + return compareSemverLoose(version, range) <= 0 + } + default: + case '>=': + return function (version) { + version = version.split('.').map(parseSimpleInt) + return compareSemverLoose(version, range) >= 0 + } + } +} + +// this follows the npm-like semver behavior +function compareSemverLoose (version, range) { + if (version[0] !== range[0]) { + return version[0] < range[0] ? -1 : +1 + } + if (range[1] === 'x') { + return 0 + } + if (version[1] !== range[1]) { + return version[1] < range[1] ? -1 : +1 + } + return 0 +} + +function resolveVersion (data, version) { + if (data.versions.indexOf(version) !== -1) { + return version + } else if (browserslist.versionAliases[data.name][version]) { + return browserslist.versionAliases[data.name][version] + } else { + return false + } +} + +function normalizeVersion (data, version) { + var resolved = resolveVersion(data, version) + if (resolved) { + return resolved + } else if (data.versions.length === 1) { + return data.versions[0] + } else { + return false + } +} + +function filterByYear (since, context) { + since = since / 1000 + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context) + if (!data) return selected + var versions = Object.keys(data.releaseDate).filter(function (v) { + return data.releaseDate[v] >= since + }) + return selected.concat(versions.map(nameMapper(data.name))) + }, []) +} + +function cloneData (data) { + return { + name: data.name, + versions: data.versions, + released: data.released, + releaseDate: data.releaseDate + } +} + +function mapVersions (data, map) { + data.versions = data.versions.map(function (i) { + return map[i] || i + }) + data.released = data.versions.map(function (i) { + return map[i] || i + }) + var fixedDate = { } + for (var i in data.releaseDate) { + fixedDate[map[i] || i] = data.releaseDate[i] + } + data.releaseDate = fixedDate + return data +} + +function byName (name, context) { + name = name.toLowerCase() + name = browserslist.aliases[name] || name + if (context.mobileToDesktop && browserslist.desktopNames[name]) { + var desktop = browserslist.data[browserslist.desktopNames[name]] + if (name === 'android') { + return normalizeAndroidData(cloneData(browserslist.data[name]), desktop) + } else { + var cloned = cloneData(desktop) + cloned.name = name + if (name === 'op_mob') { + cloned = mapVersions(cloned, { '10.0-10.1': '10' }) + } + return cloned + } + } + return browserslist.data[name] +} + +function normalizeAndroidVersions (androidVersions, chromeVersions) { + var firstEvergreen = ANDROID_EVERGREEN_FIRST + var last = chromeVersions[chromeVersions.length - 1] + return androidVersions + .filter(function (version) { return /^(?:[2-4]\.|[34]$)/.test(version) }) + .concat(chromeVersions.slice(firstEvergreen - last - 1)) +} + +function normalizeAndroidData (android, chrome) { + android.released = normalizeAndroidVersions(android.released, chrome.released) + android.versions = normalizeAndroidVersions(android.versions, chrome.versions) + return android +} + +function checkName (name, context) { + var data = byName(name, context) + if (!data) throw new BrowserslistError('Unknown browser ' + name) + return data +} + +function unknownQuery (query) { + return new BrowserslistError( + 'Unknown browser query `' + query + '`. ' + + 'Maybe you are using old Browserslist or made typo in query.' + ) +} + +function filterAndroid (list, versions, context) { + if (context.mobileToDesktop) return list + var released = browserslist.data.android.released + var last = released[released.length - 1] + var diff = last - ANDROID_EVERGREEN_FIRST - versions + if (diff > 0) { + return list.slice(-1) + } else { + return list.slice(diff - 1) + } +} + +/** + * Resolves queries into a browser list. + * @param {string|string[]} queries Queries to combine. + * Either an array of queries or a long string of queries. + * @param {object} [context] Optional arguments to + * the select function in `queries`. + * @returns {string[]} A list of browsers + */ +function resolve (queries, context) { + if (Array.isArray(queries)) { + queries = flatten(queries.map(parse)) + } else { + queries = parse(queries) + } + + return queries.reduce(function (result, query, index) { + var selection = query.queryString + + var isExclude = selection.indexOf('not ') === 0 + if (isExclude) { + if (index === 0) { + throw new BrowserslistError( + 'Write any browsers query (for instance, `defaults`) ' + + 'before `' + selection + '`') + } + selection = selection.slice(4) + } + + for (var i = 0; i < QUERIES.length; i++) { + var type = QUERIES[i] + var match = selection.match(type.regexp) + if (match) { + var args = [context].concat(match.slice(1)) + var array = type.select.apply(browserslist, args).map(function (j) { + var parts = j.split(' ') + if (parts[1] === '0') { + return parts[0] + ' ' + byName(parts[0], context).versions[0] + } else { + return j + } + }) + + switch (query.type) { + case QUERY_AND: + if (isExclude) { + return result.filter(function (j) { + return array.indexOf(j) === -1 + }) + } else { + return result.filter(function (j) { + return array.indexOf(j) !== -1 + }) + } + case QUERY_OR: + default: + if (isExclude) { + var filter = { } + array.forEach(function (j) { + filter[j] = true + }) + return result.filter(function (j) { + return !filter[j] + }) + } + return result.concat(array) + } + } + } + + throw unknownQuery(selection) + }, []) +} + +var cache = { } + +/** + * Return array of browsers by selection queries. + * + * @param {(string|string[])} [queries=browserslist.defaults] Browser queries. + * @param {object} [opts] Options. + * @param {string} [opts.path="."] Path to processed file. + * It will be used to find config files. + * @param {string} [opts.env="production"] Processing environment. + * It will be used to take right + * queries from config file. + * @param {string} [opts.config] Path to config file with queries. + * @param {object} [opts.stats] Custom browser usage statistics + * for "> 1% in my stats" query. + * @param {boolean} [opts.ignoreUnknownVersions=false] Do not throw on unknown + * version in direct query. + * @param {boolean} [opts.dangerousExtend] Disable security checks + * for extend query. + * @param {boolean} [opts.mobileToDesktop] Alias mobile browsers to the desktop + * version when Can I Use doesn't have + * data about the specified version. + * @returns {string[]} Array with browser names in Can I Use. + * + * @example + * browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8'] + */ +function browserslist (queries, opts) { + if (typeof opts === 'undefined') opts = { } + + if (typeof opts.path === 'undefined') { + opts.path = path.resolve ? path.resolve('.') : '.' + } + + if (typeof queries === 'undefined' || queries === null) { + var config = browserslist.loadConfig(opts) + if (config) { + queries = config + } else { + queries = browserslist.defaults + } + } + + if (!(typeof queries === 'string' || Array.isArray(queries))) { + throw new BrowserslistError( + 'Browser queries must be an array or string. Got ' + typeof queries + '.') + } + + var context = { + ignoreUnknownVersions: opts.ignoreUnknownVersions, + dangerousExtend: opts.dangerousExtend, + mobileToDesktop: opts.mobileToDesktop, + env: opts.env + } + + env.oldDataWarning(browserslist.data) + var stats = env.getStat(opts, browserslist.data) + if (stats) { + context.customUsage = { } + for (var browser in stats) { + fillUsage(context.customUsage, browser, stats[browser]) + } + } + + var cacheKey = JSON.stringify([queries, context]) + if (cache[cacheKey]) return cache[cacheKey] + + var result = uniq(resolve(queries, context)).sort(function (name1, name2) { + name1 = name1.split(' ') + name2 = name2.split(' ') + if (name1[0] === name2[0]) { + // assumptions on caniuse data + // 1) version ranges never overlaps + // 2) if version is not a range, it never contains `-` + var version1 = name1[1].split('-')[0] + var version2 = name2[1].split('-')[0] + return compareSemver(version2.split('.'), version1.split('.')) + } else { + return compare(name1[0], name2[0]) + } + }) + if (!process.env.BROWSERSLIST_DISABLE_CACHE) { + cache[cacheKey] = result + } + return result +} + +function parse (queries) { + var qs = [] + do { + queries = doMatch(queries, qs) + } while (queries) + return qs +} + +function doMatch (string, qs) { + var or = /^(?:,\s*|\s+or\s+)(.*)/i + var and = /^\s+and\s+(.*)/i + + return find(string, function (parsed, n, max) { + if (and.test(parsed)) { + qs.unshift({ type: QUERY_AND, queryString: parsed.match(and)[1] }) + return true + } else if (or.test(parsed)) { + qs.unshift({ type: QUERY_OR, queryString: parsed.match(or)[1] }) + return true + } else if (n === max) { + qs.unshift({ type: QUERY_OR, queryString: parsed.trim() }) + return true + } + return false + }) +} + +function find (string, predicate) { + for (var n = 1, max = string.length; n <= max; n++) { + var parsed = string.substr(-n, n) + if (predicate(parsed, n, max)) { + return string.slice(0, -n) + } + } + return '' +} + +function flatten (array) { + if (!Array.isArray(array)) return [array] + return array.reduce(function (a, b) { + return a.concat(flatten(b)) + }, []) +} + +// Will be filled by Can I Use data below +browserslist.data = { } +browserslist.usage = { + global: { }, + custom: null +} + +// Default browsers query +browserslist.defaults = [ + '> 0.5%', + 'last 2 versions', + 'Firefox ESR', + 'not dead' +] + +// Browser names aliases +browserslist.aliases = { + fx: 'firefox', + ff: 'firefox', + ios: 'ios_saf', + explorer: 'ie', + blackberry: 'bb', + explorermobile: 'ie_mob', + operamini: 'op_mini', + operamobile: 'op_mob', + chromeandroid: 'and_chr', + firefoxandroid: 'and_ff', + ucandroid: 'and_uc', + qqandroid: 'and_qq' +} + +// Can I Use only provides a few versions for some browsers (e.g. and_chr). +// Fallback to a similar browser for unknown versions +browserslist.desktopNames = { + and_chr: 'chrome', + and_ff: 'firefox', + ie_mob: 'ie', + op_mob: 'opera', + android: 'chrome' // has extra processing logic +} + +// Aliases to work with joined versions like `ios_saf 7.0-7.1` +browserslist.versionAliases = { } + +browserslist.clearCaches = env.clearCaches +browserslist.parseConfig = env.parseConfig +browserslist.readConfig = env.readConfig +browserslist.findConfig = env.findConfig +browserslist.loadConfig = env.loadConfig + +/** + * Return browsers market coverage. + * + * @param {string[]} browsers Browsers names in Can I Use. + * @param {string|object} [stats="global"] Which statistics should be used. + * Country code or custom statistics. + * Pass `"my stats"` to load statistics + * from Browserslist files. + * + * @return {number} Total market coverage for all selected browsers. + * + * @example + * browserslist.coverage(browserslist('> 1% in US'), 'US') //=> 83.1 + */ +browserslist.coverage = function (browsers, stats) { + var data + if (typeof stats === 'undefined') { + data = browserslist.usage.global + } else if (stats === 'my stats') { + var opts = {} + opts.path = path.resolve ? path.resolve('.') : '.' + var customStats = env.getStat(opts) + if (!customStats) { + throw new BrowserslistError('Custom usage statistics was not provided') + } + data = {} + for (var browser in customStats) { + fillUsage(data, browser, customStats[browser]) + } + } else if (typeof stats === 'string') { + if (stats.length > 2) { + stats = stats.toLowerCase() + } else { + stats = stats.toUpperCase() + } + env.loadCountry(browserslist.usage, stats, browserslist.data) + data = browserslist.usage[stats] + } else { + if ('dataByBrowser' in stats) { + stats = stats.dataByBrowser + } + data = { } + for (var name in stats) { + for (var version in stats[name]) { + data[name + ' ' + version] = stats[name][version] + } + } + } + + return browsers.reduce(function (all, i) { + var usage = data[i] + if (usage === undefined) { + usage = data[i.replace(/ \S+$/, ' 0')] + } + return all + (usage || 0) + }, 0) +} + +var QUERIES = [ + { + regexp: /^last\s+(\d+)\s+major\s+versions?$/i, + select: function (context, versions) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context) + if (!data) return selected + var list = getMajorVersions(data.released, versions) + list = list.map(nameMapper(data.name)) + if (data.name === 'android') { + list = filterAndroid(list, versions, context) + } + return selected.concat(list) + }, []) + } + }, + { + regexp: /^last\s+(\d+)\s+versions?$/i, + select: function (context, versions) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context) + if (!data) return selected + var list = data.released.slice(-versions) + list = list.map(nameMapper(data.name)) + if (data.name === 'android') { + list = filterAndroid(list, versions, context) + } + return selected.concat(list) + }, []) + } + }, + { + regexp: /^last\s+(\d+)\s+electron\s+major\s+versions?$/i, + select: function (context, versions) { + var validVersions = getMajorVersions(Object.keys(e2c).reverse(), versions) + return validVersions.map(function (i) { + return 'chrome ' + e2c[i] + }) + } + }, + { + regexp: /^last\s+(\d+)\s+(\w+)\s+major\s+versions?$/i, + select: function (context, versions, name) { + var data = checkName(name, context) + var validVersions = getMajorVersions(data.released, versions) + var list = validVersions.map(nameMapper(data.name)) + if (data.name === 'android') { + list = filterAndroid(list, versions, context) + } + return list + } + }, + { + regexp: /^last\s+(\d+)\s+electron\s+versions?$/i, + select: function (context, versions) { + return Object.keys(e2c).reverse().slice(-versions).map(function (i) { + return 'chrome ' + e2c[i] + }) + } + }, + { + regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i, + select: function (context, versions, name) { + var data = checkName(name, context) + var list = data.released.slice(-versions).map(nameMapper(data.name)) + if (data.name === 'android') { + list = filterAndroid(list, versions, context) + } + return list + } + }, + { + regexp: /^unreleased\s+versions$/i, + select: function (context) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context) + if (!data) return selected + var list = data.versions.filter(function (v) { + return data.released.indexOf(v) === -1 + }) + list = list.map(nameMapper(data.name)) + return selected.concat(list) + }, []) + } + }, + { + regexp: /^unreleased\s+electron\s+versions?$/i, + select: function () { + return [] + } + }, + { + regexp: /^unreleased\s+(\w+)\s+versions?$/i, + select: function (context, name) { + var data = checkName(name, context) + return data.versions.filter(function (v) { + return data.released.indexOf(v) === -1 + }).map(nameMapper(data.name)) + } + }, + { + regexp: /^last\s+(\d*.?\d+)\s+years?$/i, + select: function (context, years) { + return filterByYear(Date.now() - YEAR * years, context) + } + }, + { + regexp: /^since (\d+)(?:-(\d+))?(?:-(\d+))?$/i, + select: function (context, year, month, date) { + year = parseInt(year) + month = parseInt(month || '01') - 1 + date = parseInt(date || '01') + return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context) + } + }, + { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%$/, + select: function (context, sign, popularity) { + popularity = parseFloat(popularity) + var usage = browserslist.usage.global + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version) + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version) + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version) + } + } else if (usage[version] >= popularity) { + result.push(version) + } + return result + }, []) + } + }, + { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+my\s+stats$/, + select: function (context, sign, popularity) { + popularity = parseFloat(popularity) + if (!context.customUsage) { + throw new BrowserslistError('Custom usage statistics was not provided') + } + var usage = context.customUsage + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version) + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version) + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version) + } + } else if (usage[version] >= popularity) { + result.push(version) + } + return result + }, []) + } + }, + { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+(\S+)\s+stats$/, + select: function (context, sign, popularity, name) { + popularity = parseFloat(popularity) + var stats = env.loadStat(context, name, browserslist.data) + if (stats) { + context.customUsage = { } + for (var browser in stats) { + fillUsage(context.customUsage, browser, stats[browser]) + } + } + if (!context.customUsage) { + throw new BrowserslistError('Custom usage statistics was not provided') + } + var usage = context.customUsage + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version) + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version) + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version) + } + } else if (usage[version] >= popularity) { + result.push(version) + } + return result + }, []) + } + }, + { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+((alt-)?\w\w)$/, + select: function (context, sign, popularity, place) { + popularity = parseFloat(popularity) + if (place.length === 2) { + place = place.toUpperCase() + } else { + place = place.toLowerCase() + } + env.loadCountry(browserslist.usage, place, browserslist.data) + var usage = browserslist.usage[place] + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version) + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version) + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version) + } + } else if (usage[version] >= popularity) { + result.push(version) + } + return result + }, []) + } + }, + { + regexp: /^cover\s+(\d*\.?\d+)%(\s+in\s+(my\s+stats|(alt-)?\w\w))?$/, + select: function (context, coverage, statMode) { + coverage = parseFloat(coverage) + var usage = browserslist.usage.global + if (statMode) { + if (statMode.match(/^\s+in\s+my\s+stats$/)) { + if (!context.customUsage) { + throw new BrowserslistError( + 'Custom usage statistics was not provided' + ) + } + usage = context.customUsage + } else { + var match = statMode.match(/\s+in\s+((alt-)?\w\w)/) + var place = match[1] + if (place.length === 2) { + place = place.toUpperCase() + } else { + place = place.toLowerCase() + } + env.loadCountry(browserslist.usage, place, browserslist.data) + usage = browserslist.usage[place] + } + } + var versions = Object.keys(usage).sort(function (a, b) { + return usage[b] - usage[a] + }) + var coveraged = 0 + var result = [] + var version + for (var i = 0; i <= versions.length; i++) { + version = versions[i] + if (usage[version] === 0) break + coveraged += usage[version] + result.push(version) + if (coveraged >= coverage) break + } + return result + } + }, + { + regexp: /^electron\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function (context, from, to) { + var fromToUse = normalizeElectron(from) + var toToUse = normalizeElectron(to) + if (!e2c[fromToUse]) { + throw new BrowserslistError('Unknown version ' + from + ' of electron') + } + if (!e2c[toToUse]) { + throw new BrowserslistError('Unknown version ' + to + ' of electron') + } + from = parseFloat(from) + to = parseFloat(to) + return Object.keys(e2c).filter(function (i) { + var parsed = parseFloat(i) + return parsed >= from && parsed <= to + }).map(function (i) { + return 'chrome ' + e2c[i] + }) + } + }, + { + regexp: /^node\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function (context, from, to) { + var nodeVersions = jsReleases.filter(function (i) { + return i.name === 'nodejs' + }).map(function (i) { + return i.version + }) + var semverRegExp = /^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,2}$/ + if (!semverRegExp.test(from)) { + throw new BrowserslistError( + 'Unknown version ' + from + ' of Node.js') + } + if (!semverRegExp.test(to)) { + throw new BrowserslistError( + 'Unknown version ' + to + ' of Node.js') + } + return nodeVersions + .filter(semverFilterLoose('>=', from)) + .filter(semverFilterLoose('<=', to)) + .map(function (v) { + return 'node ' + v + }) + } + }, + { + regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function (context, name, from, to) { + var data = checkName(name, context) + from = parseFloat(normalizeVersion(data, from) || from) + to = parseFloat(normalizeVersion(data, to) || to) + function filter (v) { + var parsed = parseFloat(v) + return parsed >= from && parsed <= to + } + return data.released.filter(filter).map(nameMapper(data.name)) + } + }, + { + regexp: /^electron\s*(>=?|<=?)\s*([\d.]+)$/i, + select: function (context, sign, version) { + var versionToUse = normalizeElectron(version) + return Object.keys(e2c) + .filter(generateFilter(sign, versionToUse)) + .map(function (i) { + return 'chrome ' + e2c[i] + }) + } + }, + { + regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/i, + select: function (context, sign, version) { + var nodeVersions = jsReleases.filter(function (i) { + return i.name === 'nodejs' + }).map(function (i) { + return i.version + }) + return nodeVersions + .filter(generateSemverFilter(sign, version)) + .map(function (v) { + return 'node ' + v + }) + } + }, + { + regexp: /^(\w+)\s*(>=?|<=?)\s*([\d.]+)$/, + select: function (context, name, sign, version) { + var data = checkName(name, context) + var alias = browserslist.versionAliases[data.name][version] + if (alias) { + version = alias + } + return data.released + .filter(generateFilter(sign, version)) + .map(function (v) { + return data.name + ' ' + v + }) + } + }, + { + regexp: /^(firefox|ff|fx)\s+esr$/i, + select: function () { + return ['firefox 68'] + } + }, + { + regexp: /(operamini|op_mini)\s+all/i, + select: function () { + return ['op_mini all'] + } + }, + { + regexp: /^electron\s+([\d.]+)$/i, + select: function (context, version) { + var versionToUse = normalizeElectron(version) + var chrome = e2c[versionToUse] + if (!chrome) { + throw new BrowserslistError( + 'Unknown version ' + version + ' of electron') + } + return ['chrome ' + chrome] + } + }, + { + regexp: /^node\s+(\d+(\.\d+)?(\.\d+)?)$/i, + select: function (context, version) { + var nodeReleases = jsReleases.filter(function (i) { + return i.name === 'nodejs' + }) + var matched = nodeReleases.filter(function (i) { + return isVersionsMatch(i.version, version) + }) + if (matched.length === 0) { + if (context.ignoreUnknownVersions) { + return [] + } else { + throw new BrowserslistError( + 'Unknown version ' + version + ' of Node.js') + } + } + return ['node ' + matched[matched.length - 1].version] + } + }, + { + regexp: /^current\s+node$/i, + select: function (context) { + return [env.currentNode(resolve, context)] + } + }, + { + regexp: /^maintained\s+node\s+versions$/i, + select: function (context) { + var now = Date.now() + var queries = Object.keys(jsEOL).filter(function (key) { + return now < Date.parse(jsEOL[key].end) && + now > Date.parse(jsEOL[key].start) && + isEolReleased(key) + }).map(function (key) { + return 'node ' + key.slice(1) + }) + return resolve(queries, context) + } + }, + { + regexp: /^phantomjs\s+1.9$/i, + select: function () { + return ['safari 5'] + } + }, + { + regexp: /^phantomjs\s+2.1$/i, + select: function () { + return ['safari 6'] + } + }, + { + regexp: /^(\w+)\s+(tp|[\d.]+)$/i, + select: function (context, name, version) { + if (/^tp$/i.test(version)) version = 'TP' + var data = checkName(name, context) + var alias = normalizeVersion(data, version) + if (alias) { + version = alias + } else { + if (version.indexOf('.') === -1) { + alias = version + '.0' + } else { + alias = version.replace(/\.0$/, '') + } + alias = normalizeVersion(data, alias) + if (alias) { + version = alias + } else if (context.ignoreUnknownVersions) { + return [] + } else { + throw new BrowserslistError( + 'Unknown version ' + version + ' of ' + name) + } + } + return [data.name + ' ' + version] + } + }, + { + regexp: /^extends (.+)$/i, + select: function (context, name) { + return resolve(env.loadQueries(context, name), context) + } + }, + { + regexp: /^defaults$/i, + select: function (context) { + return resolve(browserslist.defaults, context) + } + }, + { + regexp: /^dead$/i, + select: function (context) { + var dead = [ + 'ie <= 10', + 'ie_mob <= 11', + 'bb <= 10', + 'op_mob <= 12.1', + 'samsung 4' + ] + return resolve(dead, context) + } + }, + { + regexp: /^(\w+)$/i, + select: function (context, name) { + if (byName(name, context)) { + throw new BrowserslistError( + 'Specify versions in Browserslist query for browser ' + name) + } else { + throw unknownQuery(name) + } + } + } +]; + +// Get and convert Can I Use data + +(function () { + for (var name in agents) { + var browser = agents[name] + browserslist.data[name] = { + name: name, + versions: normalize(agents[name].versions), + released: normalize(agents[name].versions.slice(0, -3)), + releaseDate: agents[name].release_date + } + fillUsage(browserslist.usage.global, name, browser.usage_global) + + browserslist.versionAliases[name] = { } + for (var i = 0; i < browser.versions.length; i++) { + var full = browser.versions[i] + if (!full) continue + + if (full.indexOf('-') !== -1) { + var interval = full.split('-') + for (var j = 0; j < interval.length; j++) { + browserslist.versionAliases[name][interval[j]] = full + } + } + } + } +}()) + +module.exports = browserslist diff --git a/website/www/node_modules/browserslist/node.js b/website/www/node_modules/browserslist/node.js new file mode 100644 index 000000000000..5919819747bb --- /dev/null +++ b/website/www/node_modules/browserslist/node.js @@ -0,0 +1,361 @@ +var region = require('caniuse-lite/dist/unpacker/region').default +var path = require('path') +var fs = require('fs') + +var BrowserslistError = require('./error') + +var IS_SECTION = /^\s*\[(.+)]\s*$/ +var CONFIG_PATTERN = /^browserslist-config-/ +var SCOPED_CONFIG__PATTERN = /@[^/]+\/browserslist-config(-|$|\/)/ +var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000 +var FORMAT = 'Browserslist config should be a string or an array ' + + 'of strings with browser queries' + +var dataTimeChecked = false +var filenessCache = { } +var configCache = { } +function checkExtend (name) { + var use = ' Use `dangerousExtend` option to disable.' + if (!CONFIG_PATTERN.test(name) && !SCOPED_CONFIG__PATTERN.test(name)) { + throw new BrowserslistError( + 'Browserslist config needs `browserslist-config-` prefix. ' + use) + } + if (name.replace(/^@[^/]+\//, '').indexOf('.') !== -1) { + throw new BrowserslistError( + '`.` not allowed in Browserslist config name. ' + use) + } + if (name.indexOf('node_modules') !== -1) { + throw new BrowserslistError( + '`node_modules` not allowed in Browserslist config.' + use) + } +} + +function isFile (file) { + if (file in filenessCache) { + return filenessCache[file] + } + var result = fs.existsSync(file) && fs.statSync(file).isFile() + if (!process.env.BROWSERSLIST_DISABLE_CACHE) { + filenessCache[file] = result + } + return result +} + +function eachParent (file, callback) { + var dir = isFile(file) ? path.dirname(file) : file + var loc = path.resolve(dir) + do { + var result = callback(loc) + if (typeof result !== 'undefined') return result + } while (loc !== (loc = path.dirname(loc))) + return undefined +} + +function check (section) { + if (Array.isArray(section)) { + for (var i = 0; i < section.length; i++) { + if (typeof section[i] !== 'string') { + throw new BrowserslistError(FORMAT) + } + } + } else if (typeof section !== 'string') { + throw new BrowserslistError(FORMAT) + } +} + +function pickEnv (config, opts) { + if (typeof config !== 'object') return config + + var name + if (typeof opts.env === 'string') { + name = opts.env + } else if (process.env.BROWSERSLIST_ENV) { + name = process.env.BROWSERSLIST_ENV + } else if (process.env.NODE_ENV) { + name = process.env.NODE_ENV + } else { + name = 'production' + } + + return config[name] || config.defaults +} + +function parsePackage (file) { + var config = JSON.parse(fs.readFileSync(file)) + if (config.browserlist && !config.browserslist) { + throw new BrowserslistError( + '`browserlist` key instead of `browserslist` in ' + file + ) + } + var list = config.browserslist + if (Array.isArray(list) || typeof list === 'string') { + list = { defaults: list } + } + for (var i in list) { + check(list[i]) + } + + return list +} + +function latestReleaseTime (agents) { + var latest = 0 + for (var name in agents) { + var dates = agents[name].releaseDate || { } + for (var key in dates) { + if (latest < dates[key]) { + latest = dates[key] + } + } + } + return latest * 1000 +} + +function normalizeStats (data, stats) { + if (stats && 'dataByBrowser' in stats) { + stats = stats.dataByBrowser + } + + if (typeof stats !== 'object') return undefined + + var normalized = { } + for (var i in stats) { + var versions = Object.keys(stats[i]) + if ( + versions.length === 1 && + data[i] && + data[i].versions.length === 1 + ) { + var normal = Object.keys(data[i].versions)[0] + normalized[i] = { } + normalized[i][normal] = stats[i][versions[0]] + } else { + normalized[i] = stats[i] + } + } + + return normalized +} + +function normalizeUsageData (usageData, data) { + for (var browser in usageData) { + var browserUsage = usageData[browser] + // eslint-disable-next-line max-len + // https://github.com/browserslist/browserslist/issues/431#issuecomment-565230615 + // caniuse-db returns { 0: "percentage" } for `and_*` regional stats + if ('0' in browserUsage) { + var versions = data[browser].versions + browserUsage[versions[versions.length - 1]] = browserUsage[0] + delete browserUsage[0] + } + } +} + +module.exports = { + loadQueries: function loadQueries (context, name) { + if (!context.dangerousExtend) checkExtend(name) + // eslint-disable-next-line security/detect-non-literal-require + var queries = require(require.resolve(name, { paths: ['.'] })) + if (queries) { + if (Array.isArray(queries)) { + return queries + } else if (typeof queries === 'object') { + if (!queries.defaults) queries.defaults = [] + return pickEnv(queries, context, name) + } + } + throw new BrowserslistError( + '`' + name + '` config exports not an array of queries' + + ' or an object of envs' + ) + }, + + loadStat: function loadStat (context, name, data) { + if (!context.dangerousExtend) checkExtend(name) + // eslint-disable-next-line security/detect-non-literal-require + var stats = require( + require.resolve( + path.join(name, 'browserslist-stats.json'), + { paths: ['.'] } + ) + ) + return normalizeStats(data, stats) + }, + + getStat: function getStat (opts, data) { + var stats + if (opts.stats) { + stats = opts.stats + } else if (process.env.BROWSERSLIST_STATS) { + stats = process.env.BROWSERSLIST_STATS + } else if (opts.path && path.resolve && fs.existsSync) { + stats = eachParent(opts.path, function (dir) { + var file = path.join(dir, 'browserslist-stats.json') + return isFile(file) ? file : undefined + }) + } + if (typeof stats === 'string') { + try { + stats = JSON.parse(fs.readFileSync(stats)) + } catch (e) { + throw new BrowserslistError('Can\'t read ' + stats) + } + } + return normalizeStats(data, stats) + }, + + loadConfig: function loadConfig (opts) { + if (process.env.BROWSERSLIST) { + return process.env.BROWSERSLIST + } else if (opts.config || process.env.BROWSERSLIST_CONFIG) { + var file = opts.config || process.env.BROWSERSLIST_CONFIG + if (path.basename(file) === 'package.json') { + return pickEnv(parsePackage(file), opts) + } else { + return pickEnv(module.exports.readConfig(file), opts) + } + } else if (opts.path) { + return pickEnv(module.exports.findConfig(opts.path), opts) + } else { + return undefined + } + }, + + loadCountry: function loadCountry (usage, country, data) { + var code = country.replace(/[^\w-]/g, '') + if (!usage[code]) { + // eslint-disable-next-line security/detect-non-literal-require + var compressed = require('caniuse-lite/data/regions/' + code + '.js') + var usageData = region(compressed) + normalizeUsageData(usageData, data) + usage[country] = { } + for (var i in usageData) { + for (var j in usageData[i]) { + usage[country][i + ' ' + j] = usageData[i][j] + } + } + } + }, + + parseConfig: function parseConfig (string) { + var result = { defaults: [] } + var sections = ['defaults'] + + string.toString() + .replace(/#[^\n]*/g, '') + .split(/\n|,/) + .map(function (line) { + return line.trim() + }) + .filter(function (line) { + return line !== '' + }) + .forEach(function (line) { + if (IS_SECTION.test(line)) { + sections = line.match(IS_SECTION)[1].trim().split(' ') + sections.forEach(function (section) { + if (result[section]) { + throw new BrowserslistError( + 'Duplicate section ' + section + ' in Browserslist config' + ) + } + result[section] = [] + }) + } else { + sections.forEach(function (section) { + result[section].push(line) + }) + } + }) + + return result + }, + + readConfig: function readConfig (file) { + if (!isFile(file)) { + throw new BrowserslistError('Can\'t read ' + file + ' config') + } + return module.exports.parseConfig(fs.readFileSync(file)) + }, + + findConfig: function findConfig (from) { + from = path.resolve(from) + + var passed = [] + var resolved = eachParent(from, function (dir) { + if (dir in configCache) { + return configCache[dir] + } + + passed.push(dir) + + var config = path.join(dir, 'browserslist') + var pkg = path.join(dir, 'package.json') + var rc = path.join(dir, '.browserslistrc') + + var pkgBrowserslist + if (isFile(pkg)) { + try { + pkgBrowserslist = parsePackage(pkg) + } catch (e) { + if (e.name === 'BrowserslistError') throw e + console.warn( + '[Browserslist] Could not parse ' + pkg + '. Ignoring it.' + ) + } + } + + if (isFile(config) && pkgBrowserslist) { + throw new BrowserslistError( + dir + ' contains both browserslist and package.json with browsers' + ) + } else if (isFile(rc) && pkgBrowserslist) { + throw new BrowserslistError( + dir + ' contains both .browserslistrc and package.json with browsers' + ) + } else if (isFile(config) && isFile(rc)) { + throw new BrowserslistError( + dir + ' contains both .browserslistrc and browserslist' + ) + } else if (isFile(config)) { + return module.exports.readConfig(config) + } else if (isFile(rc)) { + return module.exports.readConfig(rc) + } else { + return pkgBrowserslist + } + }) + if (!process.env.BROWSERSLIST_DISABLE_CACHE) { + passed.forEach(function (dir) { + configCache[dir] = resolved + }) + } + return resolved + }, + + clearCaches: function clearCaches () { + dataTimeChecked = false + filenessCache = { } + configCache = { } + }, + + oldDataWarning: function oldDataWarning (agentsObj) { + if (dataTimeChecked) return + dataTimeChecked = true + if (process.env.BROWSERSLIST_IGNORE_OLD_DATA) return + + var latest = latestReleaseTime(agentsObj) + var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE + + if (latest !== 0 && latest < halfYearAgo) { + console.warn( + 'Browserslist: caniuse-lite is outdated. Please run:\n' + + 'npx browserslist@latest --update-db' + ) + } + }, + + currentNode: function currentNode () { + return 'node ' + process.versions.node + } +} diff --git a/website/www/node_modules/browserslist/package.json b/website/www/node_modules/browserslist/package.json new file mode 100644 index 000000000000..cd027d2cab44 --- /dev/null +++ b/website/www/node_modules/browserslist/package.json @@ -0,0 +1,28 @@ +{ + "name": "browserslist", + "version": "4.12.0", + "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset", + "keywords": [ + "caniuse", + "browsers", + "target" + ], + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + "author": "Andrey Sitnik ", + "license": "MIT", + "repository": "browserslist/browserslist", + "dependencies": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + }, + "bin": "./cli.js", + "browser": { + "./node.js": "./browser.js", + "path": false + } +} diff --git a/website/www/node_modules/browserslist/update-db.js b/website/www/node_modules/browserslist/update-db.js new file mode 100644 index 000000000000..9b2193e84fd9 --- /dev/null +++ b/website/www/node_modules/browserslist/update-db.js @@ -0,0 +1,134 @@ +var childProcess = require('child_process') +var pkgUp = require('pkg-up') +var path = require('path') +var fs = require('fs') + +var BrowserslistError = require('./error') + +function detectLockfile () { + var packagePath = pkgUp.sync() + if (!packagePath) { + throw new BrowserslistError( + 'Cannot find package.json. ' + + 'Is it a right project to run npx browserslist --update-db?' + ) + } + + var rootDir = path.dirname(packagePath) + var lockfileNpm = path.join(rootDir, 'package-lock.json') + var lockfileYarn = path.join(rootDir, 'yarn.lock') + var lockfilePnpm = path.join(rootDir, 'pnpm-lock.yaml') + + /* istanbul ignore next */ + if (fs.existsSync(lockfilePnpm)) { + return { mode: 'pnpm', file: lockfilePnpm } + } else if (fs.existsSync(lockfileNpm)) { + return { mode: 'npm', file: lockfileNpm } + } else if (fs.existsSync(lockfileYarn)) { + return { mode: 'yarn', file: lockfileYarn } + } else { + throw new BrowserslistError( + 'No lockfile found. Run "npm install", "yarn install" or "pnpm install"' + ) + } +} + +function getCurrentVersion (lock) { + var match + /* istanbul ignore if */ + if (lock.mode === 'pnpm') { + match = /\/caniuse-lite\/([^:]+):/.exec(lock.content) + if (match[1]) return match[1] + } else if (lock.mode === 'npm') { + var dependencies = JSON.parse(lock.content).dependencies + if (dependencies && dependencies['caniuse-lite']) { + return dependencies['caniuse-lite'].version + } + } else if (lock.mode === 'yarn') { + match = /caniuse-lite@[^:]+:\n\s+version\s+"([^"]+)"/.exec(lock.content) + if (match[1]) return match[1] + } + return null +} + +function getLastestInfo () { + return JSON.parse( + childProcess.execSync('npm show caniuse-lite --json').toString() + ) +} + +function updateLockfile (lock, latest) { + if (lock.mode === 'npm') { + var fixed = deletePackage(JSON.parse(lock.content)) + return JSON.stringify(fixed, null, ' ') + } else { + var lines = lock.content.split('\n') + var i + /* istanbul ignore if */ + if (lock.mode === 'pnpm') { + for (i = 0; i < lines.length; i++) { + if (lines[i].indexOf('caniuse-lite:') >= 0) { + lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version) + } else if (lines[i].indexOf('/caniuse-lite') >= 0) { + lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':') + for (i = i + 1; i < lines.length; i++) { + if (lines[i].indexOf('integrity: ') !== -1) { + lines[i] = lines[i].replace( + /integrity: .+/, 'integrity: ' + latest.dist.integrity + ) + } else if (lines[i].indexOf(' /') !== -1) { + break + } + } + } + } + } else if (lock.mode === 'yarn') { + for (i = 0; i < lines.length; i++) { + if (lines[i].indexOf('caniuse-lite@') !== -1) { + lines[i + 1] = lines[i + 1].replace( + /version "[^"]+"/, 'version "' + latest.version + '"' + ) + lines[i + 2] = lines[i + 2].replace( + /resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"' + ) + lines[i + 3] = lines[i + 3].replace( + /integrity .+/, 'integrity ' + latest.dist.integrity + ) + i += 4 + } + } + } + return lines.join('\n') + } +} + +function deletePackage (node) { + if (node.dependencies) { + delete node.dependencies['caniuse-lite'] + for (var i in node.dependencies) { + node.dependencies[i] = deletePackage(node.dependencies[i]) + } + } + return node +} + +module.exports = function updateDB (print) { + var lock = detectLockfile() + lock.content = fs.readFileSync(lock.file).toString() + + var current = getCurrentVersion(lock) + var latest = getLastestInfo() + + if (typeof current === 'string') { + print('Current version: ' + current + '\n') + } + print( + 'New version: ' + latest.version + '\n' + + 'Updating caniuse-lite…\n' + ) + + fs.writeFileSync(lock.file, updateLockfile(lock, latest)) + childProcess.execSync(lock.mode + ' install') + + print('caniuse-lite has been successfully updated') +} diff --git a/website/www/node_modules/caller-callsite/index.js b/website/www/node_modules/caller-callsite/index.js new file mode 100644 index 000000000000..ba201226764c --- /dev/null +++ b/website/www/node_modules/caller-callsite/index.js @@ -0,0 +1,18 @@ +'use strict'; +const callsites = require('callsites'); + +module.exports = () => { + const c = callsites(); + let caller; + + for (let i = 0; i < c.length; i++) { + const hasReceiver = c[i].getTypeName() !== null; + + if (hasReceiver) { + caller = i; + break; + } + } + + return c[caller]; +}; diff --git a/website/www/node_modules/caller-callsite/license b/website/www/node_modules/caller-callsite/license new file mode 100644 index 000000000000..654d0bfe9434 --- /dev/null +++ b/website/www/node_modules/caller-callsite/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/website/www/node_modules/caller-callsite/package.json b/website/www/node_modules/caller-callsite/package.json new file mode 100644 index 000000000000..b477f25d737d --- /dev/null +++ b/website/www/node_modules/caller-callsite/package.json @@ -0,0 +1,44 @@ +{ + "name": "caller-callsite", + "version": "2.0.0", + "description": "Get the callsite of the caller function", + "license": "MIT", + "repository": "sindresorhus/caller-callsite", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "caller", + "calling", + "module", + "parent", + "callsites", + "callsite", + "stacktrace", + "stack", + "trace", + "function", + "file" + ], + "dependencies": { + "callsites": "^2.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "xo": { + "esnext": true + } +} diff --git a/website/www/node_modules/caller-callsite/readme.md b/website/www/node_modules/caller-callsite/readme.md new file mode 100644 index 000000000000..900846790f2f --- /dev/null +++ b/website/www/node_modules/caller-callsite/readme.md @@ -0,0 +1,41 @@ +# caller-callsite [![Build Status](https://travis-ci.org/sindresorhus/caller-callsite.svg?branch=master)](https://travis-ci.org/sindresorhus/caller-callsite) + +> Get the [callsite](https://github.com/sindresorhus/callsites#api) of the caller function + + +## Install + +``` +$ npm install --save caller-callsite +``` + + +## Usage + +```js +// foo.js +const callerCallsite = require('caller-callsite'); + +module.exports = () => { + console.log(callerCallsite().getFileName()); + //=> '/Users/sindresorhus/dev/unicorn/bar.js' +} +``` + +```js +// bar.js +const foo = require('./foo'); +foo(); +``` + + +## API + +### callerCallsite() + +Returns a [`callsite`](https://github.com/sindresorhus/callsites#api) object. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/website/www/node_modules/caller-path/index.js b/website/www/node_modules/caller-path/index.js new file mode 100644 index 000000000000..e5900f036b11 --- /dev/null +++ b/website/www/node_modules/caller-path/index.js @@ -0,0 +1,4 @@ +'use strict'; +const callerCallsite = require('caller-callsite'); + +module.exports = () => callerCallsite().getFileName(); diff --git a/website/www/node_modules/caller-path/license b/website/www/node_modules/caller-path/license new file mode 100644 index 000000000000..654d0bfe9434 --- /dev/null +++ b/website/www/node_modules/caller-path/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/website/www/node_modules/caller-path/package.json b/website/www/node_modules/caller-path/package.json new file mode 100644 index 000000000000..bc61fec99c2a --- /dev/null +++ b/website/www/node_modules/caller-path/package.json @@ -0,0 +1,45 @@ +{ + "name": "caller-path", + "version": "2.0.0", + "description": "Get the path of the caller function", + "license": "MIT", + "repository": "sindresorhus/caller-path", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "caller", + "calling", + "module", + "path", + "parent", + "callsites", + "callsite", + "stacktrace", + "stack", + "trace", + "function", + "file" + ], + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "xo": { + "esnext": true + } +} diff --git a/website/www/node_modules/caller-path/readme.md b/website/www/node_modules/caller-path/readme.md new file mode 100644 index 000000000000..59aac48d5261 --- /dev/null +++ b/website/www/node_modules/caller-path/readme.md @@ -0,0 +1,34 @@ +# caller-path [![Build Status](https://travis-ci.org/sindresorhus/caller-path.svg?branch=master)](https://travis-ci.org/sindresorhus/caller-path) + +> Get the path of the caller function + + +## Install + +``` +$ npm install --save caller-path +``` + + +## Usage + +```js +// foo.js +const callerPath = require('caller-path'); + +module.exports = () => { + console.log(callerPath()); + //=> '/Users/sindresorhus/dev/unicorn/bar.js' +} +``` + +```js +// bar.js +const foo = require('./foo'); +foo(); +``` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/website/www/node_modules/callsites/index.js b/website/www/node_modules/callsites/index.js new file mode 100644 index 000000000000..f4840838e6bb --- /dev/null +++ b/website/www/node_modules/callsites/index.js @@ -0,0 +1,8 @@ +'use strict'; +module.exports = () => { + const _ = Error.prepareStackTrace; + Error.prepareStackTrace = (_, stack) => stack; + const stack = new Error().stack.slice(1); + Error.prepareStackTrace = _; + return stack; +}; diff --git a/website/www/node_modules/callsites/license b/website/www/node_modules/callsites/license new file mode 100644 index 000000000000..654d0bfe9434 --- /dev/null +++ b/website/www/node_modules/callsites/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/website/www/node_modules/callsites/package.json b/website/www/node_modules/callsites/package.json new file mode 100644 index 000000000000..9f978549d8e3 --- /dev/null +++ b/website/www/node_modules/callsites/package.json @@ -0,0 +1,40 @@ +{ + "name": "callsites", + "version": "2.0.0", + "description": "Get callsites from the V8 stack trace API", + "license": "MIT", + "repository": "sindresorhus/callsites", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "stacktrace", + "v8", + "callsite", + "callsites", + "stack", + "trace", + "function", + "file", + "line", + "debug" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "xo": { + "esnext": true + } +} diff --git a/website/www/node_modules/callsites/readme.md b/website/www/node_modules/callsites/readme.md new file mode 100644 index 000000000000..7a5fccde8ecd --- /dev/null +++ b/website/www/node_modules/callsites/readme.md @@ -0,0 +1,46 @@ +# callsites [![Build Status](https://travis-ci.org/sindresorhus/callsites.svg?branch=master)](https://travis-ci.org/sindresorhus/callsites) + +> Get callsites from the [V8 stack trace API](https://github.com/v8/v8/wiki/Stack-Trace-API) + + +## Install + +``` +$ npm install --save callsites +``` + + +## Usage + +```js +const callsites = require('callsites'); + +function unicorn() { + console.log(callsites()[0].getFileName()); + //=> '/Users/sindresorhus/dev/callsites/test.js' +} + +unicorn(); +``` + + +## API + +Returns an array of callsite objects with the following methods: + +- `getTypeName`: returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property. +- `getFunctionName`: returns the name of the current function, typically its name property. If a name property is not available an attempt will be made to try to infer a name from the function's context. +- `getMethodName`: returns the name of the property of this or one of its prototypes that holds the current function +- `getFileName`: if this function was defined in a script returns the name of the script +- `getLineNumber`: if this function was defined in a script returns the current line number +- `getColumnNumber`: if this function was defined in a script returns the current column number +- `getEvalOrigin`: if this function was created using a call to eval returns a CallSite object representing the location where eval was called +- `isToplevel`: is this a top-level invocation, that is, is this the global object? +- `isEval`: does this call take place in code defined by a call to eval? +- `isNative`: is this call in native V8 code? +- `isConstructor`: is this a constructor call? + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/website/www/node_modules/camelcase/index.d.ts b/website/www/node_modules/camelcase/index.d.ts new file mode 100644 index 000000000000..58f2069adc52 --- /dev/null +++ b/website/www/node_modules/camelcase/index.d.ts @@ -0,0 +1,63 @@ +declare namespace camelcase { + interface Options { + /** + Uppercase the first character: `foo-bar` → `FooBar`. + + @default false + */ + readonly pascalCase?: boolean; + } +} + +declare const camelcase: { + /** + Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`. + + @param input - String to convert to camel case. + + @example + ``` + import camelCase = require('camelcase'); + + camelCase('foo-bar'); + //=> 'fooBar' + + camelCase('foo_bar'); + //=> 'fooBar' + + camelCase('Foo-Bar'); + //=> 'fooBar' + + camelCase('Foo-Bar', {pascalCase: true}); + //=> 'FooBar' + + camelCase('--foo.bar', {pascalCase: false}); + //=> 'fooBar' + + camelCase('foo bar'); + //=> 'fooBar' + + console.log(process.argv[3]); + //=> '--foo-bar' + camelCase(process.argv[3]); + //=> 'fooBar' + + camelCase(['foo', 'bar']); + //=> 'fooBar' + + camelCase(['__foo__', '--bar'], {pascalCase: true}); + //=> 'FooBar' + ``` + */ + (input: string | ReadonlyArray, options?: camelcase.Options): string; + + // TODO: Remove this for the next major release, refactor the whole definition to: + // declare function camelcase( + // input: string | ReadonlyArray, + // options?: camelcase.Options + // ): string; + // export = camelcase; + default: typeof camelcase; +}; + +export = camelcase; diff --git a/website/www/node_modules/camelcase/index.js b/website/www/node_modules/camelcase/index.js new file mode 100644 index 000000000000..579f99b47f77 --- /dev/null +++ b/website/www/node_modules/camelcase/index.js @@ -0,0 +1,76 @@ +'use strict'; + +const preserveCamelCase = string => { + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + + for (let i = 0; i < string.length; i++) { + const character = string[i]; + + if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) { + string = string.slice(0, i) + '-' + string.slice(i); + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i++; + } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) { + string = string.slice(0, i - 1) + '-' + string.slice(i - 1); + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character; + } + } + + return string; +}; + +const camelCase = (input, options) => { + if (!(typeof input === 'string' || Array.isArray(input))) { + throw new TypeError('Expected the input to be `string | string[]`'); + } + + options = Object.assign({ + pascalCase: false + }, options); + + const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x; + + if (Array.isArray(input)) { + input = input.map(x => x.trim()) + .filter(x => x.length) + .join('-'); + } else { + input = input.trim(); + } + + if (input.length === 0) { + return ''; + } + + if (input.length === 1) { + return options.pascalCase ? input.toUpperCase() : input.toLowerCase(); + } + + const hasUpperCase = input !== input.toLowerCase(); + + if (hasUpperCase) { + input = preserveCamelCase(input); + } + + input = input + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()) + .replace(/\d+(\w|$)/g, m => m.toUpperCase()); + + return postProcess(input); +}; + +module.exports = camelCase; +// TODO: Remove this for the next major release +module.exports.default = camelCase; diff --git a/website/www/node_modules/camelcase/license b/website/www/node_modules/camelcase/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/camelcase/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/camelcase/package.json b/website/www/node_modules/camelcase/package.json new file mode 100644 index 000000000000..fbdbaaa75651 --- /dev/null +++ b/website/www/node_modules/camelcase/package.json @@ -0,0 +1,43 @@ +{ + "name": "camelcase", + "version": "5.3.1", + "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`", + "license": "MIT", + "repository": "sindresorhus/camelcase", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "camelcase", + "camel-case", + "camel", + "case", + "dash", + "hyphen", + "dot", + "underscore", + "separator", + "string", + "text", + "convert", + "pascalcase", + "pascal-case" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.1", + "xo": "^0.24.0" + } +} diff --git a/website/www/node_modules/camelcase/readme.md b/website/www/node_modules/camelcase/readme.md new file mode 100644 index 000000000000..fde27261b2a8 --- /dev/null +++ b/website/www/node_modules/camelcase/readme.md @@ -0,0 +1,99 @@ +# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase) + +> Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar` + +--- + +
    + + Get professional support for 'camelcase' with a Tidelift subscription + +
    + + Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. +
    +
    + +--- + +## Install + +``` +$ npm install camelcase +``` + + +## Usage + +```js +const camelCase = require('camelcase'); + +camelCase('foo-bar'); +//=> 'fooBar' + +camelCase('foo_bar'); +//=> 'fooBar' + +camelCase('Foo-Bar'); +//=> 'fooBar' + +camelCase('Foo-Bar', {pascalCase: true}); +//=> 'FooBar' + +camelCase('--foo.bar', {pascalCase: false}); +//=> 'fooBar' + +camelCase('foo bar'); +//=> 'fooBar' + +console.log(process.argv[3]); +//=> '--foo-bar' +camelCase(process.argv[3]); +//=> 'fooBar' + +camelCase(['foo', 'bar']); +//=> 'fooBar' + +camelCase(['__foo__', '--bar'], {pascalCase: true}); +//=> 'FooBar' +``` + + +## API + +### camelCase(input, [options]) + +#### input + +Type: `string` `string[]` + +String to convert to camel case. + +#### options + +Type: `Object` + +##### pascalCase + +Type: `boolean`
    +Default: `false` + +Uppercase the first character: `foo-bar` → `FooBar` + + +## Security + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + + +## Related + +- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module +- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase +- [titleize](https://github.com/sindresorhus/titleize) - Capitalize every word in string +- [humanize-string](https://github.com/sindresorhus/humanize-string) - Convert a camelized/dasherized/underscored string into a humanized one + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/website/www/node_modules/caniuse-lite/CHANGELOG.md b/website/www/node_modules/caniuse-lite/CHANGELOG.md new file mode 100644 index 000000000000..c1b8d6af0e0a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/CHANGELOG.md @@ -0,0 +1,360 @@ +# 1.x releases + +The contents of this section have been generated automatically; each version +tracks the `caniuse-db` package at the same version. + +- **1.0.30001055** was released on May 11th, 2020 at 00:32. +- **1.0.30001054** was released on May 8th, 2020 at 03:32. +- **1.0.30001053** was released on May 7th, 2020 at 04:32. +- **1.0.30001052** was released on May 6th, 2020 at 00:32. +- **1.0.30001051** was released on May 5th, 2020 at 04:32. +- **1.0.30001050** was released on May 4th, 2020 at 04:32. +- **1.0.30001049** was released on May 4th, 2020 at 03:32. +- **1.0.30001048** was released on April 25th, 2020 at 17:32. +- **1.0.30001047** was released on April 25th, 2020 at 16:32. +- **1.0.30001046** was released on April 23rd, 2020 at 06:32. +- **1.0.30001045** was released on April 21st, 2020 at 06:32. +- **1.0.30001043** was released on April 19th, 2020 at 04:32. +- **1.0.30001042** was released on April 15th, 2020 at 04:32. +- **1.0.30001041** was released on April 13th, 2020 at 03:32. +- **1.0.30001040** was released on April 9th, 2020 at 05:32. +- **1.0.30001039** was released on April 4th, 2020 at 04:32. +- **1.0.30001038** was released on March 26th, 2020 at 05:32. +- **1.0.30001037** was released on March 25th, 2020 at 05:32. +- **1.0.30001036** was released on March 23rd, 2020 at 06:32. +- **1.0.30001035** was released on March 12th, 2020 at 06:32. +- **1.0.30001034** was released on March 12th, 2020 at 05:32. +- **1.0.30001033** was released on March 9th, 2020 at 05:32. +- **1.0.30001032** was released on March 5th, 2020 at 05:33. +- **1.0.30001031** was released on March 2nd, 2020 at 05:32. +- **1.0.30001030** was released on February 24th, 2020 at 07:32. +- **1.0.30001029** was released on February 24th, 2020 at 05:32. +- **1.0.30001028** was released on February 18th, 2020 at 05:32. +- **1.0.30001027** was released on February 10th, 2020 at 05:32. +- **1.0.30001026** was released on February 10th, 2020 at 04:32. +- **1.0.30001025** was released on February 4th, 2020 at 06:32. +- **1.0.30001024** was released on February 3rd, 2020 at 22:10. +- **1.0.30001023** was released on January 25th, 2020 at 07:32. +- **1.0.30001022** was released on January 21st, 2020 at 02:32. +- **1.0.30001021** was released on January 15th, 2020 at 05:32. +- **1.0.30001020** was released on January 9th, 2020 at 05:32. +- **1.0.30001019** was released on January 5th, 2020 at 01:32. +- **1.0.30001018** was released on January 3rd, 2020 at 23:32. +- **1.0.30001017** was released on December 27th, 2019 at 18:32. +- **1.0.30001016** was released on December 16th, 2019 at 06:32. +- **1.0.30001015** was released on December 4th, 2019 at 07:32. +- **1.0.30001013** was released on December 2nd, 2019 at 06:32. +- **1.0.30001012** was released on November 25th, 2019 at 06:32. +- **1.0.30001011** was released on November 20th, 2019 at 05:32. +- **1.0.30001010** was released on November 14th, 2019 at 07:32. +- **1.0.30001009** was released on November 13th, 2019 at 05:32. +- **1.0.30001008** was released on November 4th, 2019 at 06:32. +- **1.0.30001006** was released on October 30th, 2019 at 03:32. +- **1.0.30001005** was released on October 27th, 2019 at 05:32. +- **1.0.30001004** was released on October 24th, 2019 at 06:32. +- **1.0.30001002** was released on October 21st, 2019 at 06:32. +- **1.0.30001001** was released on October 21st, 2019 at 04:32. +- **1.0.30000999** was released on October 6th, 2019 at 00:32. +- **1.0.30000998** was released on October 2nd, 2019 at 06:32. +- **1.0.30000997** was released on September 24th, 2019 at 04:32. +- **1.0.30000996** was released on September 20th, 2019 at 05:32. +- **1.0.30000995** was released on September 16th, 2019 at 04:32. +- **1.0.30000994** was released on September 11th, 2019 at 05:32. +- **1.0.30000992** was released on September 5th, 2019 at 05:32. +- **1.0.30000990** was released on September 4th, 2019 at 05:32. +- **1.0.30000989** was released on August 6th, 2019 at 04:32. +- **1.0.30000988** was released on July 31st, 2019 at 03:32. +- **1.0.30000987** was released on July 30th, 2019 at 05:32. +- **1.0.30000986** was released on July 27th, 2019 at 05:32. +- **1.0.30000985** was released on July 21st, 2019 at 05:32. +- **1.0.30000984** was released on July 13th, 2019 at 05:32. +- **1.0.30000983** was released on July 10th, 2019 at 06:32. +- **1.0.30000981** was released on July 8th, 2019 at 06:32. +- **1.0.30000980** was released on July 5th, 2019 at 17:32. +- **1.0.30000979** was released on July 1st, 2019 at 06:32. +- **1.0.30000978** was released on June 26th, 2019 at 06:32. +- **1.0.30000977** was released on June 25th, 2019 at 06:32. +- **1.0.30000976** was released on June 21st, 2019 at 06:32. +- **1.0.30000975** was released on June 18th, 2019 at 06:32. +- **1.0.30000974** was released on June 6th, 2019 at 06:32. +- **1.0.30000973** was released on June 4th, 2019 at 06:32. +- **1.0.30000971** was released on May 22nd, 2019 at 04:32. +- **1.0.30000969** was released on May 16th, 2019 at 03:32. +- **1.0.30000967** was released on May 7th, 2019 at 05:32. +- **1.0.30000966** was released on May 3rd, 2019 at 05:32. +- **1.0.30000965** was released on May 3rd, 2019 at 04:32. +- **1.0.30000963** was released on April 24th, 2019 at 04:32. +- **1.0.30000962** was released on April 19th, 2019 at 04:32. +- **1.0.30000960** was released on April 16th, 2019 at 06:32. +- **1.0.30000959** was released on April 15th, 2019 at 03:32. +- **1.0.30000958** was released on April 14th, 2019 at 21:32. +- **1.0.30000957** was released on April 3rd, 2019 at 06:32. +- **1.0.30000956** was released on April 3rd, 2019 at 04:32. +- **1.0.30000955** was released on March 28th, 2019 at 06:32. +- **1.0.30000954** was released on March 27th, 2019 at 05:32. +- **1.0.30000953** was released on March 26th, 2019 at 05:32. +- **1.0.30000952** was released on March 26th, 2019 at 02:32. +- **1.0.30000951** was released on March 20th, 2019 at 04:32. +- **1.0.30000950** was released on March 17th, 2019 at 06:32. +- **1.0.30000949** was released on March 16th, 2019 at 03:32. +- **1.0.30000948** was released on March 15th, 2019 at 06:32. +- **1.0.30000947** was released on March 14th, 2019 at 05:32. +- **1.0.30000946** was released on March 13th, 2019 at 05:32. +- **1.0.30000945** was released on March 12th, 2019 at 06:32. +- **1.0.30000944** was released on March 12th, 2019 at 05:32. +- **1.0.30000943** was released on March 10th, 2019 at 03:32. +- **1.0.30000942** was released on March 7th, 2019 at 04:32. +- **1.0.30000941** was released on March 5th, 2019 at 04:32. +- **1.0.30000940** was released on March 3rd, 2019 at 20:32. +- **1.0.30000939** was released on February 23rd, 2019 at 04:32. +- **1.0.30000938** was released on February 15th, 2019 at 05:32. +- **1.0.30000937** was released on February 15th, 2019 at 04:32. +- **1.0.30000936** was released on February 11th, 2019 at 04:32. +- **1.0.30000935** was released on February 5th, 2019 at 05:32. +- **1.0.30000934** was released on February 3rd, 2019 at 07:32. +- **1.0.30000933** was released on January 31st, 2019 at 05:32. +- **1.0.30000932** was released on January 25th, 2019 at 07:32. +- **1.0.30000931** was released on January 25th, 2019 at 06:32. +- **1.0.30000930** was released on January 23rd, 2019 at 05:32. +- **1.0.30000929** was released on January 16th, 2019 at 05:32. +- **1.0.30000928** was released on January 10th, 2019 at 06:32. +- **1.0.30000927** was released on January 4th, 2019 at 03:32. +- **1.0.30000926** was released on January 2nd, 2019 at 02:32. +- **1.0.30000925** was released on December 28th, 2018 at 03:32. +- **1.0.30000923** was released on December 20th, 2018 at 00:32. +- **1.0.30000921** was released on December 14th, 2018 at 05:32. +- **1.0.30000919** was released on December 14th, 2018 at 04:32. +- **1.0.30000918** was released on December 10th, 2018 at 05:32. +- **1.0.30000917** was released on December 10th, 2018 at 01:32. +- **1.0.30000916** was released on December 6th, 2018 at 06:32. +- **1.0.30000915** was released on December 6th, 2018 at 05:32. +- **1.0.30000914** was released on December 4th, 2018 at 06:32. +- **1.0.30000913** was released on December 3rd, 2018 at 07:32. +- **1.0.30000912** was released on November 27th, 2018 at 15:32. +- **1.0.30000911** was released on November 27th, 2018 at 06:32. +- **1.0.30000910** was released on November 21st, 2018 at 06:32. +- **1.0.30000909** was released on November 18th, 2018 at 06:32. +- **1.0.30000908** was released on November 18th, 2018 at 05:32. +- **1.0.30000907** was released on November 8th, 2018 at 07:32. +- **1.0.30000906** was released on November 6th, 2018 at 05:32. +- **1.0.30000905** was released on November 5th, 2018 at 05:32. +- **1.0.30000904** was released on November 3rd, 2018 at 06:32. +- **1.0.30000903** was released on October 31st, 2018 at 05:32. +- **1.0.30000902** was released on October 30th, 2018 at 04:32. +- **1.0.30000901** was released on October 30th, 2018 at 03:32. +- **1.0.30000900** was released on October 29th, 2018 at 01:32. +- **1.0.30000899** was released on October 25th, 2018 at 04:32. +- **1.0.30000898** was released on October 23rd, 2018 at 05:32. +- **1.0.30000893** was released on October 18th, 2018 at 05:32. +- **1.0.30000892** was released on October 15th, 2018 at 06:32. +- **1.0.30000890** was released on October 8th, 2018 at 03:32. +- **1.0.30000889** was released on October 3rd, 2018 at 04:32. +- **1.0.30000888** was released on September 28th, 2018 at 02:32. +- **1.0.30000887** was released on September 23rd, 2018 at 04:32. +- **1.0.30000886** was released on September 21st, 2018 at 06:32. +- **1.0.30000885** was released on September 6th, 2018 at 05:32. +- **1.0.30000884** was released on September 4th, 2018 at 04:32. +- **1.0.30000883** was released on August 30th, 2018 at 04:32. +- **1.0.30000882** was released on August 29th, 2018 at 05:32. +- **1.0.30000880** was released on August 28th, 2018 at 06:32. +- **1.0.30000878** was released on August 21st, 2018 at 06:32. +- **1.0.30000877** was released on August 14th, 2018 at 05:32. +- **1.0.30000876** was released on August 13th, 2018 at 01:32. +- **1.0.30000874** was released on August 3rd, 2018 at 06:47. +- **1.0.30000872** was released on August 2nd, 2018 at 22:47. +- **1.0.30000865** was released on July 10th, 2018 at 05:00. +- **1.0.30000864** was released on July 5th, 2018 at 03:01. +- **1.0.30000862** was released on July 3rd, 2018 at 06:00. +- **1.0.30000861** was released on June 29th, 2018 at 05:00. +- **1.0.30000860** was released on June 28th, 2018 at 06:00. +- **1.0.30000859** was released on June 26th, 2018 at 06:00. +- **1.0.30000858** was released on June 24th, 2018 at 00:01. +- **1.0.30000857** was released on June 23rd, 2018 at 23:00. +- **1.0.30000856** was released on June 15th, 2018 at 06:01. +- **1.0.30000855** was released on June 14th, 2018 at 06:00. +- **1.0.30000854** was released on June 14th, 2018 at 05:00. +- **1.0.30000853** was released on June 13th, 2018 at 07:00. +- **1.0.30000852** was released on June 12th, 2018 at 07:00. +- **1.0.30000851** was released on June 8th, 2018 at 06:00. +- **1.0.30000850** was released on June 7th, 2018 at 07:00. +- **1.0.30000849** was released on June 5th, 2018 at 07:00. +- **1.0.30000848** was released on June 4th, 2018 at 15:01. +- **1.0.30000847** was released on May 31st, 2018 at 07:00. +- **1.0.30000846** was released on May 24th, 2018 at 07:00. +- **1.0.30000845** was released on May 23rd, 2018 at 23:00. +- **1.0.30000844** was released on May 22nd, 2018 at 11:00. +- **1.0.30000845** was released on May 22nd, 2018 at 06:02. +- **1.0.30000844** was released on May 21st, 2018 at 04:00. +- **1.0.30000843** was released on May 18th, 2018 at 07:01. +- **1.0.30000842** was released on May 17th, 2018 at 06:00. +- **1.0.30000841** was released on May 16th, 2018 at 06:00. +- **1.0.30000840** was released on May 14th, 2018 at 06:00. +- **1.0.30000839** was released on May 10th, 2018 at 07:00. +- **1.0.30000838** was released on May 10th, 2018 at 06:01. +- **1.0.30000836** was released on May 8th, 2018 at 05:00. +- **1.0.30000835** was released on May 6th, 2018 at 05:00. +- **1.0.30000834** was released on May 6th, 2018 at 04:00. +- **1.0.30000833** was released on May 2nd, 2018 at 04:01. +- **1.0.30000832** was released on April 28th, 2018 at 04:00. +- **1.0.30000831** was released on April 28th, 2018 at 03:00. +- **1.0.30000830** was released on April 14th, 2018 at 05:00. +- **1.0.30000828** was released on April 12th, 2018 at 06:00. +- **1.0.30000827** was released on April 10th, 2018 at 05:00. +- **1.0.30000826** was released on April 10th, 2018 at 04:00. +- **1.0.30000824** was released on April 6th, 2018 at 05:00. +- **1.0.30000823** was released on April 3rd, 2018 at 06:01. +- **1.0.30000822** was released on April 3rd, 2018 at 05:00. +- **1.0.30000821** was released on March 28th, 2018 at 04:00. +- **1.0.30000820** was released on March 25th, 2018 at 05:01. +- **1.0.30000819** was released on March 22nd, 2018 at 06:01. +- **1.0.30000817** was released on March 21st, 2018 at 06:01. +- **1.0.30000815** was released on March 15th, 2018 at 06:01. +- **1.0.30000814** was released on March 13th, 2018 at 06:01. +- **1.0.30000813** was released on March 6th, 2018 at 07:00. +- **1.0.30000812** was released on March 5th, 2018 at 05:01. +- **1.0.30000811** was released on March 3rd, 2018 at 08:01. +- **1.0.30000810** was released on February 20th, 2018 at 00:00. +- **1.0.30000809** was released on February 18th, 2018 at 02:01. +- **1.0.30000808** was released on February 11th, 2018 at 07:00. +- **1.0.30000807** was released on February 10th, 2018 at 06:00. +- **1.0.30000805** was released on February 9th, 2018 at 05:00. +- **1.0.30000804** was released on February 7th, 2018 at 07:00. +- **1.0.30000803** was released on February 6th, 2018 at 07:00. +- **1.0.30000802** was released on February 5th, 2018 at 23:14. +- **1.0.30000792** was released on January 15th, 2018 at 06:01. +- **1.0.30000791** was released on January 12th, 2018 at 06:01. +- **1.0.30000790** was released on January 11th, 2018 at 08:00. +- **1.0.30000789** was released on January 7th, 2018 at 05:00. +- **1.0.30000788** was released on January 7th, 2018 at 04:00. +- **1.0.30000787** was released on January 3rd, 2018 at 23:00. +- **1.0.30000786** was released on January 3rd, 2018 at 19:00. +- **1.0.30000785** was released on January 3rd, 2018 at 18:01. +- **1.0.30000784** was released on December 20th, 2017 at 05:01. +- **1.0.30000783** was released on December 13th, 2017 at 06:01. +- **1.0.30000782** was released on December 10th, 2017 at 07:01. +- **1.0.30000781** was released on December 10th, 2017 at 06:01. +- **1.0.30000780** was released on December 6th, 2017 at 06:01. +- **1.0.30000779** was released on December 6th, 2017 at 05:01. +- **1.0.30000778** was released on December 4th, 2017 at 07:01. +- **1.0.30000777** was released on December 1st, 2017 at 07:00. +- **1.0.30000776** was released on December 1st, 2017 at 05:01. +- **1.0.30000775** was released on November 29th, 2017 at 06:00. +- **1.0.30000774** was released on November 29th, 2017 at 05:01. +- **1.0.30000772** was released on November 26th, 2017 at 07:01. +- **1.0.30000770** was released on November 23rd, 2017 at 06:01. +- **1.0.30000769** was released on November 21st, 2017 at 06:01. +- **1.0.30000766** was released on November 17th, 2017 at 06:01. +- **1.0.30000765** was released on November 16th, 2017 at 05:00. +- **1.0.30000764** was released on November 14th, 2017 at 07:00. +- **1.0.30000762** was released on November 14th, 2017 at 06:00. +- **1.0.30000760** was released on November 8th, 2017 at 04:00. +- **1.0.30000758** was released on November 3rd, 2017 at 06:01. +- **1.0.30000757** was released on November 2nd, 2017 at 06:00. +- **1.0.30000756** was released on October 30th, 2017 at 06:00. +- **1.0.30000755** was released on October 28th, 2017 at 07:00. +- **1.0.30000753** was released on October 28th, 2017 at 06:00. +- **1.0.30000752** was released on October 27th, 2017 at 05:00. +- **1.0.30000751** was released on October 26th, 2017 at 05:00. +- **1.0.30000750** was released on October 25th, 2017 at 05:00. +- **1.0.30000749** was released on October 22nd, 2017 at 23:00. +- **1.0.30000748** was released on October 19th, 2017 at 06:00. +- **1.0.30000747** was released on October 18th, 2017 at 06:00. +- **1.0.30000746** was released on October 11th, 2017 at 05:00. +- **1.0.30000745** was released on October 9th, 2017 at 03:00. +- **1.0.30000744** was released on October 5th, 2017 at 06:01. +- **1.0.30000743** was released on October 4th, 2017 at 06:00. +- **1.0.30000742** was released on October 4th, 2017 at 05:01. +- **1.0.30000741** was released on October 3rd, 2017 at 04:00. +- **1.0.30000740** was released on September 29th, 2017 at 05:00. +- **1.0.30000739** was released on September 28th, 2017 at 05:00. +- **1.0.30000738** was released on September 25th, 2017 at 07:00. +- **1.0.30000737** was released on September 24th, 2017 at 06:00. +- **1.0.30000736** was released on September 24th, 2017 at 05:00. +- **1.0.30000735** was released on September 22nd, 2017 at 05:00. +- **1.0.30000734** was released on September 22nd, 2017 at 01:00. +- **1.0.30000733** was released on September 18th, 2017 at 05:00. +- **1.0.30000732** was released on September 17th, 2017 at 06:00. +- **1.0.30000731** was released on September 16th, 2017 at 06:00. +- **1.0.30000730** was released on September 15th, 2017 at 06:00. +- **1.0.30000727** was released on September 11th, 2017 at 07:00. +- **1.0.30000726** was released on September 6th, 2017 at 04:00. +- **1.0.30000725** was released on September 5th, 2017 at 06:00. +- **1.0.30000724** was released on September 5th, 2017 at 05:00. +- **1.0.30000723** was released on September 4th, 2017 at 20:00. +- **1.0.30000722** was released on September 4th, 2017 at 05:00. +- **1.0.30000721** was released on August 30th, 2017 at 06:00. +- **1.0.30000720** was released on August 30th, 2017 at 05:00. +- **1.0.30000718** was released on August 25th, 2017 at 07:00. +- **1.0.30000717** was released on August 22nd, 2017 at 04:00. +- **1.0.30000716** was released on August 20th, 2017 at 07:00. +- **1.0.30000715** was released on August 11th, 2017 at 06:00. +- **1.0.30000714** was released on August 11th, 2017 at 05:00. +- **1.0.30000713** was released on August 9th, 2017 at 06:00. +- **1.0.30000712** was released on August 7th, 2017 at 04:00. +- **1.0.30000711** was released on August 7th, 2017 at 01:00. +- **1.0.30000710** was released on August 4th, 2017 at 03:00. +- **1.0.30000709** was released on August 1st, 2017 at 05:00. +- **1.0.30000708** was released on July 27th, 2017 at 07:01. +- **1.0.30000706** was released on July 25th, 2017 at 16:06. +- **1.0.30000704** was released on July 20th, 2017 at 07:01. +- **1.0.30000703** was released on July 19th, 2017 at 06:01. +- **1.0.30000702** was released on July 18th, 2017 at 08:01. +- **1.0.30000701** was released on July 14th, 2017 at 06:01. +- **1.0.30000700** was released on July 12th, 2017 at 07:01. +- **1.0.30000699** was released on July 11th, 2017 at 06:02. +- **1.0.30000698** was released on July 10th, 2017 at 06:01. +- **1.0.30000697** was released on July 5th, 2017 at 06:01. +- **1.0.30000696** was released on June 27th, 2017 at 07:01. +- **1.0.30000695** was released on June 27th, 2017 at 05:01. +- **1.0.30000694** was released on June 24th, 2017 at 05:01. +- **1.0.30000693** was released on June 22nd, 2017 at 04:01. +- **1.0.30000692** was released on June 19th, 2017 at 07:01. +- **1.0.30000690** was released on June 18th, 2017 at 07:01. +- **1.0.30000689** was released on June 18th, 2017 at 06:01. +- **1.0.30000688** was released on June 18th, 2017 at 05:01. +- **1.0.30000687** was released on June 18th, 2017 at 04:01. +- **1.0.30000686** was released on June 15th, 2017 at 07:01. +- **1.0.30000684** was released on June 13th, 2017 at 05:01. +- **1.0.30000683** was released on June 10th, 2017 at 05:01. +- **1.0.30000680** was released on June 8th, 2017 at 08:01. +- **1.0.30000679** was released on June 6th, 2017 at 06:01. +- **1.0.30000677** was released on June 5th, 2017 at 00:01. +- **1.0.30000676** was released on May 30th, 2017 at 06:01. +- **1.0.30000674** was released on May 28th, 2017 at 06:01. +- **1.0.30000673** was released on May 27th, 2017 at 06:01. +- **1.0.30000672** was released on May 26th, 2017 at 06:01. +- **1.0.30000671** was released on May 25th, 2017 at 07:01. +- **1.0.30000670** was released on May 15th, 2017 at 07:01. +- **1.0.30000669** was released on May 14th, 2017 at 06:01. +- **1.0.30000668** was released on May 14th, 2017 at 05:01. +- **1.0.30000667** was released on May 12th, 2017 at 07:01. +- **1.0.30000666** was released on May 8th, 2017 at 06:01. +- **1.0.30000665** was released on May 3rd, 2017 at 08:01. +- **1.0.30000664** was released on April 28th, 2017 at 06:01. +- **1.0.30000663** was released on April 28th, 2017 at 05:01. +- **1.0.30000662** was released on April 26th, 2017 at 07:01. +- **1.0.30000661** was released on April 26th, 2017 at 06:01. +- **1.0.30000660** was released on April 24th, 2017 at 17:01. +- **1.0.30000659** was released on April 24th, 2017 at 00:01. +- **1.0.30000657** was released on April 21st, 2017 at 06:01. +- **1.0.30000656** was released on April 20th, 2017 at 12:16. +- **1.0.30000655** was released on April 17th, 2017 at 17:06. + +# 0.3.0 + +- Add the `title` key to each feature. +- Update `caniuse-db` to `1.0.30000653`. +- Test automated publish script. + +# 0.2.0 + +- Rewrite of the module. Now tries to be less clever with version merging, + instead opting for base62 identifiers for versions, and it is now tested + for accuracy against the original data. +- `null` versions are now preserved to be consistent with caniuse-db. +- All data is now stored as JS objects rather than JSON. +- The browser map is now automatically generated. + +# 0.1.0 + +- Initial release. diff --git a/website/www/node_modules/caniuse-lite/LICENSE b/website/www/node_modules/caniuse-lite/LICENSE new file mode 100644 index 000000000000..06c608dcf455 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/LICENSE @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/website/www/node_modules/caniuse-lite/README.md b/website/www/node_modules/caniuse-lite/README.md new file mode 100644 index 000000000000..84e471c34d67 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/README.md @@ -0,0 +1,103 @@ +# caniuse-lite + +> A smaller version of caniuse-db, with only the essentials! + +## Why? + +The full data behind [Can I use][1] is incredibly useful for any front end +developer, and on the website all of the details from the database are displayed +to the user. However in automated tools, [many of these fields go unused][2]; +it's not a problem for server side consumption but client side, the less +JavaScript that we send to the end user the better. + +caniuse-lite then, is a smaller dataset that keeps essential parts of the data +in a compact format. It does this in multiple ways, such as converting `null` +array entries into empty strings, representing support data as an integer rather +than a string, and using base62 references instead of longer human-readable +keys. + +This packed data is then reassembled (via functions exposed by this module) into +a larger format which is mostly compatible with caniuse-db, and so it can be +used as an almost drop-in replacement for caniuse-db for contexts where size on +disk is important; for example, usage in web browsers. The API differences are +very small and are detailed in the section below. + + +## API + +```js +import * as lite from 'caniuse-lite'; +``` + +### `lite.agents` + +caniuse-db provides a full `data.json` file which contains all of the features +data. Instead of this large file, caniuse-lite provides this data subset +instead, which has the `browser`, `prefix`, `prefix_exceptions`, `usage_global` +and `versions` keys from the original. + +In addition, the subset contains the `release_date` key with release dates (as timestamps) for each version: +```json +{ + "release_date": { + "6": 998870400, + "7": 1161129600, + "8": 1237420800, + "9": 1300060800, + "10": 1346716800, + "11": 1381968000, + "5.5": 962323200 + } +} +``` + +### `lite.feature(js)` + +The `feature` method takes a file from `data/features` and converts it into +something that more closely represents the `caniuse-db` format. Note that only +the `title`, `stats` and `status` keys are kept from the original data. + +### `lite.features` + +The `features` index is provided as a way to query all of the features that +are listed in the `caniuse-db` dataset. Note that you will need to use the +`feature` method on values from this index to get a human-readable format. + +### `lite.region(js)` + +The `region` method takes a file from `data/regions` and converts it into +something that more closely represents the `caniuse-db` format. Note that *only* +the usage data is exposed here (the `data` key in the original files). + + +## Contributors + +Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)): + + + +| [
    Ben Briggs](http://beneb.info)
    [💻](https://github.com/ben-eb/caniuse-lite/commits?author=ben-eb "Code") [📖](https://github.com/ben-eb/caniuse-lite/commits?author=ben-eb "Documentation") [👀](#review-ben-eb "Reviewed Pull Requests") [⚠️](https://github.com/ben-eb/caniuse-lite/commits?author=ben-eb "Tests") | [
    Andy Jansson](https://github.com/andyjansson)
    [💻](https://github.com/ben-eb/caniuse-lite/commits?author=andyjansson "Code") | [
    Andrey Sitnik](http://twitter.com/sitnikcode)
    [💻](https://github.com/ben-eb/caniuse-lite/commits?author=ai "Code") |
    Igor Deryabin
    [💻](https://github.com/ben-eb/caniuse-lite/commits?author=rodweb "Code") | +| :---: | :---: | :---: | :---: | + + +This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! + +Digital Ocean logo + +Big thanks to [DigitalOcean](https://www.digitalocean.com/?utm_source=opensource&utm_campaign=caniuse-lite) for supporting this project by providing their great infrastructure for us. + +## License + +The data in this repo is available for use under a CC BY 4.0 license +(http://creativecommons.org/licenses/by/4.0/). For attribution just mention +somewhere that the source is caniuse.com. If you have any questions about using +the data for your project please contact me here: http://a.deveria.com/contact + +[1]: http://caniuse.com/ +[2]: https://github.com/Fyrd/caniuse/issues/1827 + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. diff --git a/website/www/node_modules/caniuse-lite/data/agents.js b/website/www/node_modules/caniuse-lite/data/agents.js new file mode 100644 index 000000000000..86a361f0ddc6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/agents.js @@ -0,0 +1 @@ +module.exports={A:{A:{I:0.00545889,F:0.0108864,E:0.0873422,D:0.218356,A:0.0272944,B:1.43023,gB:0.009298},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","gB","I","F","E","D","A","B","","",""],E:"IE",F:{gB:962323200,I:998870400,F:1161129600,E:1237420800,D:1300060800,A:1346716800,B:1381968000}},B:{A:{C:0.00867,O:0.00867,T:0.013005,P:0.013005,H:0.030345,J:0.09537,K:2.00277,UB:0,IB:0,N:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","C","O","T","P","H","J","K","UB","IB","N","","",""],E:"Edge",F:{C:1438128000,O:1447286400,T:1470096000,P:1491868800,H:1508198400,J:1525046400,K:1542067200,UB:1579046400,IB:1581033600,N:1586736000},D:{C:"ms",O:"ms",T:"ms",P:"ms",H:"ms",J:"ms",K:"ms"}},C:{A:{"0":0.00867,"1":0.004335,"2":0.11271,"3":0.004335,"4":0.013005,"5":0.00867,"6":0.021675,"7":0.00867,"8":0.013005,"9":0.021675,qB:0.004827,GB:0.004538,G:0.00974,U:0.004879,I:0.020136,F:0.005725,E:0.004525,D:0.00533,A:0.004283,B:0.009042,C:0.004471,O:0.004486,T:0.00453,P:0.004465,H:0.004417,J:0.008922,K:0.004393,V:0.004443,W:0.004283,X:0.013596,Y:0.013698,Z:0.013614,a:0.008786,b:0.004403,c:0.004317,d:0.004393,e:0.004418,f:0.008834,g:0.004403,h:0.008928,i:0.004471,j:0.021675,k:0.004707,l:0.009076,m:0.004465,n:0.004783,o:0.00867,p:0.004783,q:0.00487,r:0.005029,s:0.0047,t:0.01734,u:0.004335,v:0.00867,Q:0.004525,x:0.013005,y:0.021675,z:0.004538,TB:0.00867,AB:0.021675,FB:0.004335,CB:0.004335,DB:0.021675,BB:0.01734,w:0.01734,R:0.013005,M:0.108375,JB:0.013005,KB:0.01734,LB:0.01734,MB:0.06069,NB:0.04335,OB:1.16178,PB:2.01577,QB:0.039015,RB:0,SB:0,nB:0.008786,fB:0.00487},B:"moz",C:["","qB","GB","nB","fB","G","U","I","F","E","D","A","B","C","O","T","P","H","J","K","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","Q","x","y","z","0","1","2","3","4","5","6","7","8","TB","AB","FB","CB","DB","BB","9","w","R","M","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB",""],E:"Firefox",F:{"0":1479168000,"1":1485216000,"2":1488844800,"3":1492560000,"4":1497312000,"5":1502150400,"6":1506556800,"7":1510617600,"8":1516665600,"9":1548720000,qB:1161648000,GB:1213660800,nB:1246320000,fB:1264032000,G:1300752000,U:1308614400,I:1313452800,F:1317081600,E:1317081600,D:1320710400,A:1324339200,B:1327968000,C:1331596800,O:1335225600,T:1338854400,P:1342483200,H:1346112000,J:1349740800,K:1353628800,V:1357603200,W:1361232000,X:1364860800,Y:1368489600,Z:1372118400,a:1375747200,b:1379376000,c:1386633600,d:1391472000,e:1395100800,f:1398729600,g:1402358400,h:1405987200,i:1409616000,j:1413244800,k:1417392000,l:1421107200,m:1424736000,n:1428278400,o:1431475200,p:1435881600,q:1439251200,r:1442880000,s:1446508800,t:1450137600,u:1453852800,v:1457395200,Q:1461628800,x:1465257600,y:1470096000,z:1474329600,TB:1520985600,AB:1525824000,FB:1529971200,CB:1536105600,DB:1540252800,BB:1544486400,w:1552953600,R:1558396800,M:1562630400,JB:1567468800,KB:1571788800,LB:1575331200,MB:1578355200,NB:1581379200,OB:1583798400,PB:1586304000,QB:1588636800,RB:null,SB:null}},D:{A:{"0":0.004335,"1":0.00867,"2":0.004403,"3":0.039015,"4":0.013005,"5":0.01734,"6":0.02601,"7":0.021675,"8":0.021675,"9":0.04335,G:0.004706,U:0.004879,I:0.004879,F:0.005591,E:0.005591,D:0.005591,A:0.004534,B:0.004464,C:0.010424,O:0.00867,T:0.004706,P:0.015087,H:0.004393,J:0.004393,K:0.008652,V:0.004418,W:0.004393,X:0.004317,Y:0.004335,Z:0.008786,a:0.004538,b:0.004461,c:0.004335,d:0.004326,e:0.0047,f:0.004538,g:0.004335,h:0.00867,i:0.004566,j:0.00867,k:0.00867,l:0.004335,m:0.004335,n:0.004464,o:0.02601,p:0.004464,q:0.01734,r:0.021675,s:0.004403,t:0.013005,u:0.004465,v:0.00867,Q:0.004538,x:0.013005,y:0.030345,z:0.35547,TB:0.013005,AB:0.01734,FB:0.02601,CB:0.01734,DB:0.056355,BB:0.01734,w:0.02601,R:0.05202,M:0.02601,JB:0.0867,KB:0.11271,LB:0.143055,MB:0.15606,NB:0.134385,OB:0.12138,PB:0.13005,QB:0.143055,RB:0.117045,SB:0.19941,UB:0.39015,IB:16.8978,N:8.70901,eB:0.02601,ZB:0.01734,YB:0},B:"webkit",C:["G","U","I","F","E","D","A","B","C","O","T","P","H","J","K","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","Q","x","y","z","0","1","2","3","4","5","6","7","8","TB","AB","FB","CB","DB","BB","9","w","R","M","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","UB","IB","N","eB","ZB","YB"],E:"Chrome",F:{"0":1460592000,"1":1464134400,"2":1469059200,"3":1472601600,"4":1476230400,"5":1480550400,"6":1485302400,"7":1489017600,"8":1492560000,"9":1520294400,G:1264377600,U:1274745600,I:1283385600,F:1287619200,E:1291248000,D:1296777600,A:1299542400,B:1303862400,C:1307404800,O:1312243200,T:1316131200,P:1316131200,H:1319500800,J:1323734400,K:1328659200,V:1332892800,W:1337040000,X:1340668800,Y:1343692800,Z:1348531200,a:1352246400,b:1357862400,c:1361404800,d:1364428800,e:1369094400,f:1374105600,g:1376956800,h:1384214400,i:1389657600,j:1392940800,k:1397001600,l:1400544000,m:1405468800,n:1409011200,o:1412640000,p:1416268800,q:1421798400,r:1425513600,s:1429401600,t:1432080000,u:1437523200,v:1441152000,Q:1444780800,x:1449014400,y:1453248000,z:1456963200,TB:1496707200,AB:1500940800,FB:1504569600,CB:1508198400,DB:1512518400,BB:1516752000,w:1523923200,R:1527552000,M:1532390400,JB:1536019200,KB:1539648000,LB:1543968000,MB:1548720000,NB:1552348800,OB:1555977600,PB:1559606400,QB:1564444800,RB:1568073600,SB:1571702400,UB:1575936000,IB:1580860800,N:1586304000,eB:null,ZB:null,YB:null}},E:{A:{G:0,U:0.004566,I:0.00867,F:0.004465,E:0.021675,D:0.00867,A:0.013005,B:0.030345,C:0.0867,O:2.04179,xB:0,WB:0.008692,aB:0.099705,bB:0.00456,cB:0.004283,dB:0.04335,VB:0.082365,L:0.169065,S:0.316455,hB:1.24848,iB:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","xB","WB","G","U","aB","I","bB","F","cB","E","D","dB","A","VB","B","L","C","S","O","hB","iB","",""],E:"Safari",F:{xB:1205798400,WB:1226534400,G:1244419200,U:1275868800,aB:1311120000,I:1343174400,bB:1382400000,F:1382400000,cB:1410998400,E:1413417600,D:1443657600,dB:1458518400,A:1474329600,VB:1490572800,B:1505779200,L:1522281600,C:1537142400,S:1553472000,O:1568851200,hB:1585008000,iB:null}},F:{A:{"0":0.004707,"1":0.004707,"2":0.004326,"3":0.008922,"4":0.014349,"5":0.004725,"6":0.004335,"7":0.004335,"8":0.00867,"9":0.00867,D:0.0082,B:0.016581,C:0.004317,P:0.00685,H:0.00685,J:0.00685,K:0.005014,V:0.006015,W:0.004879,X:0.006597,Y:0.006597,Z:0.013434,a:0.006702,b:0.006015,c:0.005595,d:0.004393,e:0.008652,f:0.004879,g:0.004879,h:0.009132,i:0.005152,j:0.005014,k:0.009758,l:0.004879,m:0.00867,n:0.004283,o:0.004367,p:0.004534,q:0.004367,r:0.004227,s:0.004418,t:0.009042,u:0.004227,v:0.004725,Q:0.004417,x:0.008942,y:0.004707,z:0.004827,AB:0.004403,CB:0.004532,DB:0.004566,BB:0.02283,w:0.013005,R:0.906015,M:0.01734,jB:0.00685,kB:0,lB:0.008392,mB:0.004706,L:0.006229,EB:0.004879,oB:0.008786,S:0.004335},B:"webkit",C:["","","","","","","","","","","","","","","","D","jB","kB","lB","mB","B","L","EB","oB","C","S","P","H","J","K","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","Q","x","y","z","0","1","2","3","4","5","6","7","8","AB","CB","DB","BB","9","w","R","M","","",""],E:"Opera",F:{"0":1515024000,"1":1517961600,"2":1521676800,"3":1525910400,"4":1530144000,"5":1534982400,"6":1537833600,"7":1543363200,"8":1548201600,"9":1573689600,D:1150761600,jB:1223424000,kB:1251763200,lB:1267488000,mB:1277942400,B:1292457600,L:1302566400,EB:1309219200,oB:1323129600,C:1323129600,S:1352073600,P:1372723200,H:1377561600,J:1381104000,K:1386288000,V:1390867200,W:1393891200,X:1399334400,Y:1401753600,Z:1405987200,a:1409616000,b:1413331200,c:1417132800,d:1422316800,e:1425945600,f:1430179200,g:1433808000,h:1438646400,i:1442448000,j:1445904000,k:1449100800,l:1454371200,m:1457308800,n:1462320000,o:1465344000,p:1470096000,q:1474329600,r:1477267200,s:1481587200,t:1486425600,u:1490054400,v:1494374400,Q:1498003200,x:1502236800,y:1506470400,z:1510099200,AB:1554768000,CB:1561593600,DB:1566259200,BB:1570406400,w:1578441600,R:1583971200,M:1587513600},D:{D:"o",B:"o",C:"o",jB:"o",kB:"o",lB:"o",mB:"o",L:"o",EB:"o",oB:"o",S:"o"}},G:{A:{E:0.00150429,WB:0.00150429,pB:0,HB:0.00300858,rB:0.0150429,sB:0.00451286,tB:0.0150429,uB:0.02106,vB:0.0180515,wB:0.216617,XB:0.0556587,yB:0.191045,zB:0.123352,"0B":0.209096,"1B":0.258738,"2B":1.69533,"3B":0.361029,"4B":0.176002,"5B":9.85609,"6B":1.82621},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","WB","pB","HB","rB","sB","tB","E","uB","vB","wB","XB","yB","zB","0B","1B","2B","3B","4B","5B","6B","","",""],E:"iOS Safari",F:{WB:1270252800,pB:1283904000,HB:1299628800,rB:1331078400,sB:1359331200,tB:1394409600,E:1410912000,uB:1413763200,vB:1442361600,wB:1458518400,XB:1473724800,yB:1490572800,zB:1505779200,"0B":1522281600,"1B":1537142400,"2B":1553472000,"3B":1568851200,"4B":1572220800,"5B":1580169600,"6B":1585008000}},H:{A:{"7B":0.691982},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7B","","",""],E:"Opera Mini",F:{"7B":1426464000}},I:{A:{GB:0.000620932,G:0.00558838,N:0,"8B":0,"9B":0.00186279,AC:0.000620932,BC:0.0124186,HB:0.0260791,CC:0,DC:0.179449},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","8B","9B","AC","GB","G","BC","HB","CC","DC","N","","",""],E:"Android Browser",F:{"8B":1256515200,"9B":1274313600,AC:1291593600,GB:1298332800,G:1318896000,BC:1341792000,HB:1374624000,CC:1386547200,DC:1401667200,N:1587427200}},J:{A:{F:0,A:0.005666},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","F","A","","",""],E:"Blackberry Browser",F:{F:1325376000,A:1359504000}},K:{A:{A:0,B:0,C:0,Q:0.0111391,L:0,EB:0,S:0},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","L","EB","C","S","Q","","",""],E:"Opera Mobile",F:{A:1287100800,B:1300752000,L:1314835200,EB:1318291200,C:1330300800,S:1349740800,Q:1474588800},D:{Q:"webkit"}},L:{A:{N:34.7979},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","N","","",""],E:"Chrome for Android",F:{N:1587427200}},M:{A:{M:0.22664},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","M","","",""],E:"Firefox for Android",F:{M:1567468800}},N:{A:{A:0.0115934,B:0.022664},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","","",""],E:"IE Mobile",F:{A:1340150400,B:1353456000}},O:{A:{EC:1.97743},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","EC","","",""],E:"UC Browser for Android",F:{EC:1471392000},D:{EC:"webkit"}},P:{A:{G:0.268735,FC:0.010336,GC:0.010336,HC:0.0930236,IC:0.0310079,JC:0.196383,VB:0.330751,L:2.64601},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","G","FC","GC","HC","IC","JC","VB","L","","",""],E:"Samsung Internet",F:{G:1461024000,FC:1481846400,GC:1509408000,HC:1528329600,IC:1546128000,JC:1554163200,VB:1567900800,L:1582588800}},Q:{A:{KC:0.215308},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","KC","","",""],E:"QQ Browser",F:{KC:1483228800}},R:{A:{LC:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","LC","","",""],E:"Baidu Browser",F:{LC:1491004800}},S:{A:{MC:0.067992},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","MC","","",""],E:"KaiOS Browser",F:{MC:1527811200}}}; diff --git a/website/www/node_modules/caniuse-lite/data/browserVersions.js b/website/www/node_modules/caniuse-lite/data/browserVersions.js new file mode 100644 index 000000000000..2a44e4b1babb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/browserVersions.js @@ -0,0 +1 @@ +module.exports={"0":"50","1":"51","2":"52","3":"53","4":"54","5":"55","6":"56","7":"57","8":"58","9":"65",A:"10",B:"11",C:"12",D:"9",E:"8",F:"7",G:"4",H:"16",I:"6",J:"17",K:"18",L:"11.1",M:"68",N:"81",O:"13",P:"15",Q:"46",R:"67",S:"12.1",T:"14",U:"5",V:"19",W:"20",X:"21",Y:"22",Z:"23",a:"24",b:"25",c:"26",d:"27",e:"28",f:"29",g:"30",h:"31",i:"32",j:"33",k:"34",l:"35",m:"36",n:"37",o:"38",p:"39",q:"40",r:"41",s:"42",t:"43",u:"44",v:"45",w:"66",x:"47",y:"48",z:"49",AB:"60",BB:"64",CB:"62",DB:"63",EB:"11.5",FB:"61",GB:"3",HB:"4.2-4.3",IB:"80",JB:"69",KB:"70",LB:"71",MB:"72",NB:"73",OB:"74",PB:"75",QB:"76",RB:"77",SB:"78",TB:"59",UB:"79",VB:"10.1",WB:"3.2",XB:"10.0-10.2",YB:"85",ZB:"84",aB:"5.1",bB:"6.1",cB:"7.1",dB:"9.1",eB:"83",fB:"3.6",gB:"5.5",hB:"13.1",iB:"TP",jB:"9.5-9.6",kB:"10.0-10.1",lB:"10.5",mB:"10.6",nB:"3.5",oB:"11.6",pB:"4.0-4.1",qB:"2",rB:"5.0-5.1",sB:"6.0-6.1",tB:"7.0-7.1",uB:"8.1-8.4",vB:"9.0-9.2",wB:"9.3",xB:"3.1",yB:"10.3",zB:"11.0-11.2","0B":"11.3-11.4","1B":"12.0-12.1","2B":"12.2-12.4","3B":"13.0-13.1","4B":"13.2","5B":"13.3","6B":"13.4","7B":"all","8B":"2.1","9B":"2.2",AC:"2.3",BC:"4.1",CC:"4.4",DC:"4.4.3-4.4.4",EC:"12.12",FC:"5.0-5.4",GC:"6.2-6.4",HC:"7.2-7.4",IC:"8.2",JC:"9.2",KC:"1.2",LC:"7.12",MC:"2.5"}; diff --git a/website/www/node_modules/caniuse-lite/data/browsers.js b/website/www/node_modules/caniuse-lite/data/browsers.js new file mode 100644 index 000000000000..04fbb50f7fe9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/browsers.js @@ -0,0 +1 @@ +module.exports={A:"ie",B:"edge",C:"firefox",D:"chrome",E:"safari",F:"opera",G:"ios_saf",H:"op_mini",I:"android",J:"bb",K:"op_mob",L:"and_chr",M:"and_ff",N:"ie_mob",O:"and_uc",P:"samsung",Q:"and_qq",R:"baidu",S:"kaios"}; diff --git a/website/www/node_modules/caniuse-lite/data/features.js b/website/www/node_modules/caniuse-lite/data/features.js new file mode 100644 index 000000000000..4abad61a712a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features.js @@ -0,0 +1 @@ +module.exports={"aac":require("./features/aac"),"abortcontroller":require("./features/abortcontroller"),"ac3-ec3":require("./features/ac3-ec3"),"accelerometer":require("./features/accelerometer"),"addeventlistener":require("./features/addeventlistener"),"alternate-stylesheet":require("./features/alternate-stylesheet"),"ambient-light":require("./features/ambient-light"),"apng":require("./features/apng"),"array-find-index":require("./features/array-find-index"),"array-find":require("./features/array-find"),"array-flat":require("./features/array-flat"),"array-includes":require("./features/array-includes"),"arrow-functions":require("./features/arrow-functions"),"asmjs":require("./features/asmjs"),"async-clipboard":require("./features/async-clipboard"),"async-functions":require("./features/async-functions"),"async-iterations-and-generators":require("./features/async-iterations-and-generators"),"atob-btoa":require("./features/atob-btoa"),"audio-api":require("./features/audio-api"),"audio":require("./features/audio"),"audiotracks":require("./features/audiotracks"),"autofocus":require("./features/autofocus"),"auxclick":require("./features/auxclick"),"av1":require("./features/av1"),"avif":require("./features/avif"),"background-attachment":require("./features/background-attachment"),"background-clip-text":require("./features/background-clip-text"),"background-img-opts":require("./features/background-img-opts"),"background-position-x-y":require("./features/background-position-x-y"),"background-repeat-round-space":require("./features/background-repeat-round-space"),"background-sync":require("./features/background-sync"),"battery-status":require("./features/battery-status"),"beacon":require("./features/beacon"),"beforeafterprint":require("./features/beforeafterprint"),"bigint":require("./features/bigint"),"blobbuilder":require("./features/blobbuilder"),"bloburls":require("./features/bloburls"),"border-image":require("./features/border-image"),"border-radius":require("./features/border-radius"),"broadcastchannel":require("./features/broadcastchannel"),"brotli":require("./features/brotli"),"calc":require("./features/calc"),"canvas-blending":require("./features/canvas-blending"),"canvas-text":require("./features/canvas-text"),"canvas":require("./features/canvas"),"ch-unit":require("./features/ch-unit"),"chacha20-poly1305":require("./features/chacha20-poly1305"),"channel-messaging":require("./features/channel-messaging"),"childnode-remove":require("./features/childnode-remove"),"classlist":require("./features/classlist"),"clear-site-data-header":require("./features/clear-site-data-header"),"client-hints-dpr-width-viewport":require("./features/client-hints-dpr-width-viewport"),"clipboard":require("./features/clipboard"),"comparedocumentposition":require("./features/comparedocumentposition"),"console-basic":require("./features/console-basic"),"console-time":require("./features/console-time"),"const":require("./features/const"),"constraint-validation":require("./features/constraint-validation"),"contenteditable":require("./features/contenteditable"),"contentsecuritypolicy":require("./features/contentsecuritypolicy"),"contentsecuritypolicy2":require("./features/contentsecuritypolicy2"),"cors":require("./features/cors"),"createimagebitmap":require("./features/createimagebitmap"),"credential-management":require("./features/credential-management"),"cryptography":require("./features/cryptography"),"css-all":require("./features/css-all"),"css-animation":require("./features/css-animation"),"css-any-link":require("./features/css-any-link"),"css-appearance":require("./features/css-appearance"),"css-apply-rule":require("./features/css-apply-rule"),"css-at-counter-style":require("./features/css-at-counter-style"),"css-backdrop-filter":require("./features/css-backdrop-filter"),"css-background-offsets":require("./features/css-background-offsets"),"css-backgroundblendmode":require("./features/css-backgroundblendmode"),"css-boxdecorationbreak":require("./features/css-boxdecorationbreak"),"css-boxshadow":require("./features/css-boxshadow"),"css-canvas":require("./features/css-canvas"),"css-caret-color":require("./features/css-caret-color"),"css-case-insensitive":require("./features/css-case-insensitive"),"css-clip-path":require("./features/css-clip-path"),"css-color-adjust":require("./features/css-color-adjust"),"css-conic-gradients":require("./features/css-conic-gradients"),"css-containment":require("./features/css-containment"),"css-counters":require("./features/css-counters"),"css-crisp-edges":require("./features/css-crisp-edges"),"css-cross-fade":require("./features/css-cross-fade"),"css-default-pseudo":require("./features/css-default-pseudo"),"css-descendant-gtgt":require("./features/css-descendant-gtgt"),"css-deviceadaptation":require("./features/css-deviceadaptation"),"css-dir-pseudo":require("./features/css-dir-pseudo"),"css-display-contents":require("./features/css-display-contents"),"css-element-function":require("./features/css-element-function"),"css-env-function":require("./features/css-env-function"),"css-exclusions":require("./features/css-exclusions"),"css-featurequeries":require("./features/css-featurequeries"),"css-filter-function":require("./features/css-filter-function"),"css-filters":require("./features/css-filters"),"css-first-letter":require("./features/css-first-letter"),"css-first-line":require("./features/css-first-line"),"css-fixed":require("./features/css-fixed"),"css-focus-visible":require("./features/css-focus-visible"),"css-focus-within":require("./features/css-focus-within"),"css-font-rendering-controls":require("./features/css-font-rendering-controls"),"css-font-stretch":require("./features/css-font-stretch"),"css-gencontent":require("./features/css-gencontent"),"css-gradients":require("./features/css-gradients"),"css-grid":require("./features/css-grid"),"css-hanging-punctuation":require("./features/css-hanging-punctuation"),"css-has":require("./features/css-has"),"css-hyphenate":require("./features/css-hyphenate"),"css-hyphens":require("./features/css-hyphens"),"css-image-orientation":require("./features/css-image-orientation"),"css-image-set":require("./features/css-image-set"),"css-in-out-of-range":require("./features/css-in-out-of-range"),"css-indeterminate-pseudo":require("./features/css-indeterminate-pseudo"),"css-initial-letter":require("./features/css-initial-letter"),"css-initial-value":require("./features/css-initial-value"),"css-letter-spacing":require("./features/css-letter-spacing"),"css-line-clamp":require("./features/css-line-clamp"),"css-logical-props":require("./features/css-logical-props"),"css-marker-pseudo":require("./features/css-marker-pseudo"),"css-masks":require("./features/css-masks"),"css-matches-pseudo":require("./features/css-matches-pseudo"),"css-math-functions":require("./features/css-math-functions"),"css-media-interaction":require("./features/css-media-interaction"),"css-media-resolution":require("./features/css-media-resolution"),"css-media-scripting":require("./features/css-media-scripting"),"css-mediaqueries":require("./features/css-mediaqueries"),"css-mixblendmode":require("./features/css-mixblendmode"),"css-motion-paths":require("./features/css-motion-paths"),"css-namespaces":require("./features/css-namespaces"),"css-not-sel-list":require("./features/css-not-sel-list"),"css-nth-child-of":require("./features/css-nth-child-of"),"css-opacity":require("./features/css-opacity"),"css-optional-pseudo":require("./features/css-optional-pseudo"),"css-overflow-anchor":require("./features/css-overflow-anchor"),"css-overflow":require("./features/css-overflow"),"css-overscroll-behavior":require("./features/css-overscroll-behavior"),"css-page-break":require("./features/css-page-break"),"css-paged-media":require("./features/css-paged-media"),"css-paint-api":require("./features/css-paint-api"),"css-placeholder-shown":require("./features/css-placeholder-shown"),"css-placeholder":require("./features/css-placeholder"),"css-read-only-write":require("./features/css-read-only-write"),"css-rebeccapurple":require("./features/css-rebeccapurple"),"css-reflections":require("./features/css-reflections"),"css-regions":require("./features/css-regions"),"css-repeating-gradients":require("./features/css-repeating-gradients"),"css-resize":require("./features/css-resize"),"css-revert-value":require("./features/css-revert-value"),"css-rrggbbaa":require("./features/css-rrggbbaa"),"css-scroll-behavior":require("./features/css-scroll-behavior"),"css-scrollbar":require("./features/css-scrollbar"),"css-sel2":require("./features/css-sel2"),"css-sel3":require("./features/css-sel3"),"css-selection":require("./features/css-selection"),"css-shapes":require("./features/css-shapes"),"css-snappoints":require("./features/css-snappoints"),"css-sticky":require("./features/css-sticky"),"css-subgrid":require("./features/css-subgrid"),"css-supports-api":require("./features/css-supports-api"),"css-table":require("./features/css-table"),"css-text-align-last":require("./features/css-text-align-last"),"css-text-indent":require("./features/css-text-indent"),"css-text-justify":require("./features/css-text-justify"),"css-text-orientation":require("./features/css-text-orientation"),"css-text-spacing":require("./features/css-text-spacing"),"css-textshadow":require("./features/css-textshadow"),"css-touch-action-2":require("./features/css-touch-action-2"),"css-touch-action":require("./features/css-touch-action"),"css-transitions":require("./features/css-transitions"),"css-unicode-bidi":require("./features/css-unicode-bidi"),"css-unset-value":require("./features/css-unset-value"),"css-variables":require("./features/css-variables"),"css-widows-orphans":require("./features/css-widows-orphans"),"css-writing-mode":require("./features/css-writing-mode"),"css-zoom":require("./features/css-zoom"),"css3-attr":require("./features/css3-attr"),"css3-boxsizing":require("./features/css3-boxsizing"),"css3-colors":require("./features/css3-colors"),"css3-cursors-grab":require("./features/css3-cursors-grab"),"css3-cursors-newer":require("./features/css3-cursors-newer"),"css3-cursors":require("./features/css3-cursors"),"css3-tabsize":require("./features/css3-tabsize"),"currentcolor":require("./features/currentcolor"),"custom-elements":require("./features/custom-elements"),"custom-elementsv1":require("./features/custom-elementsv1"),"customevent":require("./features/customevent"),"datalist":require("./features/datalist"),"dataset":require("./features/dataset"),"datauri":require("./features/datauri"),"date-tolocaledatestring":require("./features/date-tolocaledatestring"),"details":require("./features/details"),"deviceorientation":require("./features/deviceorientation"),"devicepixelratio":require("./features/devicepixelratio"),"dialog":require("./features/dialog"),"dispatchevent":require("./features/dispatchevent"),"dnssec":require("./features/dnssec"),"do-not-track":require("./features/do-not-track"),"document-currentscript":require("./features/document-currentscript"),"document-evaluate-xpath":require("./features/document-evaluate-xpath"),"document-execcommand":require("./features/document-execcommand"),"document-scrollingelement":require("./features/document-scrollingelement"),"documenthead":require("./features/documenthead"),"dom-manip-convenience":require("./features/dom-manip-convenience"),"dom-range":require("./features/dom-range"),"domcontentloaded":require("./features/domcontentloaded"),"domfocusin-domfocusout-events":require("./features/domfocusin-domfocusout-events"),"dommatrix":require("./features/dommatrix"),"download":require("./features/download"),"dragndrop":require("./features/dragndrop"),"element-closest":require("./features/element-closest"),"element-from-point":require("./features/element-from-point"),"element-scroll-methods":require("./features/element-scroll-methods"),"eme":require("./features/eme"),"eot":require("./features/eot"),"es5":require("./features/es5"),"es6-class":require("./features/es6-class"),"es6-generators":require("./features/es6-generators"),"es6-module-dynamic-import":require("./features/es6-module-dynamic-import"),"es6-module":require("./features/es6-module"),"es6-number":require("./features/es6-number"),"es6-string-includes":require("./features/es6-string-includes"),"es6":require("./features/es6"),"eventsource":require("./features/eventsource"),"extended-system-fonts":require("./features/extended-system-fonts"),"feature-policy":require("./features/feature-policy"),"fetch":require("./features/fetch"),"fieldset-disabled":require("./features/fieldset-disabled"),"fileapi":require("./features/fileapi"),"filereader":require("./features/filereader"),"filereadersync":require("./features/filereadersync"),"filesystem":require("./features/filesystem"),"flac":require("./features/flac"),"flexbox-gap":require("./features/flexbox-gap"),"flexbox":require("./features/flexbox"),"flow-root":require("./features/flow-root"),"focusin-focusout-events":require("./features/focusin-focusout-events"),"focusoptions-preventscroll":require("./features/focusoptions-preventscroll"),"font-family-system-ui":require("./features/font-family-system-ui"),"font-feature":require("./features/font-feature"),"font-kerning":require("./features/font-kerning"),"font-loading":require("./features/font-loading"),"font-size-adjust":require("./features/font-size-adjust"),"font-smooth":require("./features/font-smooth"),"font-unicode-range":require("./features/font-unicode-range"),"font-variant-alternates":require("./features/font-variant-alternates"),"font-variant-east-asian":require("./features/font-variant-east-asian"),"font-variant-numeric":require("./features/font-variant-numeric"),"fontface":require("./features/fontface"),"form-attribute":require("./features/form-attribute"),"form-submit-attributes":require("./features/form-submit-attributes"),"form-validation":require("./features/form-validation"),"forms":require("./features/forms"),"fullscreen":require("./features/fullscreen"),"gamepad":require("./features/gamepad"),"geolocation":require("./features/geolocation"),"getboundingclientrect":require("./features/getboundingclientrect"),"getcomputedstyle":require("./features/getcomputedstyle"),"getelementsbyclassname":require("./features/getelementsbyclassname"),"getrandomvalues":require("./features/getrandomvalues"),"gyroscope":require("./features/gyroscope"),"hardwareconcurrency":require("./features/hardwareconcurrency"),"hashchange":require("./features/hashchange"),"heif":require("./features/heif"),"hevc":require("./features/hevc"),"hidden":require("./features/hidden"),"high-resolution-time":require("./features/high-resolution-time"),"history":require("./features/history"),"html-media-capture":require("./features/html-media-capture"),"html5semantic":require("./features/html5semantic"),"http-live-streaming":require("./features/http-live-streaming"),"http2":require("./features/http2"),"http3":require("./features/http3"),"iframe-sandbox":require("./features/iframe-sandbox"),"iframe-seamless":require("./features/iframe-seamless"),"iframe-srcdoc":require("./features/iframe-srcdoc"),"imagecapture":require("./features/imagecapture"),"ime":require("./features/ime"),"img-naturalwidth-naturalheight":require("./features/img-naturalwidth-naturalheight"),"imports":require("./features/imports"),"indeterminate-checkbox":require("./features/indeterminate-checkbox"),"indexeddb":require("./features/indexeddb"),"indexeddb2":require("./features/indexeddb2"),"inline-block":require("./features/inline-block"),"innertext":require("./features/innertext"),"input-autocomplete-onoff":require("./features/input-autocomplete-onoff"),"input-color":require("./features/input-color"),"input-datetime":require("./features/input-datetime"),"input-email-tel-url":require("./features/input-email-tel-url"),"input-event":require("./features/input-event"),"input-file-accept":require("./features/input-file-accept"),"input-file-directory":require("./features/input-file-directory"),"input-file-multiple":require("./features/input-file-multiple"),"input-inputmode":require("./features/input-inputmode"),"input-minlength":require("./features/input-minlength"),"input-number":require("./features/input-number"),"input-pattern":require("./features/input-pattern"),"input-placeholder":require("./features/input-placeholder"),"input-range":require("./features/input-range"),"input-search":require("./features/input-search"),"input-selection":require("./features/input-selection"),"insert-adjacent":require("./features/insert-adjacent"),"insertadjacenthtml":require("./features/insertadjacenthtml"),"internationalization":require("./features/internationalization"),"intersectionobserver-v2":require("./features/intersectionobserver-v2"),"intersectionobserver":require("./features/intersectionobserver"),"intl-pluralrules":require("./features/intl-pluralrules"),"intrinsic-width":require("./features/intrinsic-width"),"jpeg2000":require("./features/jpeg2000"),"jpegxr":require("./features/jpegxr"),"js-regexp-lookbehind":require("./features/js-regexp-lookbehind"),"json":require("./features/json"),"justify-content-space-evenly":require("./features/justify-content-space-evenly"),"kerning-pairs-ligatures":require("./features/kerning-pairs-ligatures"),"keyboardevent-charcode":require("./features/keyboardevent-charcode"),"keyboardevent-code":require("./features/keyboardevent-code"),"keyboardevent-getmodifierstate":require("./features/keyboardevent-getmodifierstate"),"keyboardevent-key":require("./features/keyboardevent-key"),"keyboardevent-location":require("./features/keyboardevent-location"),"keyboardevent-which":require("./features/keyboardevent-which"),"lazyload":require("./features/lazyload"),"let":require("./features/let"),"link-icon-png":require("./features/link-icon-png"),"link-icon-svg":require("./features/link-icon-svg"),"link-rel-dns-prefetch":require("./features/link-rel-dns-prefetch"),"link-rel-modulepreload":require("./features/link-rel-modulepreload"),"link-rel-preconnect":require("./features/link-rel-preconnect"),"link-rel-prefetch":require("./features/link-rel-prefetch"),"link-rel-preload":require("./features/link-rel-preload"),"link-rel-prerender":require("./features/link-rel-prerender"),"loading-lazy-attr":require("./features/loading-lazy-attr"),"localecompare":require("./features/localecompare"),"magnetometer":require("./features/magnetometer"),"matchesselector":require("./features/matchesselector"),"matchmedia":require("./features/matchmedia"),"mathml":require("./features/mathml"),"maxlength":require("./features/maxlength"),"media-attribute":require("./features/media-attribute"),"media-fragments":require("./features/media-fragments"),"media-session-api":require("./features/media-session-api"),"mediacapture-fromelement":require("./features/mediacapture-fromelement"),"mediarecorder":require("./features/mediarecorder"),"mediasource":require("./features/mediasource"),"menu":require("./features/menu"),"meta-theme-color":require("./features/meta-theme-color"),"meter":require("./features/meter"),"midi":require("./features/midi"),"minmaxwh":require("./features/minmaxwh"),"mp3":require("./features/mp3"),"mpeg-dash":require("./features/mpeg-dash"),"mpeg4":require("./features/mpeg4"),"multibackgrounds":require("./features/multibackgrounds"),"multicolumn":require("./features/multicolumn"),"mutation-events":require("./features/mutation-events"),"mutationobserver":require("./features/mutationobserver"),"namevalue-storage":require("./features/namevalue-storage"),"native-filesystem-api":require("./features/native-filesystem-api"),"nav-timing":require("./features/nav-timing"),"navigator-language":require("./features/navigator-language"),"netinfo":require("./features/netinfo"),"node-contains":require("./features/node-contains"),"node-parentelement":require("./features/node-parentelement"),"notifications":require("./features/notifications"),"object-entries":require("./features/object-entries"),"object-fit":require("./features/object-fit"),"object-observe":require("./features/object-observe"),"object-values":require("./features/object-values"),"objectrtc":require("./features/objectrtc"),"offline-apps":require("./features/offline-apps"),"offscreencanvas":require("./features/offscreencanvas"),"ogg-vorbis":require("./features/ogg-vorbis"),"ogv":require("./features/ogv"),"ol-reversed":require("./features/ol-reversed"),"once-event-listener":require("./features/once-event-listener"),"online-status":require("./features/online-status"),"opus":require("./features/opus"),"orientation-sensor":require("./features/orientation-sensor"),"outline":require("./features/outline"),"pad-start-end":require("./features/pad-start-end"),"page-transition-events":require("./features/page-transition-events"),"pagevisibility":require("./features/pagevisibility"),"passive-event-listener":require("./features/passive-event-listener"),"passwordrules":require("./features/passwordrules"),"path2d":require("./features/path2d"),"payment-request":require("./features/payment-request"),"permissions-api":require("./features/permissions-api"),"picture-in-picture":require("./features/picture-in-picture"),"picture":require("./features/picture"),"ping":require("./features/ping"),"png-alpha":require("./features/png-alpha"),"pointer-events":require("./features/pointer-events"),"pointer":require("./features/pointer"),"pointerlock":require("./features/pointerlock"),"prefers-color-scheme":require("./features/prefers-color-scheme"),"prefers-reduced-motion":require("./features/prefers-reduced-motion"),"private-class-fields":require("./features/private-class-fields"),"private-methods-and-accessors":require("./features/private-methods-and-accessors"),"progress":require("./features/progress"),"promise-finally":require("./features/promise-finally"),"promises":require("./features/promises"),"proximity":require("./features/proximity"),"proxy":require("./features/proxy"),"public-class-fields":require("./features/public-class-fields"),"publickeypinning":require("./features/publickeypinning"),"push-api":require("./features/push-api"),"queryselector":require("./features/queryselector"),"readonly-attr":require("./features/readonly-attr"),"referrer-policy":require("./features/referrer-policy"),"registerprotocolhandler":require("./features/registerprotocolhandler"),"rel-noopener":require("./features/rel-noopener"),"rel-noreferrer":require("./features/rel-noreferrer"),"rellist":require("./features/rellist"),"rem":require("./features/rem"),"replace-all":require("./features/replace-all"),"requestanimationframe":require("./features/requestanimationframe"),"requestidlecallback":require("./features/requestidlecallback"),"resizeobserver":require("./features/resizeobserver"),"resource-timing":require("./features/resource-timing"),"rest-parameters":require("./features/rest-parameters"),"rtcpeerconnection":require("./features/rtcpeerconnection"),"ruby":require("./features/ruby"),"run-in":require("./features/run-in"),"same-site-cookie-attribute":require("./features/same-site-cookie-attribute"),"screen-orientation":require("./features/screen-orientation"),"script-async":require("./features/script-async"),"script-defer":require("./features/script-defer"),"scrollintoview":require("./features/scrollintoview"),"scrollintoviewifneeded":require("./features/scrollintoviewifneeded"),"sdch":require("./features/sdch"),"selection-api":require("./features/selection-api"),"server-timing":require("./features/server-timing"),"serviceworkers":require("./features/serviceworkers"),"setimmediate":require("./features/setimmediate"),"sha-2":require("./features/sha-2"),"shadowdom":require("./features/shadowdom"),"shadowdomv1":require("./features/shadowdomv1"),"sharedarraybuffer":require("./features/sharedarraybuffer"),"sharedworkers":require("./features/sharedworkers"),"sni":require("./features/sni"),"spdy":require("./features/spdy"),"speech-recognition":require("./features/speech-recognition"),"speech-synthesis":require("./features/speech-synthesis"),"spellcheck-attribute":require("./features/spellcheck-attribute"),"sql-storage":require("./features/sql-storage"),"srcset":require("./features/srcset"),"stopimmediatepropagation":require("./features/stopimmediatepropagation"),"stream":require("./features/stream"),"streams":require("./features/streams"),"stricttransportsecurity":require("./features/stricttransportsecurity"),"style-scoped":require("./features/style-scoped"),"subresource-integrity":require("./features/subresource-integrity"),"svg-css":require("./features/svg-css"),"svg-filters":require("./features/svg-filters"),"svg-fonts":require("./features/svg-fonts"),"svg-fragment":require("./features/svg-fragment"),"svg-html":require("./features/svg-html"),"svg-html5":require("./features/svg-html5"),"svg-img":require("./features/svg-img"),"svg-smil":require("./features/svg-smil"),"svg":require("./features/svg"),"sxg":require("./features/sxg"),"symbols":require("./features/symbols"),"tabindex-attr":require("./features/tabindex-attr"),"template-literals":require("./features/template-literals"),"template":require("./features/template"),"testfeat":require("./features/testfeat"),"text-decoration":require("./features/text-decoration"),"text-emphasis":require("./features/text-emphasis"),"text-overflow":require("./features/text-overflow"),"text-size-adjust":require("./features/text-size-adjust"),"text-stroke":require("./features/text-stroke"),"text-underline-offset":require("./features/text-underline-offset"),"textcontent":require("./features/textcontent"),"textencoder":require("./features/textencoder"),"tls1-1":require("./features/tls1-1"),"tls1-2":require("./features/tls1-2"),"tls1-3":require("./features/tls1-3"),"token-binding":require("./features/token-binding"),"touch":require("./features/touch"),"transforms2d":require("./features/transforms2d"),"transforms3d":require("./features/transforms3d"),"trusted-types":require("./features/trusted-types"),"ttf":require("./features/ttf"),"typedarrays":require("./features/typedarrays"),"u2f":require("./features/u2f"),"unhandledrejection":require("./features/unhandledrejection"),"upgradeinsecurerequests":require("./features/upgradeinsecurerequests"),"url-scroll-to-text-fragment":require("./features/url-scroll-to-text-fragment"),"url":require("./features/url"),"urlsearchparams":require("./features/urlsearchparams"),"use-strict":require("./features/use-strict"),"user-select-none":require("./features/user-select-none"),"user-timing":require("./features/user-timing"),"variable-fonts":require("./features/variable-fonts"),"vibration":require("./features/vibration"),"video":require("./features/video"),"videotracks":require("./features/videotracks"),"viewport-units":require("./features/viewport-units"),"wai-aria":require("./features/wai-aria"),"wasm":require("./features/wasm"),"wav":require("./features/wav"),"wbr-element":require("./features/wbr-element"),"web-animation":require("./features/web-animation"),"web-app-manifest":require("./features/web-app-manifest"),"web-bluetooth":require("./features/web-bluetooth"),"web-share":require("./features/web-share"),"webauthn":require("./features/webauthn"),"webgl":require("./features/webgl"),"webgl2":require("./features/webgl2"),"webgpu":require("./features/webgpu"),"webhid":require("./features/webhid"),"webm":require("./features/webm"),"webp":require("./features/webp"),"websockets":require("./features/websockets"),"webusb":require("./features/webusb"),"webvr":require("./features/webvr"),"webvtt":require("./features/webvtt"),"webworkers":require("./features/webworkers"),"webxr":require("./features/webxr"),"will-change":require("./features/will-change"),"woff":require("./features/woff"),"woff2":require("./features/woff2"),"word-break":require("./features/word-break"),"wordwrap":require("./features/wordwrap"),"x-doc-messaging":require("./features/x-doc-messaging"),"x-frame-options":require("./features/x-frame-options"),"xhr2":require("./features/xhr2"),"xhtml":require("./features/xhtml"),"xhtmlsmil":require("./features/xhtmlsmil"),"xml-serializer":require("./features/xml-serializer")}; diff --git a/website/www/node_modules/caniuse-lite/data/features/aac.js b/website/www/node_modules/caniuse-lite/data/features/aac.js new file mode 100644 index 000000000000..551a50d44e97 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/aac.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X nB fB","132":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D","16":"A B"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"132":"M"},N:{"1":"A","2":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"132":"MC"}},B:6,C:"AAC audio file format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/abortcontroller.js b/website/www/node_modules/caniuse-lite/data/features/abortcontroller.js new file mode 100644 index 000000000000..a128bf1ac91d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/abortcontroller.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB"},E:{"1":"O S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB","130":"C L"},F:{"1":"3 4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"JC VB L","2":"G FC GC HC IC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"AbortController & AbortSignal"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ac3-ec3.js b/website/www/node_modules/caniuse-lite/data/features/ac3-ec3.js new file mode 100644 index 000000000000..5503f63d77d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ac3-ec3.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB","132":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","132":"A"},K:{"2":"A B C Q L EB","132":"S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"AC-3 (Dolby Digital) and EC-3 (Dolby Digital Plus) codecs"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/accelerometer.js b/website/www/node_modules/caniuse-lite/data/features/accelerometer.js new file mode 100644 index 000000000000..277f202e578c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/accelerometer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"8 9 TB AB FB CB DB BB w"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Accelerometer"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/addeventlistener.js b/website/www/node_modules/caniuse-lite/data/features/addeventlistener.js new file mode 100644 index 000000000000..c03356764719 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/addeventlistener.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","130":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","257":"qB GB G U I nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"EventTarget.addEventListener()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/alternate-stylesheet.js b/website/www/node_modules/caniuse-lite/data/features/alternate-stylesheet.js new file mode 100644 index 000000000000..0b440bd59199 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/alternate-stylesheet.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"I F gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"D B C jB kB lB mB L EB oB S","16":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"16":"N"},M:{"16":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"16":"LC"},S:{"1":"MC"}},B:1,C:"Alternate stylesheet"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ambient-light.js b/website/www/node_modules/caniuse-lite/data/features/ambient-light.js new file mode 100644 index 000000000000..436530880968 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ambient-light.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O","132":"T P H J K","322":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X nB fB","132":"0 1 2 3 4 5 6 7 8 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB","194":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","322":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"132":"MC"}},B:4,C:"Ambient Light Sensor"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/apng.js b/website/www/node_modules/caniuse-lite/data/features/apng.js new file mode 100644 index 000000000000..539c422f587e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/apng.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"1":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:7,C:"Animated PNG (APNG)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/array-find-index.js b/website/www/node_modules/caniuse-lite/data/features/array-find-index.js new file mode 100644 index 000000000000..2fd09af2de02 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/array-find-index.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","16":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G U I F xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","16":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Array.prototype.findIndex"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/array-find.js b/website/www/node_modules/caniuse-lite/data/features/array-find.js new file mode 100644 index 000000000000..a3e064bac03b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/array-find.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","16":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G U I F xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","16":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Array.prototype.find"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/array-flat.js b/website/www/node_modules/caniuse-lite/data/features/array-flat.js new file mode 100644 index 000000000000..59bd56a12bca --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/array-flat.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB nB fB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M"},E:{"1":"C O S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB L"},F:{"1":"6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 4 5 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"flat & flatMap array methods"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/array-includes.js b/website/www/node_modules/caniuse-lite/data/features/array-includes.js new file mode 100644 index 000000000000..c348b703be7c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/array-includes.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Array.prototype.includes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/arrow-functions.js b/website/www/node_modules/caniuse-lite/data/features/arrow-functions.js new file mode 100644 index 000000000000..57ac28c427e6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/arrow-functions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Arrow functions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/asmjs.js b/website/www/node_modules/caniuse-lite/data/features/asmjs.js new file mode 100644 index 000000000000..59a03cdb431d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/asmjs.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K","132":"UB IB N","322":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d","132":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","132":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","132":"Q"},L:{"132":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","132":"FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:6,C:"asm.js"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/async-clipboard.js b/website/www/node_modules/caniuse-lite/data/features/async-clipboard.js new file mode 100644 index 000000000000..ea9bde78a333 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/async-clipboard.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","66":"8 TB AB FB"},E:{"1":"hB iB","2":"G U I F E D A B C O xB WB aB bB cB dB VB L S"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x jB kB lB mB L EB oB S","16":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M"},G:{"1":"6B","2":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B","16":"WB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Asynchronous Clipboard API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/async-functions.js b/website/www/node_modules/caniuse-lite/data/features/async-functions.js new file mode 100644 index 000000000000..a6e1eee81d0a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/async-functions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O","194":"T"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB","514":"VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB","514":"yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Async functions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/async-iterations-and-generators.js b/website/www/node_modules/caniuse-lite/data/features/async-iterations-and-generators.js new file mode 100644 index 000000000000..30b2460a2370 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/async-iterations-and-generators.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"1":"C O S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Async iterators and generators"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/atob-btoa.js b/website/www/node_modules/caniuse-lite/data/features/atob-btoa.js new file mode 100644 index 000000000000..89d946fb4d21 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/atob-btoa.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB kB","16":"lB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","16":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Base64 encoding and decoding"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/audio-api.js b/website/www/node_modules/caniuse-lite/data/features/audio-api.js new file mode 100644 index 000000000000..b92169a7bf18 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/audio-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D","33":"A B C O T P H J K V W X Y Z a b c d e f g h i j"},E:{"2":"G U xB WB aB","33":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X"},G:{"2":"WB pB HB rB","33":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Web Audio API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/audio.js b/website/www/node_modules/caniuse-lite/data/features/audio.js new file mode 100644 index 000000000000..6e59ca796f1f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/audio.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","132":"G U I F E D A B C O T P H J K V nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D","4":"jB kB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","2":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Audio element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/audiotracks.js b/website/www/node_modules/caniuse-lite/data/features/audiotracks.js new file mode 100644 index 000000000000..ee55da5ddb92 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/audiotracks.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K","322":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","194":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u","322":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U I xB WB aB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S","322":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","322":"Q"},L:{"322":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"194":"MC"}},B:1,C:"Audio Tracks"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/autofocus.js b/website/www/node_modules/caniuse-lite/data/features/autofocus.js new file mode 100644 index 000000000000..1ea817aea62a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/autofocus.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"Autofocus attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/aux-click.js b/website/www/node_modules/caniuse-lite/data/features/aux-click.js new file mode 100644 index 000000000000..6f3288852698 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/aux-click.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"K C G E A B CB"},B:{"2":"D v Z I M H"},C:{"2":"VB y F J K C G E A B D v Z I M H N O P Q R S T U V W X Y x a b c d e f L h i j k l m n o p q r s t u z TB SB","129":"0 1 2 3 5 6 7 w"},D:{"1":"2 3 5 6 7 w HB g DB XB EB FB","2":"0 1 F J K C G E A B D v Z I M H N O P Q R S T U V W X Y x a b c d e f L h i j k l m n o p q r s t u z"},E:{"2":"F J K C G E A B GB AB IB JB KB LB MB NB"},F:{"1":"l m n o p q r s t u","2":"8 9 E B D I M H N O P Q R S T U V W X Y x a b c d e f L h i j k OB PB QB RB UB BB"},G:{"2":"4 G AB WB YB ZB aB bB cB dB eB fB gB"},H:{"2":"hB"},I:{"1":"g","2":"4 y F iB jB kB lB mB nB"},J:{"2":"C","16":"A"},K:{"2":"8 9 A B D L BB"},L:{"1":"g"},M:{"2":"w"},N:{"2":"A B"},O:{"16":"oB"},P:{"1":"J pB","16":"F"},Q:{"16":"qB"},R:{"1":"rB"}},B:5,C:"Auxclick"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/auxclick.js b/website/www/node_modules/caniuse-lite/data/features/auxclick.js new file mode 100644 index 000000000000..145516c0a956 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/auxclick.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","129":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","16":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"Auxclick"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/av1.js b/website/www/node_modules/caniuse-lite/data/features/av1.js new file mode 100644 index 000000000000..043ed96234d5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/av1.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J","194":"K"},C:{"1":"R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","1090":"DB BB","1284":"9","1540":"w","2114":"5 6 7 8 TB AB","3138":"FB CB"},D:{"1":"KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w","4162":"R M JB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"7 8 9 AB CB DB BB w R M","2":"0 1 2 3 4 5 6 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1090":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"AV1 video format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/avif.js b/website/www/node_modules/caniuse-lite/data/features/avif.js new file mode 100644 index 000000000000..f4d8d7925479 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/avif.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB nB fB","194":"RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"AVIF image format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-attachment.js b/website/www/node_modules/caniuse-lite/data/features/background-attachment.js new file mode 100644 index 000000000000..98ccad717035 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-attachment.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","132":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","132":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","132":"D jB kB"},G:{"2":"WB pB HB","772":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC CC DC","132":"BC HB"},J:{"260":"F A"},K:{"1":"B C Q L EB S","132":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"2":"G","1028":"FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1028":"LC"},S:{"1":"MC"}},B:4,C:"CSS background-attachment"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-clip-text.js b/website/www/node_modules/caniuse-lite/data/features/background-clip-text.js new file mode 100644 index 000000000000..5d5f6bf54052 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-clip-text.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"36":"UB IB N","257":"P H J K","548":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB","130":"y"},D:{"36":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"16":"xB WB","36":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"16":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"16":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"16":"N"},M:{"16":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"130":"MC"}},B:1,C:"CSS3 Background-clip: text"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-img-opts.js b/website/www/node_modules/caniuse-lite/data/features/background-img-opts.js new file mode 100644 index 000000000000..7a976937987a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-img-opts.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","36":"fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","516":"G U I F E D A B C O T"},E:{"1":"F E D A B C O cB dB VB L S hB iB","772":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB","36":"kB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","4":"WB pB HB sB","516":"rB"},H:{"132":"7B"},I:{"1":"N CC DC","36":"8B","516":"GB G BC HB","548":"9B AC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 Background-image options"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-position-x-y.js b/website/www/node_modules/caniuse-lite/data/features/background-position-x-y.js new file mode 100644 index 000000000000..760a6a7181b5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-position-x-y.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"background-position-x & background-position-y"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-repeat-round-space.js b/website/www/node_modules/caniuse-lite/data/features/background-repeat-round-space.js new file mode 100644 index 000000000000..8c7a9c58c7e9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-repeat-round-space.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E gB","132":"D"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D P H J K jB kB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:4,C:"CSS background-repeat round and space"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/background-sync.js b/website/www/node_modules/caniuse-lite/data/features/background-sync.js new file mode 100644 index 000000000000..53234f6b0e55 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/background-sync.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB nB fB","16":"RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Background Sync API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/battery-status.js b/website/www/node_modules/caniuse-lite/data/features/battery-status.js new file mode 100644 index 000000000000..135c89783097 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/battery-status.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 t u v Q x y z","2":"2 3 4 5 6 7 8 9 qB GB G U I F E D TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","132":"H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","164":"A B C O T P"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m","66":"n"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Battery Status API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/beacon.js b/website/www/node_modules/caniuse-lite/data/features/beacon.js new file mode 100644 index 000000000000..4da8c59d872a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/beacon.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Beacon API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/beforeafterprint.js b/website/www/node_modules/caniuse-lite/data/features/beforeafterprint.js new file mode 100644 index 000000000000..8d7f2bad3cc0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/beforeafterprint.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"2":"FC GC HC IC JC VB L","16":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"Printing Events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/bigint.js b/website/www/node_modules/caniuse-lite/data/features/bigint.js new file mode 100644 index 000000000000..2910f8696e6f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/bigint.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB","194":"9 w R"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"JC VB L","2":"G FC GC HC IC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"BigInt"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/blobbuilder.js b/website/www/node_modules/caniuse-lite/data/features/blobbuilder.js new file mode 100644 index 000000000000..9d521d5a6237 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/blobbuilder.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB","36":"I F E D A B C"},D:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F","36":"E D A B C O T P H J K V"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"N","2":"8B 9B AC","36":"GB G BC HB CC DC"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Blob constructing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/bloburls.js b/website/www/node_modules/caniuse-lite/data/features/bloburls.js new file mode 100644 index 000000000000..a15b7a13bb9c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/bloburls.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","129":"A B"},B:{"1":"P H J K UB IB N","129":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F","33":"E D A B C O T P H J K V W X Y"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","33":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","33":"sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB 8B 9B AC","33":"G BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Blob URLs"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/border-image.js b/website/www/node_modules/caniuse-lite/data/features/border-image.js new file mode 100644 index 000000000000..faab37b78c22 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/border-image.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"T P H J K UB IB N","129":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","260":"P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","804":"G U I F E D A B C O T nB fB"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","260":"1 2 3 4 5","388":"0 g h i j k l m n o p q r s t u v Q x y z","1412":"P H J K V W X Y Z a b c d e f","1956":"G U I F E D A B C O T"},E:{"129":"A B C O dB VB L S hB iB","1412":"I F E D bB cB","1956":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D jB kB","260":"o p q r s","388":"P H J K V W X Y Z a b c d e f g h i j k l m n","1796":"lB mB","1828":"B C L EB oB S"},G:{"129":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","1412":"E sB tB uB vB","1956":"WB pB HB rB"},H:{"1828":"7B"},I:{"388":"N CC DC","1956":"GB G 8B 9B AC BC HB"},J:{"1412":"A","1924":"F"},K:{"2":"A","388":"Q","1828":"B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"388":"EC"},P:{"1":"HC IC JC VB L","260":"FC GC","388":"G"},Q:{"260":"KC"},R:{"260":"LC"},S:{"260":"MC"}},B:4,C:"CSS3 Border images"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/border-radius.js b/website/www/node_modules/caniuse-lite/data/features/border-radius.js new file mode 100644 index 000000000000..e058552aed96 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/border-radius.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","257":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","289":"GB nB fB","292":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G"},E:{"1":"U F E D A B C O cB dB VB L S hB iB","33":"G xB WB","129":"I aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"WB"},H:{"2":"7B"},I:{"1":"GB G N 9B AC BC HB CC DC","33":"8B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"257":"MC"}},B:4,C:"CSS3 Border-radius (rounded corners)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/broadcastchannel.js b/website/www/node_modules/caniuse-lite/data/features/broadcastchannel.js new file mode 100644 index 000000000000..ab5aa6c1eccd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/broadcastchannel.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"BroadcastChannel"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/brotli.js b/website/www/node_modules/caniuse-lite/data/features/brotli.js new file mode 100644 index 000000000000..8bb2cb03d1a7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/brotli.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t nB fB"},D:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y","194":"z","257":"0"},E:{"1":"O hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","513":"B C L S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S","194":"m n"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","257":"N"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:6,C:"Brotli Accept-Encoding/Content-Encoding"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/calc.js b/website/www/node_modules/caniuse-lite/data/features/calc.js new file mode 100644 index 000000000000..81015876413d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/calc.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","260":"D","516":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"G U I F E D A B C O T P"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K","33":"V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","33":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","33":"sB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","132":"CC DC"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"calc() as CSS unit value"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/canvas-blending.js b/website/www/node_modules/caniuse-lite/data/features/canvas-blending.js new file mode 100644 index 000000000000..1e4ca8889622 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/canvas-blending.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U I xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Canvas blend modes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/canvas-text.js b/website/www/node_modules/caniuse-lite/data/features/canvas-text.js new file mode 100644 index 000000000000..51bdbaa22c31 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/canvas-text.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","8":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","8":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","8":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","8":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Text API for Canvas"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/canvas.js b/website/www/node_modules/caniuse-lite/data/features/canvas.js new file mode 100644 index 000000000000..17976aa4f44a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/canvas.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","132":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","132":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"260":"7B"},I:{"1":"GB G N BC HB CC DC","132":"8B 9B AC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Canvas (basic support)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ch-unit.js b/website/www/node_modules/caniuse-lite/data/features/ch-unit.js new file mode 100644 index 000000000000..62a51334d898 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ch-unit.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"ch (character) unit"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/chacha20-poly1305.js b/website/www/node_modules/caniuse-lite/data/features/chacha20-poly1305.js new file mode 100644 index 000000000000..2a6bd9efb774 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/chacha20-poly1305.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i","129":"j k l m n o p q r s t u v Q x y"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC","16":"DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ChaCha20-Poly1305 cipher suites for TLS"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/channel-messaging.js b/website/www/node_modules/caniuse-lite/data/features/channel-messaging.js new file mode 100644 index 000000000000..945056714368 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/channel-messaging.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b nB fB","194":"c d e f g h i j k l m n o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB kB","16":"lB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Channel messaging"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/childnode-remove.js b/website/www/node_modules/caniuse-lite/data/features/childnode-remove.js new file mode 100644 index 000000000000..61bd155fd680 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/childnode-remove.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","16":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"ChildNode.remove()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/classlist.js b/website/www/node_modules/caniuse-lite/data/features/classlist.js new file mode 100644 index 000000000000..bf5f987f1c0f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/classlist.js @@ -0,0 +1 @@ +module.exports={A:{A:{"8":"I F E D gB","1924":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB nB","516":"a b","772":"G U I F E D A B C O T P H J K V W X Y Z fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G U I F","516":"a b c d","772":"Z","900":"E D A B C O T P H J K V W X Y"},E:{"1":"F E D A B C O cB dB VB L S hB iB","8":"G U xB WB","900":"I aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","8":"D B jB kB lB mB L","900":"C EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB","900":"rB sB"},H:{"900":"7B"},I:{"1":"N CC DC","8":"8B 9B AC","900":"GB G BC HB"},J:{"1":"A","900":"F"},K:{"1":"Q","8":"A B","900":"C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"900":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"classList (DOMTokenList)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/clear-site-data-header.js b/website/www/node_modules/caniuse-lite/data/features/clear-site-data-header.js new file mode 100644 index 000000000000..140470ca8779 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/clear-site-data-header.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"I F E D A B gB"},B:{"1":"UB IB N","16":"C O T P H J K"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB"},E:{"16":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","16":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x jB kB lB mB L EB oB S"},G:{"16":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"1":"N","16":"GB G 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"16":"MC"}},B:5,C:"Clear-Site-Data Header"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js b/website/www/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js new file mode 100644 index 000000000000..d4d0d6f9131b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:6,C:"Client Hints: DPR, Width, Viewport-Width"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/clipboard.js b/website/www/node_modules/caniuse-lite/data/features/clipboard.js new file mode 100644 index 000000000000..eae0d16eba5d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/clipboard.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2436":"I F E D A B gB"},B:{"260":"J K","2436":"C O T P H","10244":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X nB fB","772":"Y Z a b c d e f g h i j k l m n o p q","4100":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C","2564":"O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","10244":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"C O S hB iB","16":"xB WB","2308":"A B VB L","2820":"G U I F E D aB bB cB dB"},F:{"2":"D B jB kB lB mB L EB oB","16":"C","516":"S","2564":"P H J K V W X Y Z a b c d e f","10244":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"1B 2B 3B 4B 5B 6B","2":"WB pB HB","2820":"E rB sB tB uB vB wB XB yB zB 0B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","2308":"N CC DC"},J:{"2":"F","2308":"A"},K:{"2":"A B C L EB","16":"S","3076":"Q"},L:{"2052":"N"},M:{"1028":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2052":"FC GC HC IC JC VB L","2308":"G"},Q:{"10244":"KC"},R:{"2052":"LC"},S:{"4100":"MC"}},B:5,C:"Synchronous Clipboard API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/comparedocumentposition.js b/website/www/node_modules/caniuse-lite/data/features/comparedocumentposition.js new file mode 100644 index 000000000000..27826744e80b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/comparedocumentposition.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","132":"P H J K V W X Y Z a b c d e f"},E:{"1":"A B C O VB L S hB iB","16":"G U I xB WB","132":"F E D bB cB dB","260":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","16":"D B jB kB lB mB L EB","132":"P H"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB","132":"E pB HB rB sB tB uB vB wB"},H:{"1":"7B"},I:{"1":"N CC DC","16":"8B 9B","132":"GB G AC BC HB"},J:{"132":"F A"},K:{"1":"C Q S","16":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Node.compareDocumentPosition()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/console-basic.js b/website/www/node_modules/caniuse-lite/data/features/console-basic.js new file mode 100644 index 000000000000..6a6e58d00509 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/console-basic.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F gB","132":"E D"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D jB kB lB mB"},G:{"1":"WB pB HB rB","513":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"4097":"7B"},I:{"1025":"GB G N 8B 9B AC BC HB CC DC"},J:{"258":"F A"},K:{"2":"A","258":"B C Q L EB S"},L:{"1025":"N"},M:{"2049":"M"},N:{"258":"A B"},O:{"258":"EC"},P:{"1025":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1025":"LC"},S:{"1":"MC"}},B:1,C:"Basic console logging functions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/console-time.js b/website/www/node_modules/caniuse-lite/data/features/console-time.js new file mode 100644 index 000000000000..66b33ce5b75f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/console-time.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D jB kB lB mB","16":"B"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"Q","16":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"console.time and console.timeEnd"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/const.js b/website/www/node_modules/caniuse-lite/data/features/const.js new file mode 100644 index 000000000000..b09b84f41699 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/const.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","2052":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C nB fB","260":"O T P H J K V W X Y Z a b c d e f g h i j k l"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","260":"G U I F E D A B C O T P H J K V W","772":"X Y Z a b c d e f g h i j k l m n o p q","1028":"r s t u v Q x y"},E:{"1":"A B C O VB L S hB iB","260":"G U xB WB","772":"I F E D aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D jB","132":"B kB lB mB L EB","644":"C oB S","772":"P H J K V W X Y Z a b c d","1028":"e f g h i j k l"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","260":"WB pB HB","772":"E rB sB tB uB vB wB"},H:{"644":"7B"},I:{"1":"N","16":"8B 9B","260":"AC","772":"GB G BC HB CC DC"},J:{"772":"F A"},K:{"1":"Q","132":"A B L EB","644":"C S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","1028":"G"},Q:{"772":"KC"},R:{"1028":"LC"},S:{"1":"MC"}},B:6,C:"const"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/constraint-validation.js b/website/www/node_modules/caniuse-lite/data/features/constraint-validation.js new file mode 100644 index 000000000000..915f2fcb8331 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/constraint-validation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","900":"A B"},B:{"1":"J K UB IB N","388":"T P H","900":"C O"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","260":"0 z","388":"f g h i j k l m n o p q r s t u v Q x y","900":"G U I F E D A B C O T P H J K V W X Y Z a b c d e"},D:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","388":"b c d e f g h i j k l m n o p","900":"P H J K V W X Y Z a"},E:{"1":"A B C O VB L S hB iB","16":"G U xB WB","388":"E D cB dB","900":"I F aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B jB kB lB mB L EB","388":"P H J K V W X Y Z a b c","900":"C oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB","388":"E tB uB vB wB","900":"rB sB"},H:{"2":"7B"},I:{"1":"N","16":"GB 8B 9B AC","388":"CC DC","900":"G BC HB"},J:{"16":"F","388":"A"},K:{"1":"Q","16":"A B L EB","900":"C S"},L:{"1":"N"},M:{"1":"M"},N:{"900":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"388":"KC"},R:{"1":"LC"},S:{"388":"MC"}},B:1,C:"Constraint Validation API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/contenteditable.js b/website/www/node_modules/caniuse-lite/data/features/contenteditable.js new file mode 100644 index 000000000000..a83a25f6f187 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/contenteditable.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB","4":"GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"contenteditable attribute (basic support)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js b/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js new file mode 100644 index 000000000000..0f651ab264c1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","129":"G U I F E D A B C O T P H J K V W X Y"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O","257":"T P H J K V W X Y Z a"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U xB WB","257":"I bB","260":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","257":"sB","260":"rB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F","257":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"257":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Content Security Policy 1.0"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js b/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js new file mode 100644 index 000000000000..bb630ee8a418 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T","32772":"P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB","132":"h i j k","260":"l","516":"m n o p q r s t u","8196":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l","1028":"m n o","2052":"p"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y jB kB lB mB L EB oB S","1028":"Z a b","2052":"c"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"4100":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"8196":"MC"}},B:4,C:"Content Security Policy Level 2"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/cors.js b/website/www/node_modules/caniuse-lite/data/features/cors.js new file mode 100644 index 000000000000..e8c903f87161 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/cors.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F gB","132":"A","260":"E D"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB LB MB NB OB PB QB RB SB nB fB","2":"qB GB","1025":"9 FB CB DB BB w R M JB KB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C"},E:{"2":"xB WB","513":"I F E D A B C O bB cB dB VB L S hB iB","644":"G U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB"},G:{"513":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","644":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"N CC DC","132":"GB G 8B 9B AC BC HB"},J:{"1":"A","132":"F"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","132":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Cross-Origin Resource Sharing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/createimagebitmap.js b/website/www/node_modules/caniuse-lite/data/features/createimagebitmap.js new file mode 100644 index 000000000000..5051444b1c9e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/createimagebitmap.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r nB fB","3076":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","132":"0 1","260":"2 3","516":"4 5 6 7 8"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S","16":"hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m jB kB lB mB L EB oB S","132":"n o","260":"p q","516":"r s t u v"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"3076":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","16":"G FC"},Q:{"1":"KC"},R:{"2":"LC"},S:{"3076":"MC"}},B:1,C:"createImageBitmap"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/credential-management.js b/website/www/node_modules/caniuse-lite/data/features/credential-management.js new file mode 100644 index 000000000000..d2fcd2a96073 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/credential-management.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x","66":"0 y z","129":"1 2 3 4 5 6"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Credential Management API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/cryptography.js b/website/www/node_modules/caniuse-lite/data/features/cryptography.js new file mode 100644 index 000000000000..01f8705157d4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/cryptography.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E D A","164":"B"},B:{"1":"UB IB N","1025":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h nB fB","322":"i j"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},E:{"1":"B C O L S hB iB","8":"G U I F xB WB aB bB","545":"E D A cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","8":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB rB sB tB","545":"E uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","8":"GB G 8B 9B AC BC HB CC DC"},J:{"8":"F A"},K:{"1":"Q","8":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A","164":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Web Cryptography"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-all.js b/website/www/node_modules/caniuse-lite/data/features/css-all.js new file mode 100644 index 000000000000..1b6357e907ed --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-all.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB CC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS all property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-animation.js b/website/www/node_modules/caniuse-lite/data/features/css-animation.js new file mode 100644 index 000000000000..66845626f845 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-animation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G nB fB","33":"U I F E D A B C O T P"},D:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s"},E:{"1":"D A B C O dB VB L S hB iB","2":"xB WB","33":"I F E aB bB cB","292":"G U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","33":"C P H J K V W X Y Z a b c d e f"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"E sB tB uB","164":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"N","33":"G BC HB CC DC","164":"GB 8B 9B AC"},J:{"33":"F A"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS Animation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-any-link.js b/website/www/node_modules/caniuse-lite/data/features/css-any-link.js new file mode 100644 index 000000000000..31be370f13a5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-any-link.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB","33":"GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","33":"0 1 2 3 4 5 6 7 8 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB"},E:{"1":"D A B C O dB VB L S hB iB","16":"G U I xB WB aB","33":"F E bB cB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"0 1 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB","33":"E sB tB uB"},H:{"2":"7B"},I:{"1":"N","16":"GB G 8B 9B AC BC HB","33":"CC DC"},J:{"16":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"33":"EC"},P:{"1":"JC VB L","16":"G","33":"FC GC HC IC"},Q:{"1":"KC"},R:{"1":"LC"},S:{"33":"MC"}},B:5,C:"CSS :any-link selector"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-appearance.js b/website/www/node_modules/caniuse-lite/data/features/css-appearance.js new file mode 100644 index 000000000000..10fd49883aa3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-appearance.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"164":"UB IB N","388":"C O T P H J K"},C:{"164":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","676":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k nB fB"},D:{"132":"ZB YB","164":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB"},E:{"164":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","164":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"164":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"164":"GB G N 8B 9B AC BC HB CC DC"},J:{"164":"F A"},K:{"2":"A B C L EB S","164":"Q"},L:{"164":"N"},M:{"164":"M"},N:{"2":"A","388":"B"},O:{"164":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"164":"MC"}},B:5,C:"CSS Appearance"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-apply-rule.js b/website/www/node_modules/caniuse-lite/data/features/css-apply-rule.js new file mode 100644 index 000000000000..e5182acff0f6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-apply-rule.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","194":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB S","194":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","194":"Q"},L:{"194":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","194":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"194":"LC"},S:{"2":"MC"}},B:7,C:"CSS @apply rule"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-at-counter-style.js b/website/www/node_modules/caniuse-lite/data/features/css-at-counter-style.js new file mode 100644 index 000000000000..4ccd2026dcc9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-at-counter-style.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","132":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"132":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"132":"MC"}},B:4,C:"CSS Counter Styles"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-backdrop-filter.js b/website/www/node_modules/caniuse-lite/data/features/css-backdrop-filter.js new file mode 100644 index 000000000000..8b5b5214c093 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-backdrop-filter.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H","257":"J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB nB fB","578":"KB LB MB NB OB PB QB RB SB"},D:{"1":"QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q","194":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB"},E:{"2":"G U I F E xB WB aB bB cB","33":"D A B C O dB VB L S hB iB"},F:{"1":"9 BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j jB kB lB mB L EB oB S","194":"0 1 2 3 4 5 6 7 8 k l m n o p q r s t u v Q x y z AB CB DB"},G:{"2":"E WB pB HB rB sB tB uB","33":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","194":"Q"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","194":"FC GC HC IC JC VB L"},Q:{"194":"KC"},R:{"194":"LC"},S:{"2":"MC"}},B:7,C:"CSS Backdrop Filter"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-background-offsets.js b/website/www/node_modules/caniuse-lite/data/features/css-background-offsets.js new file mode 100644 index 000000000000..e94acc9916b6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-background-offsets.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS background-position edge offsets"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js b/website/www/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js new file mode 100644 index 000000000000..1983569b26fc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k","260":"Q"},E:{"1":"B C O VB L S hB iB","2":"G U I F xB WB aB bB","132":"E D A cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X jB kB lB mB L EB oB S","260":"j"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","132":"E uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","260":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS background-blend-mode"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js b/website/www/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js new file mode 100644 index 000000000000..7c959c86c713 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","164":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X","164":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I xB WB aB","164":"F E D A B C O bB cB dB VB L S hB iB"},F:{"2":"D jB kB lB mB","129":"B C L EB oB S","164":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB rB sB","164":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"132":"7B"},I:{"2":"GB G 8B 9B AC BC HB","164":"N CC DC"},J:{"2":"F","164":"A"},K:{"2":"A","129":"B C L EB S","164":"Q"},L:{"164":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"1":"MC"}},B:5,C:"CSS box-decoration-break"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-boxshadow.js b/website/www/node_modules/caniuse-lite/data/features/css-boxshadow.js new file mode 100644 index 000000000000..c4001d33b83e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-boxshadow.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","33":"nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","33":"U","164":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"pB HB","164":"WB"},H:{"2":"7B"},I:{"1":"G N BC HB CC DC","164":"GB 8B 9B AC"},J:{"1":"A","33":"F"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 Box-shadow"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-canvas.js b/website/www/node_modules/caniuse-lite/data/features/css-canvas.js new file mode 100644 index 000000000000..06cbd1f2e474 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-canvas.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","16":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x"},E:{"2":"xB WB","33":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","33":"P H J K V W X Y Z a b c d e f g h i j k"},G:{"33":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"N","33":"GB G 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"FC GC HC IC JC VB L","33":"G"},Q:{"33":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"CSS Canvas Drawings"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-caret-color.js b/website/www/node_modules/caniuse-lite/data/features/css-caret-color.js new file mode 100644 index 000000000000..92c63f0deb4e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-caret-color.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"CSS caret-color"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-case-insensitive.js b/website/www/node_modules/caniuse-lite/data/features/css-case-insensitive.js new file mode 100644 index 000000000000..801ed554c9c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-case-insensitive.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:5,C:"Case-insensitive CSS attribute selectors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-clip-path.js b/website/www/node_modules/caniuse-lite/data/features/css-clip-path.js new file mode 100644 index 000000000000..feaaedc87570 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-clip-path.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J","260":"UB IB N","3138":"K"},C:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB","644":"0 1 2 3 x y z"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z","260":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","292":"0 1 2 3 4 a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"2":"G U I xB WB aB bB","292":"F E D A B C O cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","260":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","292":"P H J K V W X Y Z a b c d e f g h i j k l m n o p q r"},G:{"2":"WB pB HB rB sB","292":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","260":"N","292":"CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","292":"Q"},L:{"260":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"292":"EC"},P:{"292":"G FC GC HC IC JC VB L"},Q:{"292":"KC"},R:{"260":"LC"},S:{"644":"MC"}},B:4,C:"CSS clip-path property (for HTML)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-color-adjust.js b/website/www/node_modules/caniuse-lite/data/features/css-color-adjust.js new file mode 100644 index 000000000000..70ed02ebc1c2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-color-adjust.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","33":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB"},D:{"16":"G U I F E D A B C O T P H J K","33":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U xB WB aB","33":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"16":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"2":"A B C Q L EB S"},L:{"16":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"1":"MC"}},B:5,C:"CSS color-adjust"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-conic-gradients.js b/website/www/node_modules/caniuse-lite/data/features/css-conic-gradients.js new file mode 100644 index 000000000000..545d9cabed3f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-conic-gradients.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB nB fB","578":"PB QB RB SB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"9 TB AB FB CB DB BB w R M"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"9 BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v jB kB lB mB L EB oB S","194":"0 1 2 3 4 5 6 7 8 Q x y z AB CB DB"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Conical Gradients"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-containment.js b/website/www/node_modules/caniuse-lite/data/features/css-containment.js new file mode 100644 index 000000000000..caabd43cde22 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-containment.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q nB fB","322":"0 1 r s t u v Q x y z","336":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M"},D:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"1"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB S","194":"o p"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"322":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"322":"MC"}},B:4,C:"CSS Containment"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-counters.js b/website/www/node_modules/caniuse-lite/data/features/css-counters.js new file mode 100644 index 000000000000..ec12654da47b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-counters.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"I F gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS Counters"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-crisp-edges.js b/website/www/node_modules/caniuse-lite/data/features/css-crisp-edges.js new file mode 100644 index 000000000000..590d4aa2c9ed --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-crisp-edges.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I gB","2340":"F E D A B"},B:{"2":"C O T P H J K","1025":"UB IB N"},C:{"2":"qB GB nB","513":"9 w R M JB KB LB MB NB OB PB QB RB SB","545":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","1025":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","2":"G U xB WB aB","164":"I","4644":"F E D bB cB dB"},F:{"2":"D B P H J K V W X Y Z a b c d jB kB lB mB L EB","545":"C oB S","1025":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","4260":"rB sB","4644":"E tB uB vB wB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","1025":"N"},J:{"2":"F","4260":"A"},K:{"2":"A B L EB","545":"C S","1025":"Q"},L:{"1025":"N"},M:{"545":"M"},N:{"2340":"A B"},O:{"1":"EC"},P:{"1025":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1025":"LC"},S:{"4097":"MC"}},B:7,C:"Crisp edges/pixelated images"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-cross-fade.js b/website/www/node_modules/caniuse-lite/data/features/css-cross-fade.js new file mode 100644 index 000000000000..7dd84511a2d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-cross-fade.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","33":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F E D A B C O T P H","33":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","2":"G U xB WB","33":"I F E D aB bB cB dB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","33":"E rB sB tB uB vB wB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","33":"N CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"33":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"2":"MC"}},B:4,C:"CSS Cross-Fade Function"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-default-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-default-pseudo.js new file mode 100644 index 000000000000..ff4ea772454c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-default-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB GB nB fB"},D:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","132":"0 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","16":"G U xB WB","132":"I F E D A aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B jB kB lB mB L EB","132":"P H J K V W X Y Z a b c d e f g h i j k l m n","260":"C oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB","132":"E tB uB vB wB XB"},H:{"260":"7B"},I:{"1":"N","16":"GB 8B 9B AC","132":"G BC HB CC DC"},J:{"16":"F","132":"A"},K:{"1":"Q","16":"A B C L EB","260":"S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"1":"FC GC HC IC JC VB L","132":"G"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:7,C:":default CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js b/website/www/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js new file mode 100644 index 000000000000..9620e4457e00 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K IB N","16":"UB"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","16":"eB ZB YB"},E:{"1":"B","2":"G U I F E D A C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Explicit descendant combinator >>"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-deviceadaptation.js b/website/www/node_modules/caniuse-lite/data/features/css-deviceadaptation.js new file mode 100644 index 000000000000..b5d2e0b3d19c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-deviceadaptation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","164":"A B"},B:{"66":"UB IB N","164":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e","66":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p jB kB lB mB L EB oB S","66":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"292":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A Q","292":"B C L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"164":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"66":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Device Adaptation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-dir-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-dir-pseudo.js new file mode 100644 index 000000000000..53695355cef1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-dir-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H nB fB","33":"J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"33":"MC"}},B:5,C:":dir() CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-display-contents.js b/website/www/node_modules/caniuse-lite/data/features/css-display-contents.js new file mode 100644 index 000000000000..8d36db4262fd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-display-contents.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","260":"UB IB N"},C:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m nB fB","260":"0 1 2 3 4 5 6 7 8 n o p q r s t u v Q x y z TB AB FB"},D:{"2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"8 TB AB FB CB DB BB","260":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB","260":"O","772":"C L S"},F:{"2":"0 1 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S","260":"2 3 4 5 6 7 8 9 AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB","260":"0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","260":"N"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"260":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC","260":"JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"260":"MC"}},B:5,C:"CSS display: contents"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-element-function.js b/website/www/node_modules/caniuse-lite/data/features/css-element-function.js new file mode 100644 index 000000000000..063ca74884e8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-element-function.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"33":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","164":"qB GB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"33":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"33":"MC"}},B:5,C:"CSS element() function"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-env-function.js b/website/www/node_modules/caniuse-lite/data/features/css-env-function.js new file mode 100644 index 000000000000..2132bd743b07 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-env-function.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M"},E:{"1":"C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","132":"B"},F:{"1":"6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 4 5 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB","132":"zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"CSS Environment Variables env()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-exclusions.js b/website/www/node_modules/caniuse-lite/data/features/css-exclusions.js new file mode 100644 index 000000000000..a948f06ab086 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-exclusions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","33":"A B"},B:{"2":"UB IB N","33":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"33":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Exclusions Level 1"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-featurequeries.js b/website/www/node_modules/caniuse-lite/data/features/css-featurequeries.js new file mode 100644 index 000000000000..0e78d5ecf9da --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-featurequeries.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS Feature Queries"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-filter-function.js b/website/www/node_modules/caniuse-lite/data/features/css-filter-function.js new file mode 100644 index 000000000000..7b2991eabcd3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-filter-function.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB","33":"D"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB","33":"vB wB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS filter() function"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-filters.js b/website/www/node_modules/caniuse-lite/data/features/css-filters.js new file mode 100644 index 000000000000..39e0df0d754c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-filters.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","1028":"O T P H J K","1346":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","196":"k","516":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j fB"},D:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J","33":"0 1 2 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O dB VB L S hB iB","2":"G U xB WB aB","33":"I F E D bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y Z a b c d e f g h i j k l m n o p"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","33":"E sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","33":"CC DC"},J:{"2":"F","33":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","33":"G FC GC"},Q:{"33":"KC"},R:{"33":"LC"},S:{"1":"MC"}},B:5,C:"CSS Filter Effects"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-first-letter.js b/website/www/node_modules/caniuse-lite/data/features/css-first-letter.js new file mode 100644 index 000000000000..6c590a228291 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-first-letter.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","16":"gB","516":"E","1540":"I F"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","132":"GB","260":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"U I F E","132":"G"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"U xB","132":"G WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","16":"D jB","260":"B kB lB mB L EB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"1":"7B"},I:{"1":"GB G N BC HB CC DC","16":"8B 9B","132":"AC"},J:{"1":"F A"},K:{"1":"C Q S","260":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"::first-letter CSS pseudo-element selector"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-first-line.js b/website/www/node_modules/caniuse-lite/data/features/css-first-line.js new file mode 100644 index 000000000000..6842a97a23d1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-first-line.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","132":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS first-line pseudo-element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-fixed.js b/website/www/node_modules/caniuse-lite/data/features/css-fixed.js new file mode 100644 index 000000000000..f8e1424fc1de --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-fixed.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"F E D A B","2":"gB","8":"I"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB VB L S hB iB","1025":"dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","132":"rB sB tB"},H:{"2":"7B"},I:{"1":"GB N CC DC","260":"8B 9B AC","513":"G BC HB"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS position:fixed"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-focus-ring.js b/website/www/node_modules/caniuse-lite/data/features/css-focus-ring.js new file mode 100644 index 000000000000..85d13b029d65 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-focus-ring.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"K C G E A B CB"},B:{"2":"D v Z I M H"},C:{"2":"VB y TB SB","161":"0 1 2 3 5 6 7 F J K C G E A B D v Z I M H N O P Q R S T U V W X Y x a b c d e f L h i j k l m n o p q r s t u z w"},D:{"2":"0 1 2 3 5 6 7 F J K C G E A B D v Z I M H N O P Q R S T U V W X Y x a b c d e f L h i j k l m n o p q r s t u z w HB g DB XB EB FB"},E:{"2":"F J K C G E A B GB AB IB JB KB LB MB NB"},F:{"2":"8 9 E B D I M H N O P Q R S T U V W X Y x a b c d e f L h i j k l m n o p q r s t u OB PB QB RB UB BB"},G:{"2":"4 G AB WB YB ZB aB bB cB dB eB fB gB"},H:{"2":"hB"},I:{"2":"4 y F g iB jB kB lB mB nB"},J:{"2":"C A"},K:{"2":"8 9 A B D L BB"},L:{"2":"g"},M:{"161":"w"},N:{"2":"A B"},O:{"2":"oB"},P:{"2":"F J pB"},Q:{"2":"qB"},R:{"2":"rB"}},B:7,C:":focus-ring CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-focus-visible.js b/website/www/node_modules/caniuse-lite/data/features/css-focus-visible.js new file mode 100644 index 000000000000..f9ef661beef0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-focus-visible.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","328":"UB IB N"},C:{"2":"qB GB nB fB","161":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w","328":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB jB kB lB mB L EB oB S","328":"w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"328":"N"},M:{"161":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"161":"MC"}},B:7,C:":focus-visible CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-focus-within.js b/website/www/node_modules/caniuse-lite/data/features/css-focus-within.js new file mode 100644 index 000000000000..0c724f282042 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-focus-within.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"TB"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v jB kB lB mB L EB oB S","194":"Q"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"16":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:7,C:":focus-within CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js b/website/www/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js new file mode 100644 index 000000000000..924673fc8ad9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v nB fB","322":"0 1 2 3 4 5 6 7 Q x y z"},D:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y","194":"0 1 2 3 4 5 6 7 8 z TB"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S","194":"m n o p q r s t u v Q"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","194":"Q"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G","194":"FC GC HC"},Q:{"194":"KC"},R:{"2":"LC"},S:{"322":"MC"}},B:5,C:"CSS font-rendering controls"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-font-stretch.js b/website/www/node_modules/caniuse-lite/data/features/css-font-stretch.js new file mode 100644 index 000000000000..b9155dacffa0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-font-stretch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS font-stretch"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-gencontent.js b/website/www/node_modules/caniuse-lite/data/features/css-gencontent.js new file mode 100644 index 000000000000..e8d1aa601f01 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-gencontent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F gB","132":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS Generated content for pseudo-elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-gradients.js b/website/www/node_modules/caniuse-lite/data/features/css-gradients.js new file mode 100644 index 000000000000..3e220c49f4c7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-gradients.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","260":"H J K V W X Y Z a b c d e f g h i j k l","292":"G U I F E D A B C O T P fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"A B C O T P H J K V W X Y Z a b","548":"G U I F E D"},E:{"2":"xB WB","260":"F E D A B C O bB cB dB VB L S hB iB","292":"I aB","804":"G U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB","33":"C oB","164":"L EB"},G:{"260":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","292":"rB sB","804":"WB pB HB"},H:{"2":"7B"},I:{"1":"N CC DC","33":"G BC HB","548":"GB 8B 9B AC"},J:{"1":"A","548":"F"},K:{"1":"Q S","2":"A B","33":"C","164":"L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS Gradients"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-grid.js b/website/www/node_modules/caniuse-lite/data/features/css-grid.js new file mode 100644 index 000000000000..31d2b7fb9c50 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-grid.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","8":"D","292":"A B"},B:{"1":"H J K UB IB N","292":"C O T P"},C:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K nB fB","8":"V W X Y Z a b c d e f g h i j k l m n o p","584":"0 1 q r s t u v Q x y z","1025":"2 3"},D:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a","8":"b c d e","200":"0 1 2 3 4 5 6 f g h i j k l m n o p q r s t u v Q x y z","1025":"7"},E:{"1":"B C O VB L S hB iB","2":"G U xB WB aB","8":"I F E D A bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S","200":"e f g h i j k l m n o p q r s t"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","8":"E sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC","8":"HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"292":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"FC","8":"G"},Q:{"200":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"CSS Grid Layout (level 1)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js b/website/www/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js new file mode 100644 index 000000000000..45fbddda8c98 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS hanging-punctuation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-has.js b/website/www/node_modules/caniuse-lite/data/features/css-has.js new file mode 100644 index 000000000000..8c217998243a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-has.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:":has() CSS relational pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-hyphenate.js b/website/www/node_modules/caniuse-lite/data/features/css-hyphenate.js new file mode 100644 index 000000000000..2688fc41082e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-hyphenate.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"I F E D A B gB"},B:{"1":"UB IB N","16":"C O T P H J K"},C:{"16":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"16":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"16":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"16":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"16":"N"},M:{"16":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"16":"MC"}},B:5,C:"CSS4 Hyphenation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-hyphens.js b/website/www/node_modules/caniuse-lite/data/features/css-hyphens.js new file mode 100644 index 000000000000..2cd8c79ed298 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-hyphens.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","33":"A B"},B:{"33":"C O T P H J K","132":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB","33":"I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s"},D:{"2":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","132":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U xB WB","33":"I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB","33":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","132":"N"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"132":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"4":"EC"},P:{"1":"GC HC IC JC VB L","2":"G","132":"FC"},Q:{"2":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:5,C:"CSS Hyphenation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-image-orientation.js b/website/www/node_modules/caniuse-lite/data/features/css-image-orientation.js new file mode 100644 index 000000000000..a4d8284785f2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-image-orientation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"N","2":"C O T P H J K UB IB"},C:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b nB fB"},D:{"1":"N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"M","2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R jB kB lB mB L EB oB S"},G:{"132":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 image-orientation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-image-set.js b/website/www/node_modules/caniuse-lite/data/features/css-image-set.js new file mode 100644 index 000000000000..89a2cac7f412 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-image-set.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","33":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W","33":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U xB WB aB","33":"I F E D bB cB dB","129":"A B C O VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB rB","33":"E sB tB uB vB wB","129":"XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","33":"N CC DC"},J:{"2":"F","33":"A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"33":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"2":"MC"}},B:5,C:"CSS image-set"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-in-out-of-range.js b/website/www/node_modules/caniuse-lite/data/features/css-in-out-of-range.js new file mode 100644 index 000000000000..c5753efc52e6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-in-out-of-range.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C","260":"O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","516":"f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G","16":"U I F E D A B C O T","260":"2","772":"0 1 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","2":"G xB WB","16":"U","772":"I F E D A aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M","16":"D jB","260":"B C p kB lB mB L EB oB S","772":"P H J K V W X Y Z a b c d e f g h i j k l m n o"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","772":"E rB sB tB uB vB wB XB"},H:{"132":"7B"},I:{"1":"N","2":"GB 8B 9B AC","260":"G BC HB CC DC"},J:{"2":"F","260":"A"},K:{"1":"Q","260":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","260":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"516":"MC"}},B:5,C:":in-range and :out-of-range CSS pseudo-classes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js new file mode 100644 index 000000000000..6949a5a859e3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"A B","388":"D"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB GB nB fB","132":"0 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","388":"G U"},D:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","132":"P H J K V W X Y Z a b c d e f g h i j k l m n o"},E:{"1":"B C O VB L S hB iB","16":"G U I xB WB","132":"F E D A bB cB dB","388":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B jB kB lB mB L EB","132":"P H J K V W X Y Z a b","516":"C oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB","132":"E tB uB vB wB XB"},H:{"516":"7B"},I:{"1":"N","16":"GB 8B 9B AC DC","132":"CC","388":"G BC HB"},J:{"16":"F","132":"A"},K:{"1":"Q","16":"A B C L EB","516":"S"},L:{"1":"N"},M:{"132":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"132":"MC"}},B:7,C:":indeterminate CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-initial-letter.js b/website/www/node_modules/caniuse-lite/data/features/css-initial-letter.js new file mode 100644 index 000000000000..4699072cb4cb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-initial-letter.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E xB WB aB bB cB","4":"D","164":"A B C O dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB","164":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Initial Letter"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-initial-value.js b/website/www/node_modules/caniuse-lite/data/features/css-initial-value.js new file mode 100644 index 000000000000..6b8622887223 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-initial-value.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"G U I F E D A B C O T P H J K nB fB","164":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","16":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS initial value"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-letter-spacing.js b/website/www/node_modules/caniuse-lite/data/features/css-letter-spacing.js new file mode 100644 index 000000000000..8ba65e4b5a13 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-letter-spacing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","16":"gB","132":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","16":"xB","132":"G U I WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D jB","132":"B C P H kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"2":"7B"},I:{"1":"N CC DC","16":"8B 9B","132":"GB G AC BC HB"},J:{"132":"F A"},K:{"1":"Q","132":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"letter-spacing CSS property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-line-clamp.js b/website/www/node_modules/caniuse-lite/data/features/css-line-clamp.js new file mode 100644 index 000000000000..27ad3526b611 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-line-clamp.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H","33":"UB IB N","129":"J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R nB fB","33":"M JB KB LB MB NB OB PB QB RB SB"},D:{"16":"G U I F E D A B C O","33":"0 1 2 3 4 5 6 7 8 9 T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G xB WB","33":"U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB","33":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"8B 9B","33":"GB G N AC BC HB CC DC"},J:{"33":"F A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"33":"M"},N:{"2":"A B"},O:{"33":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"2":"MC"}},B:7,C:"CSS line-clamp"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-logical-props.js b/website/www/node_modules/caniuse-lite/data/features/css-logical-props.js new file mode 100644 index 000000000000..2ac8756f3cd4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-logical-props.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","164":"GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q nB fB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","292":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M"},E:{"1":"O S hB iB","292":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"w R M","2":"D B C jB kB lB mB L EB oB S","292":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB"},G:{"1":"2B 3B 4B 5B 6B","292":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"1":"N","292":"GB G 8B 9B AC BC HB CC DC"},J:{"292":"F A"},K:{"2":"A B C L EB S","292":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"292":"EC"},P:{"1":"VB L","292":"G FC GC HC IC JC"},Q:{"292":"KC"},R:{"292":"LC"},S:{"1":"MC"}},B:5,C:"CSS Logical Properties"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-marker-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-marker-pseudo.js new file mode 100644 index 000000000000..4e479404f685 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-marker-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B xB WB aB bB cB dB VB","129":"C O L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS ::marker pseudo-element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-masks.js b/website/www/node_modules/caniuse-lite/data/features/css-masks.js new file mode 100644 index 000000000000..e8df698d1e50 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-masks.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H","164":"UB IB N","3138":"J","12292":"K"},C:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","260":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"164":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"xB WB","164":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","164":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"164":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"164":"N CC DC","676":"GB G 8B 9B AC BC HB"},J:{"164":"F A"},K:{"2":"A B C L EB S","164":"Q"},L:{"164":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"164":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"260":"MC"}},B:4,C:"CSS Masks"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-matches-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-matches-pseudo.js new file mode 100644 index 000000000000..798e02587a90 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-matches-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","1348":"UB IB N"},C:{"16":"qB GB nB fB","548":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"16":"G U I F E D A B C O T","164":"0 1 2 3 4 5 6 7 8 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB","1348":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G xB WB","16":"U","164":"I F E aB bB cB","257":"D A B C O dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","164":"0 1 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","1220":"2 3 4 5 6 7 8 9 AB CB DB BB","1348":"w R M"},G:{"16":"WB pB HB rB sB","164":"E tB uB","257":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"GB 8B 9B AC","164":"G N BC HB CC DC"},J:{"16":"F","164":"A"},K:{"2":"A B C L EB S","164":"Q"},L:{"1220":"N"},M:{"548":"M"},N:{"2":"A B"},O:{"164":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"548":"MC"}},B:5,C:":matches() CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-math-functions.js b/website/www/node_modules/caniuse-lite/data/features/css-math-functions.js new file mode 100644 index 000000000000..1f761314cc98 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-math-functions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB nB fB"},D:{"1":"UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},E:{"1":"hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB","132":"C O L S"},F:{"1":"w R M","2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB jB kB lB mB L EB oB S"},G:{"1":"6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB","132":"0B 1B 2B 3B 4B 5B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS math functions min(), max() and clamp()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-media-interaction.js b/website/www/node_modules/caniuse-lite/data/features/css-media-interaction.js new file mode 100644 index 000000000000..39878aad40a2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-media-interaction.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"9 BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"Media Queries: interaction media features"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-media-resolution.js b/website/www/node_modules/caniuse-lite/data/features/css-media-resolution.js new file mode 100644 index 000000000000..123a6ae94699 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-media-resolution.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","260":"G U I F E D A B C O T P nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","548":"G U I F E D A B C O T P H J K V W X Y Z a b c d e"},E:{"2":"xB WB","548":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D","548":"B C jB kB lB mB L EB oB"},G:{"16":"WB","548":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"132":"7B"},I:{"1":"N CC DC","16":"8B 9B","548":"GB G AC BC HB"},J:{"548":"F A"},K:{"1":"Q S","548":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"Media Queries: resolution feature"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-media-scripting.js b/website/www/node_modules/caniuse-lite/data/features/css-media-scripting.js new file mode 100644 index 000000000000..48beaabdf7a9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-media-scripting.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"16":"C O T P H J K UB IB N"},C:{"2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","16":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","16":"eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Media Queries: scripting media feature"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-mediaqueries.js b/website/www/node_modules/caniuse-lite/data/features/css-mediaqueries.js new file mode 100644 index 000000000000..044a6c54fa73 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-mediaqueries.js @@ -0,0 +1 @@ +module.exports={A:{A:{"8":"I F E gB","129":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","129":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","129":"G U I aB","388":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","129":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"N CC DC","129":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"129":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS3 Media Queries"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-mixblendmode.js b/website/www/node_modules/caniuse-lite/data/features/css-mixblendmode.js new file mode 100644 index 000000000000..99a28a2c54c7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-mixblendmode.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e","194":"f g h i j k l m n o p q"},E:{"2":"G U I F xB WB aB bB","260":"E D A B C O cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e jB kB lB mB L EB oB S"},G:{"2":"WB pB HB rB sB tB","260":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Blending of HTML/SVG elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-motion-paths.js b/website/www/node_modules/caniuse-lite/data/features/css-motion-paths.js new file mode 100644 index 000000000000..a218ceec5f72 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-motion-paths.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","194":"t u v"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S","194":"g h i"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"CSS Motion Path"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-namespaces.js b/website/www/node_modules/caniuse-lite/data/features/css-namespaces.js new file mode 100644 index 000000000000..b3b4f55615db --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-namespaces.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","16":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS namespaces"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-not-sel-list.js b/website/www/node_modules/caniuse-lite/data/features/css-not-sel-list.js new file mode 100644 index 000000000000..446a76bee6b6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-not-sel-list.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K IB N","16":"UB"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB nB fB","16":"RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","16":"eB ZB YB"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"selector list argument of :not()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-nth-child-of.js b/website/www/node_modules/caniuse-lite/data/features/css-nth-child-of.js new file mode 100644 index 000000000000..9b36aa91c837 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-nth-child-of.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"selector list argument of :nth-child and :nth-last-child CSS pseudo-classes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-opacity.js b/website/www/node_modules/caniuse-lite/data/features/css-opacity.js new file mode 100644 index 000000000000..54e34e8fe8ff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-opacity.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","4":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS3 Opacity"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-optional-pseudo.js b/website/www/node_modules/caniuse-lite/data/features/css-optional-pseudo.js new file mode 100644 index 000000000000..b0113cccd0f0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-optional-pseudo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D jB","132":"B C kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"132":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","132":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:":optional CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-overflow-anchor.js b/website/www/node_modules/caniuse-lite/data/features/css-overflow-anchor.js new file mode 100644 index 000000000000..196deebd2f1b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-overflow-anchor.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"CSS overflow-anchor (Scroll Anchoring)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-overflow.js b/website/www/node_modules/caniuse-lite/data/features/css-overflow.js new file mode 100644 index 000000000000..c6fd3389fe69 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-overflow.js @@ -0,0 +1 @@ +module.exports={A:{A:{"388":"I F E D A B gB"},B:{"260":"UB IB N","388":"C O T P H J K"},C:{"260":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","388":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB nB fB"},D:{"260":"M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","388":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R"},E:{"388":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"260":"5 6 7 8 9 AB CB DB BB w R M","388":"0 1 2 3 4 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"388":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"388":"7B"},I:{"388":"GB G N 8B 9B AC BC HB CC DC"},J:{"388":"F A"},K:{"388":"A B C Q L EB S"},L:{"260":"N"},M:{"260":"M"},N:{"388":"A B"},O:{"388":"EC"},P:{"388":"G FC GC HC IC JC VB L"},Q:{"388":"KC"},R:{"388":"LC"},S:{"388":"MC"}},B:5,C:"CSS overflow property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js b/website/www/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js new file mode 100644 index 000000000000..48414c24a324 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"UB IB N","132":"C O T P H J","516":"K"},C:{"1":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB","260":"DB BB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S","260":"0 1"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"132":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"CSS overscroll-behavior"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-page-break.js b/website/www/node_modules/caniuse-lite/data/features/css-page-break.js new file mode 100644 index 000000000000..7fd1e2bee507 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-page-break.js @@ -0,0 +1 @@ +module.exports={A:{A:{"388":"A B","900":"I F E D gB"},B:{"388":"C O T P H J K","900":"UB IB N"},C:{"772":"9 w R M JB KB LB MB NB OB PB QB RB SB","900":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB"},D:{"900":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"772":"A","900":"G U I F E D B C O xB WB aB bB cB dB VB L S hB iB"},F:{"16":"D jB","129":"B C kB lB mB L EB oB S","900":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"900":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"129":"7B"},I:{"900":"GB G N 8B 9B AC BC HB CC DC"},J:{"900":"F A"},K:{"129":"A B C L EB S","900":"Q"},L:{"900":"N"},M:{"900":"M"},N:{"388":"A B"},O:{"900":"EC"},P:{"900":"G FC GC HC IC JC VB L"},Q:{"900":"KC"},R:{"900":"LC"},S:{"900":"MC"}},B:2,C:"CSS page-break properties"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-paged-media.js b/website/www/node_modules/caniuse-lite/data/features/css-paged-media.js new file mode 100644 index 000000000000..e5a46562c6a7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-paged-media.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","132":"E D A B"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K nB fB","132":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","132":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C L EB S","258":"Q"},L:{"1":"N"},M:{"132":"M"},N:{"258":"A B"},O:{"258":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"132":"MC"}},B:5,C:"CSS Paged Media (@page)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-paint-api.js b/website/www/node_modules/caniuse-lite/data/features/css-paint-api.js new file mode 100644 index 000000000000..2cf6dc659abb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-paint-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB"},E:{"2":"G U I F E D A B C xB WB aB bB cB dB VB L","194":"O S hB iB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Paint API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-placeholder-shown.js b/website/www/node_modules/caniuse-lite/data/features/css-placeholder-shown.js new file mode 100644 index 000000000000..d4ac712f6cc2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-placeholder-shown.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","292":"A B"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","164":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"164":"MC"}},B:5,C:":placeholder-shown CSS pseudo-class"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-placeholder.js b/website/www/node_modules/caniuse-lite/data/features/css-placeholder.js new file mode 100644 index 000000000000..e2af1bdff0bf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-placeholder.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","36":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K nB fB","33":"0 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","36":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","2":"G xB WB","36":"U I F E D A aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","36":"P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB","36":"E HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","36":"GB G 8B 9B AC BC HB CC DC"},J:{"36":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"36":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","36":"G FC GC"},Q:{"36":"KC"},R:{"1":"LC"},S:{"33":"MC"}},B:5,C:"::placeholder CSS pseudo-element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-read-only-write.js b/website/www/node_modules/caniuse-lite/data/features/css-read-only-write.js new file mode 100644 index 000000000000..d8d1e91ec113 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-read-only-write.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"16":"qB","33":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","132":"P H J K V W X Y Z a b c d e f g h i j k l"},E:{"1":"D A B C O dB VB L S hB iB","16":"xB WB","132":"G U I F E aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B jB kB lB mB L","132":"C P H J K V W X Y EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB","132":"E HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","16":"8B 9B","132":"GB G AC BC HB CC DC"},J:{"1":"A","132":"F"},K:{"1":"Q","2":"A B L","132":"C EB S"},L:{"1":"N"},M:{"33":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"33":"MC"}},B:1,C:"CSS :read-only and :read-write selectors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-rebeccapurple.js b/website/www/node_modules/caniuse-lite/data/features/css-rebeccapurple.js new file mode 100644 index 000000000000..0a45bd03925a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-rebeccapurple.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB","16":"bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Rebeccapurple color"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-reflections.js b/website/www/node_modules/caniuse-lite/data/features/css-reflections.js new file mode 100644 index 000000000000..a4e08a5bfbad --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-reflections.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","33":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"33":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"xB WB","33":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"33":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"33":"GB G N 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"2":"MC"}},B:7,C:"CSS Reflections"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-regions.js b/website/www/node_modules/caniuse-lite/data/features/css-regions.js new file mode 100644 index 000000000000..303d23d0ae28 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-regions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","420":"A B"},B:{"2":"UB IB N","420":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","36":"P H J K","66":"V W X Y Z a b c d e f g h i j k"},E:{"2":"G U I C O xB WB aB L S hB iB","33":"F E D A B bB cB dB VB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"WB pB HB rB sB 0B 1B 2B 3B 4B 5B 6B","33":"E tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"420":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Regions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-repeating-gradients.js b/website/www/node_modules/caniuse-lite/data/features/css-repeating-gradients.js new file mode 100644 index 000000000000..a6831090512b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-repeating-gradients.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","33":"G U I F E D A B C O T P fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D","33":"A B C O T P H J K V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB","33":"I aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB","33":"C oB","36":"L EB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","33":"rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB 8B 9B AC","33":"G BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B","33":"C","36":"L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS Repeating Gradients"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-resize.js b/website/www/node_modules/caniuse-lite/data/features/css-resize.js new file mode 100644 index 000000000000..a34f3acb327e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-resize.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"G"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB","132":"S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:4,C:"CSS resize property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-revert-value.js b/website/www/node_modules/caniuse-lite/data/features/css-revert-value.js new file mode 100644 index 000000000000..14a1311e5190 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-revert-value.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w nB fB"},D:{"1":"ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS revert value"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-rrggbbaa.js b/website/www/node_modules/caniuse-lite/data/features/css-rrggbbaa.js new file mode 100644 index 000000000000..da2a8f39e557 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-rrggbbaa.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"2 3 4 5 6 7 8 TB AB FB"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o jB kB lB mB L EB oB S","194":"0 1 p q r s t u v Q x y z"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G","194":"FC GC HC"},Q:{"194":"KC"},R:{"194":"LC"},S:{"2":"MC"}},B:7,C:"#rrggbbaa hex color notation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-scroll-behavior.js b/website/www/node_modules/caniuse-lite/data/features/css-scroll-behavior.js new file mode 100644 index 000000000000..bb144eb279a5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-scroll-behavior.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","129":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","129":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","450":"0 1 2 3 4 5 6 7 8 r s t u v Q x y z TB AB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S","129":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","450":"e f g h i j k l m n o p q r s t u v Q x"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"129":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"450":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSSOM Scroll-behavior"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-scrollbar.js b/website/www/node_modules/caniuse-lite/data/features/css-scrollbar.js new file mode 100644 index 000000000000..ae2b2f1d25e1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-scrollbar.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"2":"C O T P H J K","292":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB nB fB","3074":"DB","4100":"9 BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"292":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"16":"G U xB WB","292":"I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","292":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"16":"WB pB HB rB sB","292":"tB","804":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"8B 9B","292":"GB G N AC BC HB CC DC"},J:{"292":"F A"},K:{"2":"A B C L EB S","292":"Q"},L:{"292":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"292":"EC"},P:{"292":"G FC GC HC IC JC VB L"},Q:{"292":"KC"},R:{"292":"LC"},S:{"2":"MC"}},B:7,C:"CSS scrollbar styling"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-sel2.js b/website/www/node_modules/caniuse-lite/data/features/css-sel2.js new file mode 100644 index 000000000000..3ab73b393e02 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-sel2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"F E D A B","2":"gB","8":"I"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS 2.1 selectors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-sel3.js b/website/www/node_modules/caniuse-lite/data/features/css-sel3.js new file mode 100644 index 000000000000..34ccd3d48b1f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-sel3.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I","132":"F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","2":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS3 selectors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-selection.js b/website/www/node_modules/caniuse-lite/data/features/css-selection.js new file mode 100644 index 000000000000..8e5ec9c224d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-selection.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"C Q EB S","16":"A B L"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"33":"MC"}},B:5,C:"::selection CSS pseudo-element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-shapes.js b/website/www/node_modules/caniuse-lite/data/features/css-shapes.js new file mode 100644 index 000000000000..bf5f9958579d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-shapes.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","322":"1 2 3 4 5 6 7 8 TB AB FB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j","194":"k l m"},E:{"1":"B C O VB L S hB iB","2":"G U I F xB WB aB bB","33":"E D A cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","33":"E uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:4,C:"CSS Shapes Level 1"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-snappoints.js b/website/www/node_modules/caniuse-lite/data/features/css-snappoints.js new file mode 100644 index 000000000000..3e2207d89e61 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-snappoints.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","6308":"A","6436":"B"},B:{"1":"UB IB N","6436":"C O T P H J K"},C:{"1":"M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o nB fB","2052":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB","8258":"w R M"},E:{"1":"B C O L S hB iB","2":"G U I F E xB WB aB bB cB","3108":"D A dB VB"},F:{"1":"9 BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S","8258":"4 5 6 7 8 AB CB DB"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB","3108":"vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2052":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2052":"MC"}},B:4,C:"CSS Scroll Snap"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-sticky.js b/website/www/node_modules/caniuse-lite/data/features/css-sticky.js new file mode 100644 index 000000000000..a42eb360ceee --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-sticky.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P","1028":"UB IB N","4100":"H J K"},C:{"1":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b nB fB","194":"c d e f g h","516":"0 1 2 3 4 5 6 7 8 i j k l m n o p q r s t u v Q x y z"},D:{"2":"0 1 G U I F E D A B C O T P H J K V W X Y n o p q r s t u v Q x y z","322":"2 3 4 5 Z a b c d e f g h i j k l m","1028":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"O hB iB","2":"G U I xB WB aB","33":"E D A B C cB dB VB L S","2084":"F bB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o jB kB lB mB L EB oB S","322":"p q r","1028":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M"},G:{"1":"3B 4B 5B 6B","2":"WB pB HB rB","33":"E uB vB wB XB yB zB 0B 1B 2B","2084":"sB tB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","1028":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","1028":"Q"},L:{"1028":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1028":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"322":"KC"},R:{"2":"LC"},S:{"516":"MC"}},B:5,C:"CSS position:sticky"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-subgrid.js b/website/www/node_modules/caniuse-lite/data/features/css-subgrid.js new file mode 100644 index 000000000000..d8bece65e85b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-subgrid.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Subgrid"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-supports-api.js b/website/www/node_modules/caniuse-lite/data/features/css-supports-api.js new file mode 100644 index 000000000000..954a1f8ded2d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-supports-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","260":"C O T P H J K"},C:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V nB fB","66":"W X","260":"0 1 2 3 4 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d","260":"0 1 2 3 4 5 6 7 8 e f g h i j k l m n o p q r s t u v Q x y z TB AB"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB","132":"S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"132":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB","132":"S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS.supports() API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-table.js b/website/www/node_modules/caniuse-lite/data/features/css-table.js new file mode 100644 index 000000000000..fc3bb2b25e8a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-table.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"I F gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","132":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS Table display"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-text-align-last.js b/website/www/node_modules/caniuse-lite/data/features/css-text-align-last.js new file mode 100644 index 000000000000..2add9d070be3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-text-align-last.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"1":"UB IB N","4":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B nB fB","33":"C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},D:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k","322":"l m n o p q r s t u v Q"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X jB kB lB mB L EB oB S","578":"Y Z a b c d e f g h i j"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"33":"MC"}},B:5,C:"CSS3 text-align-last"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-text-indent.js b/website/www/node_modules/caniuse-lite/data/features/css-text-indent.js new file mode 100644 index 000000000000..25dd6a5faa59 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-text-indent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"132":"C O T P H J K","388":"UB IB N"},C:{"132":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n","388":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"132":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"132":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S","388":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"132":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"132":"7B"},I:{"132":"GB G N 8B 9B AC BC HB CC DC"},J:{"132":"F A"},K:{"132":"A B C L EB S","388":"Q"},L:{"388":"N"},M:{"132":"M"},N:{"132":"A B"},O:{"132":"EC"},P:{"132":"G","388":"FC GC HC IC JC VB L"},Q:{"388":"KC"},R:{"388":"LC"},S:{"132":"MC"}},B:5,C:"CSS text-indent"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-text-justify.js b/website/www/node_modules/caniuse-lite/data/features/css-text-justify.js new file mode 100644 index 000000000000..ca49d1f563f8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-text-justify.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"I F gB","132":"E D A B"},B:{"132":"C O T P H J K","322":"UB IB N"},C:{"2":"0 1 2 3 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","1025":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","1602":"4"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","322":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S","322":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","322":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","322":"Q"},L:{"322":"N"},M:{"1025":"M"},N:{"132":"A B"},O:{"2":"EC"},P:{"2":"G","322":"FC GC HC IC JC VB L"},Q:{"322":"KC"},R:{"322":"LC"},S:{"2":"MC"}},B:5,C:"CSS text-justify"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-text-orientation.js b/website/www/node_modules/caniuse-lite/data/features/css-text-orientation.js new file mode 100644 index 000000000000..efd5745f35a0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-text-orientation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB","194":"o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x"},E:{"2":"G U I F E D xB WB aB bB cB dB","16":"A","33":"B C O VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS text-orientation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-text-spacing.js b/website/www/node_modules/caniuse-lite/data/features/css-text-spacing.js new file mode 100644 index 000000000000..40628c060f13 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-text-spacing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","161":"E D A B"},B:{"2":"UB IB N","161":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"16":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"CSS Text 4 text-spacing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-textshadow.js b/website/www/node_modules/caniuse-lite/data/features/css-textshadow.js new file mode 100644 index 000000000000..b77b19169b08 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-textshadow.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","129":"A B"},B:{"1":"UB IB N","129":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","260":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"4":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"A","4":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"129":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 Text-shadow"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-touch-action-2.js b/website/www/node_modules/caniuse-lite/data/features/css-touch-action-2.js new file mode 100644 index 000000000000..35a997dd3964 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-touch-action-2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"B","164":"A"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","260":"5"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S","260":"s"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"132":"B","164":"A"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"CSS touch-action level 2 values"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-touch-action.js b/website/www/node_modules/caniuse-lite/data/features/css-touch-action.js new file mode 100644 index 000000000000..bc3c1e5caaa5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-touch-action.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D gB","289":"A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","194":"0 1 f g h i j k l m n o p q r s t u v Q x y z","1025":"2 3 4 5 6"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB","516":"wB XB yB zB 0B 1B 2B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","289":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"194":"MC"}},B:2,C:"CSS touch-action property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-transitions.js b/website/www/node_modules/caniuse-lite/data/features/css-transitions.js new file mode 100644 index 000000000000..cfb2ea98dbba --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-transitions.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"U I F E D A B C O T P","164":"G"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","33":"I aB","164":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D jB kB","33":"C","164":"B lB mB L EB oB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"sB","164":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"N CC DC","33":"GB G 8B 9B AC BC HB"},J:{"1":"A","33":"F"},K:{"1":"Q S","33":"C","164":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS3 Transitions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-unicode-bidi.js b/website/www/node_modules/caniuse-lite/data/features/css-unicode-bidi.js new file mode 100644 index 000000000000..425aa5c1c41e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-unicode-bidi.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","132":"qB GB G U I F E D nB fB","292":"A B C O T P H"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H","548":"J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x"},E:{"132":"G U I F E xB WB aB bB cB","548":"D A B C O dB VB L S hB iB"},F:{"132":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"132":"E WB pB HB rB sB tB uB","548":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"1":"N","16":"GB G 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"16":"KC"},R:{"16":"LC"},S:{"33":"MC"}},B:4,C:"CSS unicode-bidi property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-unset-value.js b/website/www/node_modules/caniuse-lite/data/features/css-unset-value.js new file mode 100644 index 000000000000..e4236c6d93bb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-unset-value.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS unset value"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-variables.js b/website/www/node_modules/caniuse-lite/data/features/css-variables.js new file mode 100644 index 000000000000..3e3e12933344 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-variables.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T","260":"P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x","194":"y"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S","194":"l"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"CSS Variables (Custom Properties)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-widows-orphans.js b/website/www/node_modules/caniuse-lite/data/features/css-widows-orphans.js new file mode 100644 index 000000000000..4b31cb95a4cb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-widows-orphans.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F gB","129":"E D"},B:{"1":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","129":"D B jB kB lB mB L EB oB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:2,C:"CSS widows & orphans"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-writing-mode.js b/website/www/node_modules/caniuse-lite/data/features/css-writing-mode.js new file mode 100644 index 000000000000..51d72ee663bf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-writing-mode.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB","322":"m n o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I","16":"F","33":"E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x"},E:{"1":"B C O L S hB iB","2":"G xB WB","16":"U","33":"I F E D A aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y Z a b c d e f g h i j k"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB","33":"E rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"8B 9B AC","33":"GB G BC HB CC DC"},J:{"33":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"36":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","33":"G"},Q:{"33":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS writing-mode property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css-zoom.js b/website/www/node_modules/caniuse-lite/data/features/css-zoom.js new file mode 100644 index 000000000000..85e444e46d7a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css-zoom.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F gB","129":"E D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"129":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"CSS zoom"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-attr.js b/website/www/node_modules/caniuse-lite/data/features/css3-attr.js new file mode 100644 index 000000000000..56e91a0ad5eb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-attr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"CSS3 attr() function for all properties"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-boxsizing.js b/website/www/node_modules/caniuse-lite/data/features/css3-boxsizing.js new file mode 100644 index 000000000000..e9cc046cf2a1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-boxsizing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","8":"I F gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","33":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"WB pB HB"},H:{"1":"7B"},I:{"1":"G N BC HB CC DC","33":"GB 8B 9B AC"},J:{"1":"A","33":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS3 Box-sizing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-colors.js b/website/www/node_modules/caniuse-lite/data/features/css3-colors.js new file mode 100644 index 000000000000..eda789b48391 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-colors.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","4":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","2":"D","4":"jB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS3 Colors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-cursors-grab.js b/website/www/node_modules/caniuse-lite/data/features/css3-cursors-grab.js new file mode 100644 index 000000000000..ac7e76f38082 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-cursors-grab.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c nB fB"},D:{"1":"M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R"},E:{"1":"B C O L S hB iB","33":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"5 6 7 8 9 C AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB","33":"0 1 2 3 4 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"2":"A B C L EB S","33":"Q"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:3,C:"CSS grab & grabbing cursors"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-cursors-newer.js b/website/www/node_modules/caniuse-lite/data/features/css3-cursors-newer.js new file mode 100644 index 000000000000..d97672954a9a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-cursors-newer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","33":"qB GB G U I F E D A B C O T P H J K V W X Y Z nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},E:{"1":"D A B C O dB VB L S hB iB","33":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB","33":"P H J K V W X Y Z"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"CSS3 Cursors: zoom-in & zoom-out"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-cursors.js b/website/www/node_modules/caniuse-lite/data/features/css3-cursors.js new file mode 100644 index 000000000000..4ef595c95455 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-cursors.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","132":"I F E gB"},B:{"1":"T P H J K UB IB N","260":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","4":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","4":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","260":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","16":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"CSS3 Cursors (original values)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/css3-tabsize.js b/website/www/node_modules/caniuse-lite/data/features/css3-tabsize.js new file mode 100644 index 000000000000..1423576e82f5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/css3-tabsize.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB nB fB","33":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","164":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W","132":"X Y Z a b c d e f g h i j k l m n o p q r"},E:{"1":"hB iB","2":"G U I xB WB aB","132":"F E D A B C O bB cB dB VB L S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D jB kB lB","132":"P H J K V W X Y Z a b c d e","164":"B C mB L EB oB S"},G:{"1":"6B","2":"WB pB HB rB sB","132":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B"},H:{"164":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","132":"CC DC"},J:{"132":"F A"},K:{"1":"Q","2":"A","164":"B C L EB S"},L:{"1":"N"},M:{"33":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"164":"MC"}},B:5,C:"CSS3 tab-size"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/currentcolor.js b/website/www/node_modules/caniuse-lite/data/features/currentcolor.js new file mode 100644 index 000000000000..dfe73f05b591 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/currentcolor.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS currentColor value"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/custom-elements.js b/website/www/node_modules/caniuse-lite/data/features/custom-elements.js new file mode 100644 index 000000000000..c3c5d2b5cb99 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/custom-elements.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","8":"A B"},B:{"1":"UB","2":"IB N","8":"C O T P H J K"},C:{"2":"9 qB GB G U I F E D A B C O T P H J K V W X Y TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","66":"Z a b c d e f","72":"0 1 2 3 4 5 6 7 8 g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c IB N eB ZB YB","66":"d e f g h i"},E:{"2":"G U xB WB aB","8":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w","2":"D B C R M jB kB lB mB L EB oB S","66":"P H J K V"},G:{"2":"WB pB HB rB sB","8":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"DC","2":"GB G N 8B 9B AC BC HB CC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"72":"MC"}},B:7,C:"Custom Elements (deprecated V0 spec)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/custom-elementsv1.js b/website/www/node_modules/caniuse-lite/data/features/custom-elementsv1.js new file mode 100644 index 000000000000..589ab8a2688f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/custom-elementsv1.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","8":"A B"},B:{"1":"UB IB N","8":"C O T P H J K"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f nB fB","8":"g h i j k l m n o p q r s t u v Q x y z","456":"0 1 2 3 4 5 6 7 8","712":"TB AB FB CB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","8":"2 3","132":"4 5 6 7 8 9 TB AB FB CB DB BB w"},E:{"2":"G U I F xB WB aB bB cB","8":"E D A dB","132":"B C O VB L S hB iB"},F:{"1":"9 BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 r s t u v Q x y z AB CB DB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB","132":"yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","132":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G","132":"FC"},Q:{"8":"KC"},R:{"132":"LC"},S:{"8":"MC"}},B:1,C:"Custom Elements (V1)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/customevent.js b/website/www/node_modules/caniuse-lite/data/features/customevent.js new file mode 100644 index 000000000000..bb74ae6327cc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/customevent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB","132":"I F E D A"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G","16":"U I F E O T","388":"D A B C"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G xB WB","16":"U I","388":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D jB kB lB mB","132":"B L EB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"pB","16":"WB HB","388":"rB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"8B 9B AC","388":"GB G BC HB"},J:{"1":"A","388":"F"},K:{"1":"C Q S","2":"A","132":"B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"CustomEvent"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/datalist.js b/website/www/node_modules/caniuse-lite/data/features/datalist.js new file mode 100644 index 000000000000..763ee586f028 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/datalist.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E D","260":"A B"},B:{"1":"UB IB N","260":"C O T P","1284":"H J K"},C:{"8":"qB GB nB fB","4612":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G U I F E D A B C O T P H J K V","132":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M"},E:{"1":"O S hB iB","8":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"9 D B C BB w R M jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB"},G:{"8":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B","2049":"2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"DC","8":"GB G 8B 9B AC BC HB CC","132":"N"},J:{"1":"A","8":"F"},K:{"1":"A B C L EB S","8":"Q"},L:{"1":"N"},M:{"516":"M"},N:{"8":"A B"},O:{"8":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"Datalist element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dataset.js b/website/www/node_modules/caniuse-lite/data/features/dataset.js new file mode 100644 index 000000000000..f84ef5c70cdc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dataset.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","4":"I F E D A gB"},B:{"1":"C O T P H","129":"J K UB IB N"},C:{"1":"0 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","4":"qB GB G U nB fB","129":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 v Q x y z","4":"G U I","129":"5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"4":"G U xB WB","129":"I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"1":"C i j k l m n o p q r L EB oB S","4":"D B jB kB lB mB","129":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h s t u v Q x y z AB CB DB BB w R M"},G:{"4":"WB pB HB","129":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"4":"7B"},I:{"4":"8B 9B AC","129":"GB G N BC HB CC DC"},J:{"129":"F A"},K:{"1":"C L EB S","4":"A B","129":"Q"},L:{"129":"N"},M:{"129":"M"},N:{"1":"B","4":"A"},O:{"129":"EC"},P:{"129":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"129":"LC"},S:{"1":"MC"}},B:1,C:"dataset & data-* attributes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/datauri.js b/website/www/node_modules/caniuse-lite/data/features/datauri.js new file mode 100644 index 000000000000..1cf26ac4b432 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/datauri.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","132":"E","260":"D A B"},B:{"1":"UB IB N","260":"C O P H J K","772":"T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"260":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Data URIs"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js b/website/www/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js new file mode 100644 index 000000000000..e1a87cde8687 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"gB","132":"I F E D A B"},B:{"1":"K UB IB N","132":"C O T P H J"},C:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","260":"2 3 4 5","772":"0 1 f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z","260":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB","772":"a b c d e f g h i j k l m n"},E:{"1":"C O S hB iB","16":"G U xB WB","132":"I F E D A aB bB cB dB","260":"B VB L"},F:{"1":"7 8 9 AB CB DB BB w R M","16":"D B C jB kB lB mB L EB oB","132":"S","260":"0 1 2 3 4 5 6 b c d e f g h i j k l m n o p q r s t u v Q x y z","772":"P H J K V W X Y Z a"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB","132":"E sB tB uB vB wB XB"},H:{"132":"7B"},I:{"1":"N","16":"GB 8B 9B AC","132":"G BC HB","772":"CC DC"},J:{"132":"F A"},K:{"1":"Q","16":"A B C L EB","132":"S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"260":"EC"},P:{"1":"JC VB L","260":"G FC GC HC IC"},Q:{"260":"KC"},R:{"132":"LC"},S:{"132":"MC"}},B:6,C:"Date.prototype.toLocaleDateString"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/details.js b/website/www/node_modules/caniuse-lite/data/features/details.js new file mode 100644 index 000000000000..86ba148d845a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/details.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"D A B gB","8":"I F E"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","8":"GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB","194":"x y"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G U I F E D A B","257":"V W X Y Z a b c d e f g h i j k l","769":"C O T P H J K"},E:{"1":"C O S hB iB","8":"G U xB WB aB","257":"I F E D A bB cB dB","1025":"B VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"C L EB oB S","8":"D B jB kB lB mB"},G:{"1":"E sB tB uB vB wB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB rB","1025":"XB yB zB"},H:{"8":"7B"},I:{"1":"G N BC HB CC DC","8":"GB 8B 9B AC"},J:{"1":"A","8":"F"},K:{"1":"Q","8":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"769":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Details & Summary elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/deviceorientation.js b/website/www/node_modules/caniuse-lite/data/features/deviceorientation.js new file mode 100644 index 000000000000..89ce9f239cbe --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/deviceorientation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"1":"C O T P H J K","4":"UB IB N"},C:{"2":"qB GB nB","4":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"G U fB"},D:{"2":"G U I","4":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","4":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB","4":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"8B 9B AC","4":"GB G N BC HB CC DC"},J:{"2":"F","4":"A"},K:{"1":"C S","2":"A B L EB","4":"Q"},L:{"4":"N"},M:{"4":"M"},N:{"1":"B","2":"A"},O:{"4":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"4":"MC"}},B:4,C:"DeviceOrientation & DeviceMotion events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/devicepixelratio.js b/website/www/node_modules/caniuse-lite/data/features/devicepixelratio.js new file mode 100644 index 000000000000..ad568c7b36d0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/devicepixelratio.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Window.devicePixelRatio"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dialog.js b/website/www/node_modules/caniuse-lite/data/features/dialog.js new file mode 100644 index 000000000000..46f6ffdb1dbf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dialog.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","194":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h","322":"i j k l m"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K jB kB lB mB L EB oB S","578":"V W X Y Z"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"Dialog element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dispatchevent.js b/website/www/node_modules/caniuse-lite/data/features/dispatchevent.js new file mode 100644 index 000000000000..61f20f5a8fa6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dispatchevent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","16":"gB","129":"D A","130":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","16":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","129":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"EventTarget.dispatchEvent"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dnssec.js b/website/www/node_modules/caniuse-lite/data/features/dnssec.js new file mode 100644 index 000000000000..2e074293d287 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dnssec.js @@ -0,0 +1 @@ +module.exports={A:{A:{"132":"I F E D A B gB"},B:{"132":"C O T P H J K UB IB N"},C:{"132":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"132":"0 1 2 3 4 5 6 7 8 9 G U h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","388":"I F E D A B C O T P H J K V W X Y Z a b c d e f g"},E:{"132":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"132":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"132":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"132":"7B"},I:{"132":"GB G N 8B 9B AC BC HB CC DC"},J:{"132":"F A"},K:{"132":"A B C Q L EB S"},L:{"132":"N"},M:{"132":"M"},N:{"132":"A B"},O:{"132":"EC"},P:{"132":"G FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"132":"MC"}},B:6,C:"DNSSEC and DANE"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/do-not-track.js b/website/www/node_modules/caniuse-lite/data/features/do-not-track.js new file mode 100644 index 000000000000..fc9cb38aa2d2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/do-not-track.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","164":"D A","260":"B"},B:{"1":"J K UB IB N","260":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E nB fB","516":"D A B C O T P H J K V W X Y Z a b c d e f g h"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y"},E:{"1":"I A B C aB dB VB L","2":"G U O xB WB S hB iB","1028":"F E D bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB"},G:{"1":"vB wB XB yB zB 0B 1B","2":"WB pB HB rB sB 2B 3B 4B 5B 6B","1028":"E tB uB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"16":"F","1028":"A"},K:{"1":"Q S","16":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"164":"A","260":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Do Not Track API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/document-currentscript.js b/website/www/node_modules/caniuse-lite/data/features/document-currentscript.js new file mode 100644 index 000000000000..943ecd5c42d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/document-currentscript.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"document.currentScript"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js b/website/www/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js new file mode 100644 index 000000000000..24d1fb8f5b77 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","16":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"document.evaluate & XPath"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/document-execcommand.js b/website/www/node_modules/caniuse-lite/data/features/document-execcommand.js new file mode 100644 index 000000000000..b373a735acd6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/document-execcommand.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","16":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","16":"D jB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB","16":"HB rB sB"},H:{"2":"7B"},I:{"1":"N BC HB CC DC","2":"GB G 8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"Document.execCommand()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/document-scrollingelement.js b/website/www/node_modules/caniuse-lite/data/features/document-scrollingelement.js new file mode 100644 index 000000000000..970b2ea257ae --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/document-scrollingelement.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","16":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"document.scrollingElement"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/documenthead.js b/website/www/node_modules/caniuse-lite/data/features/documenthead.js new file mode 100644 index 000000000000..97e93a4043cd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/documenthead.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB","16":"U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D jB kB lB mB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"document.head"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dom-manip-convenience.js b/website/www/node_modules/caniuse-lite/data/features/dom-manip-convenience.js new file mode 100644 index 000000000000..5d1ef70dd495 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dom-manip-convenience.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"2 3"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p jB kB lB mB L EB oB S","194":"q"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"194":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"DOM manipulation convenience methods"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dom-range.js b/website/www/node_modules/caniuse-lite/data/features/dom-range.js new file mode 100644 index 000000000000..6a03f91cfd43 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dom-range.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Document Object Model Range"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/domcontentloaded.js b/website/www/node_modules/caniuse-lite/data/features/domcontentloaded.js new file mode 100644 index 000000000000..f5040c786c9a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/domcontentloaded.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"DOMContentLoaded"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/domfocusin-domfocusout-events.js b/website/www/node_modules/caniuse-lite/data/features/domfocusin-domfocusout-events.js new file mode 100644 index 000000000000..0265b0208ef4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/domfocusin-domfocusout-events.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB","16":"U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","16":"D B jB kB lB mB L EB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB"},H:{"16":"7B"},I:{"1":"G N BC HB CC DC","16":"GB 8B 9B AC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"DOMFocusIn & DOMFocusOut events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dommatrix.js b/website/www/node_modules/caniuse-lite/data/features/dommatrix.js new file mode 100644 index 000000000000..87706098914b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dommatrix.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"132":"C O T P H J K","1028":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","2564":"j k l m n o p q r s t u v Q x y","3076":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"16":"G U I F","132":"0 1 2 3 4 5 6 7 8 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB","388":"E","1028":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"16":"G xB WB","132":"U I F E D A aB bB cB dB VB","1028":"B C O L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","132":"P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x","1028":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M"},G:{"16":"WB pB HB","132":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","132":"G BC HB CC DC","292":"GB 8B 9B AC"},J:{"16":"F","132":"A"},K:{"2":"A B C L EB S","132":"Q"},L:{"1028":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"132":"EC"},P:{"132":"G FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"2564":"MC"}},B:4,C:"DOMMatrix"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/download.js b/website/www/node_modules/caniuse-lite/data/features/download.js new file mode 100644 index 000000000000..4225a14a1314 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/download.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Download attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/dragndrop.js b/website/www/node_modules/caniuse-lite/data/features/dragndrop.js new file mode 100644 index 000000000000..e365f6e2e2f6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/dragndrop.js @@ -0,0 +1 @@ +module.exports={A:{A:{"644":"I F E D gB","772":"A B"},B:{"1":"K UB IB N","260":"C O T P H J"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","8":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","8":"D B jB kB lB mB L EB oB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","1025":"N"},J:{"2":"F A"},K:{"1":"S","8":"A B C L EB","1025":"Q"},L:{"1025":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"Drag and Drop"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/element-closest.js b/website/www/node_modules/caniuse-lite/data/features/element-closest.js new file mode 100644 index 000000000000..ce2c94796b46 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/element-closest.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Element.closest()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/element-from-point.js b/website/www/node_modules/caniuse-lite/data/features/element-from-point.js new file mode 100644 index 000000000000..5a5fd89dd312 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/element-from-point.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","16":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","16":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","16":"D jB kB lB mB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"C Q S","16":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"document.elementFromPoint()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/element-scroll-methods.js b/website/www/node_modules/caniuse-lite/data/features/element-scroll-methods.js new file mode 100644 index 000000000000..ae6cdca858ad --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/element-scroll-methods.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB"},E:{"2":"G U I F E D xB WB aB bB cB dB","132":"A B C O VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB","132":"XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:5,C:"Scroll methods on elements (scroll, scrollTo, scrollBy)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/eme.js b/website/www/node_modules/caniuse-lite/data/features/eme.js new file mode 100644 index 000000000000..e92a6338d32d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/eme.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","164":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k","132":"l m n o p q r"},E:{"1":"C O S hB iB","2":"G U I xB WB aB bB","164":"F E D A B cB dB VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X jB kB lB mB L EB oB S","132":"Y Z a b c d e"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:2,C:"Encrypted Media Extensions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/eot.js b/website/www/node_modules/caniuse-lite/data/features/eot.js new file mode 100644 index 000000000000..3ab98cd3ea4b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/eot.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","2":"gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"EOT - Embedded OpenType fonts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es5.js b/website/www/node_modules/caniuse-lite/data/features/es5.js new file mode 100644 index 000000000000..fee07b92ab99 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es5.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F gB","260":"D","1026":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","4":"qB GB nB fB","132":"G U I F E D A B C O T P H J K V W"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G U I F E D A B C O T P H J K","132":"V W X Y"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","4":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","4":"D B C jB kB lB mB L EB oB","132":"S"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","4":"WB pB HB rB"},H:{"132":"7B"},I:{"1":"N CC DC","4":"GB 8B 9B AC","132":"BC HB","900":"G"},J:{"1":"A","4":"F"},K:{"1":"Q","4":"A B C L EB","132":"S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ECMAScript 5"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-class.js b/website/www/node_modules/caniuse-lite/data/features/es6-class.js new file mode 100644 index 000000000000..be80ad2c4183 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-class.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r","132":"s t u v Q x y"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e jB kB lB mB L EB oB S","132":"f g h i j k l"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ES6 classes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-generators.js b/website/www/node_modules/caniuse-lite/data/features/es6-generators.js new file mode 100644 index 000000000000..4faf47da6f46 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-generators.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ES6 Generators"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js b/website/www/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js new file mode 100644 index 000000000000..eb0c4398c2d3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB","194":"w"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"JavaScript modules: dynamic import()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-module-nomodule.js b/website/www/node_modules/caniuse-lite/data/features/es6-module-nomodule.js new file mode 100644 index 000000000000..5c2f998146e0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-module-nomodule.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"K C G E A B YB"},B:{"2":"D w Z I","514":"M H"},C:{"2":"0 1 WB AB F J K C G E A B D w Z I M H N O P Q R S T U V W X Y y a b c d e f L h i j k l m n o p q r s t u v UB OB","322":"3 5 6 7 8 z x"},D:{"1":"8 BB IB DB FB ZB GB","2":"0 1 3 5 6 F J K C G E A B D w Z I M H N O P Q R S T U V W X Y y a b c d e f L h i j k l m n o p q r s t u v z x","194":"7"},E:{"1":"B g PB","2":"F J K C G E A HB CB JB KB LB MB NB"},F:{"2":"4 9 E B D I M H N O P Q R S T U V W X Y y a b c d e f L h i j k l m n o p q QB RB SB TB g VB","194":"r s t u v"},G:{"1":"hB iB","2":"2 G CB XB EB aB bB cB dB eB fB gB"},H:{"2":"jB"},I:{"2":"2 AB F BB kB lB mB nB oB pB"},J:{"2":"C A"},K:{"2":"4 9 A B D L g"},L:{"2":"DB"},M:{"2":"x"},N:{"2":"A B"},O:{"2":"qB"},P:{"2":"F J rB"},Q:{"2":"sB"},R:{"2":"tB"}},B:1,C:"JavaScript modules: nomodule attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-module.js b/website/www/node_modules/caniuse-lite/data/features/es6-module.js new file mode 100644 index 000000000000..7d654b3d50a4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-module.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T","4097":"H J K","4290":"P"},C:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","322":"4 5 6 7 8 TB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB","194":"AB"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB","3076":"VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q jB kB lB mB L EB oB S","194":"x"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB","3076":"yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"JavaScript modules via script tag"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-number.js b/website/www/node_modules/caniuse-lite/data/features/es6-number.js new file mode 100644 index 000000000000..58c43bf0e961 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-number.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P nB fB","132":"H J K V W X Y Z a","260":"b c d e f g","516":"h"},D:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K","1028":"V W X Y Z a b c d e f g h i j"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","1028":"P H J K V W"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC","1028":"BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ES6 Number"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6-string-includes.js b/website/www/node_modules/caniuse-lite/data/features/es6-string-includes.js new file mode 100644 index 000000000000..8ab9016d1204 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6-string-includes.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"String.prototype.includes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/es6.js b/website/www/node_modules/caniuse-lite/data/features/es6.js new file mode 100644 index 000000000000..ff1f886f7cfc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/es6.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","388":"B"},B:{"257":"UB IB N","260":"C O T","769":"P H J K"},C:{"2":"qB GB G U nB fB","4":"0 1 2 3 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","257":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W","4":"0 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","257":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","2":"G U I F xB WB aB bB","4":"E D cB dB"},F:{"2":"D B C jB kB lB mB L EB oB S","4":"P H J K V W X Y Z a b c d e f g h i j k l m n","257":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB","4":"E tB uB vB wB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","4":"CC DC","257":"N"},J:{"2":"F","4":"A"},K:{"2":"A B C L EB S","257":"Q"},L:{"257":"N"},M:{"257":"M"},N:{"2":"A","388":"B"},O:{"257":"EC"},P:{"4":"G","257":"FC GC HC IC JC VB L"},Q:{"257":"KC"},R:{"4":"LC"},S:{"4":"MC"}},B:6,C:"ECMAScript 2015 (ES6)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/eventsource.js b/website/www/node_modules/caniuse-lite/data/features/eventsource.js new file mode 100644 index 000000000000..1bd2ba2e3789 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/eventsource.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","4":"D jB kB lB mB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"C Q L EB S","4":"A B"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Server-sent events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/extended-system-fonts.js b/website/www/node_modules/caniuse-lite/data/features/extended-system-fonts.js new file mode 100644 index 000000000000..0a7acad9a319 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/extended-system-fonts.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"hB iB","2":"G U I F E D A B C O xB WB aB bB cB dB VB L S"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/feature-policy.js b/website/www/node_modules/caniuse-lite/data/features/feature-policy.js new file mode 100644 index 000000000000..8c2a8957b415 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/feature-policy.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","132":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB nB fB","260":"OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB","132":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B xB WB aB bB cB dB VB","772":"C O L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 9 x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB","16":"0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","132":"N"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"132":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC","132":"IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Feature Policy"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/fetch.js b/website/www/node_modules/caniuse-lite/data/features/fetch.js new file mode 100644 index 000000000000..2b8525272e23 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/fetch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j nB fB","1025":"p","1218":"k l m n o"},D:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p","260":"q","772":"r"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c jB kB lB mB L EB oB S","260":"d","772":"e"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Fetch"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/fieldset-disabled.js b/website/www/node_modules/caniuse-lite/data/features/fieldset-disabled.js new file mode 100644 index 000000000000..b958d490229c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/fieldset-disabled.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"gB","132":"E D","388":"I F A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P","16":"H J K V"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","16":"D jB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"388":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A","260":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"disabled attribute of the fieldset element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/fileapi.js b/website/www/node_modules/caniuse-lite/data/features/fileapi.js new file mode 100644 index 000000000000..62643a77df2d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/fileapi.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","260":"A B"},B:{"1":"UB IB N","260":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","260":"G U I F E D A B C O T P H J K V W X Y Z a b c d fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U","260":"O T P H J K V W X Y Z a b c d e f g h i j k l m n","388":"I F E D A B C"},E:{"1":"A B C O VB L S hB iB","2":"G U xB WB","260":"I F E D bB cB dB","388":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B jB kB lB mB","260":"C P H J K V W X Y Z a L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","260":"E sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N DC","2":"8B 9B AC","260":"CC","388":"GB G BC HB"},J:{"260":"A","388":"F"},K:{"1":"Q","2":"A B","260":"C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A","260":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"File API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/filereader.js b/website/www/node_modules/caniuse-lite/data/features/filereader.js new file mode 100644 index 000000000000..d5e0a8b2a1fd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/filereader.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D B jB kB lB mB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"C Q L EB S","2":"A B"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"FileReader API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/filereadersync.js b/website/www/node_modules/caniuse-lite/data/features/filereadersync.js new file mode 100644 index 000000000000..71cee4d0668e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/filereadersync.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D jB kB","16":"B lB mB L EB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"C Q EB S","2":"A","16":"B L"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"FileReaderSync"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/filesystem.js b/website/www/node_modules/caniuse-lite/data/features/filesystem.js new file mode 100644 index 000000000000..fae4f4599e8b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/filesystem.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","33":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F","33":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","36":"E D A B C"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","33":"A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","33":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Filesystem & FileWriter API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/flac.js b/website/www/node_modules/caniuse-lite/data/features/flac.js new file mode 100644 index 000000000000..c1cdaee78678 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/flac.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t","16":"u v Q","388":"0 1 2 3 4 5 x y z"},E:{"1":"O hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","516":"B C L S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"8B 9B AC","16":"GB G BC HB CC DC"},J:{"1":"A","2":"F"},K:{"1":"S","16":"A B C L EB","129":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","129":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:6,C:"FLAC audio format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/flexbox-gap.js b/website/www/node_modules/caniuse-lite/data/features/flexbox-gap.js new file mode 100644 index 000000000000..bcca3c8388f4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/flexbox-gap.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB","194":"ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"gap property for Flexbox"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/flexbox.js b/website/www/node_modules/caniuse-lite/data/features/flexbox.js new file mode 100644 index 000000000000..3dafd94ccf27 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/flexbox.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","1028":"B","1316":"A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","164":"qB GB G U I F E D A B C O T P H J K V W X nB fB","516":"Y Z a b c d"},D:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"X Y Z a b c d e","164":"G U I F E D A B C O T P H J K V W"},E:{"1":"D A B C O dB VB L S hB iB","33":"F E bB cB","164":"G U I xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB","33":"P H"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"E tB uB","164":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"N CC DC","164":"GB G 8B 9B AC BC HB"},J:{"1":"A","164":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","292":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS Flexible Box Layout Module"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/flow-root.js b/website/www/node_modules/caniuse-lite/data/features/flow-root.js new file mode 100644 index 000000000000..46bc6361d187 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/flow-root.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"O hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"display: flow-root"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/focusin-focusout-events.js b/website/www/node_modules/caniuse-lite/data/features/focusin-focusout-events.js new file mode 100644 index 000000000000..c39bf491c405 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/focusin-focusout-events.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","2":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D jB kB lB mB","16":"B L EB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"G N BC HB CC DC","2":"8B 9B AC","16":"GB"},J:{"1":"F A"},K:{"1":"C Q S","2":"A","16":"B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"focusin & focusout events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/focusoptions-preventscroll.js b/website/www/node_modules/caniuse-lite/data/features/focusoptions-preventscroll.js new file mode 100644 index 000000000000..fe66895faf25 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/focusoptions-preventscroll.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"9 BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"0 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"preventScroll support in focus"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-family-system-ui.js b/website/www/node_modules/caniuse-lite/data/features/font-family-system-ui.js new file mode 100644 index 000000000000..22a4da5bf8e7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-family-system-ui.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s nB fB","132":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","260":"3 4 5"},E:{"1":"B C O L S hB iB","2":"G U I F E xB WB aB bB cB","16":"D","132":"A dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB","132":"vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"1":"KC"},R:{"2":"LC"},S:{"132":"MC"}},B:5,C:"system-ui value for font-family"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-feature.js b/website/www/node_modules/caniuse-lite/data/features/font-feature.js new file mode 100644 index 000000000000..af77fdf8d122 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-feature.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"P H J K V W X Y Z a b c d e f g h i j","164":"G U I F E D A B C O T"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P","33":"X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x","292":"H J K V W"},E:{"1":"A B C O dB VB L S hB iB","2":"F E D xB WB bB cB","4":"G U I aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y Z a b c d e f g h i j k"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E tB uB vB","4":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","33":"CC DC"},J:{"2":"F","33":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","33":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS font-feature-settings"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-kerning.js b/website/www/node_modules/caniuse-lite/data/features/font-kerning.js new file mode 100644 index 000000000000..fbfb4779ebe9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-kerning.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z nB fB","194":"a b c d e f g h i j"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e","33":"f g h i"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I xB WB aB bB","33":"F E D cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P jB kB lB mB L EB oB S","33":"H J K V"},G:{"2":"WB pB HB rB sB tB","33":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB","33":"CC"},J:{"2":"F","33":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 font-kerning"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-loading.js b/website/www/node_modules/caniuse-lite/data/features/font-loading.js new file mode 100644 index 000000000000..343d969d93b9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-loading.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k nB fB","194":"l m n o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS Font Loading"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-size-adjust.js b/website/www/node_modules/caniuse-lite/data/features/font-size-adjust.js new file mode 100644 index 000000000000..1d863e817e04 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-size-adjust.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","194":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","194":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S","194":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"258":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"194":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"CSS font-size-adjust"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-smooth.js b/website/www/node_modules/caniuse-lite/data/features/font-smooth.js new file mode 100644 index 000000000000..91f71edb6561 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-smooth.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","676":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB","804":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G","676":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"xB WB","676":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","676":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"804":"MC"}},B:7,C:"CSS font-smooth"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-unicode-range.js b/website/www/node_modules/caniuse-lite/data/features/font-unicode-range.js new file mode 100644 index 000000000000..b096e4cfd2af --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-unicode-range.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","4":"D A B"},B:{"1":"J K UB IB N","4":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB","194":"m n o p q r s t"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"1":"A B C O VB L S hB iB","4":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","4":"P H J K V W X Y"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","4":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","4":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","4":"A"},K:{"2":"A B C L EB S","4":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"4":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","4":"G"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"Font unicode-range subsetting"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-variant-alternates.js b/website/www/node_modules/caniuse-lite/data/features/font-variant-alternates.js new file mode 100644 index 000000000000..cf25bbc8e8bd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-variant-alternates.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","130":"A B"},B:{"130":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","130":"G U I F E D A B C O T P H J K V W X Y Z","322":"a b c d e f g h i j"},D:{"2":"G U I F E D A B C O T P","130":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O dB VB L S hB iB","2":"F E D xB WB bB cB","130":"G U I aB"},F:{"2":"D B C jB kB lB mB L EB oB S","130":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB tB uB vB","130":"pB HB rB sB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","130":"N CC DC"},J:{"2":"F","130":"A"},K:{"2":"A B C L EB S","130":"Q"},L:{"130":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"130":"EC"},P:{"130":"G FC GC HC IC JC VB L"},Q:{"130":"KC"},R:{"130":"LC"},S:{"1":"MC"}},B:5,C:"CSS font-variant-alternates"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-variant-east-asian.js b/website/www/node_modules/caniuse-lite/data/features/font-variant-east-asian.js new file mode 100644 index 000000000000..6aeeda2a8872 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-variant-east-asian.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z nB fB","132":"a b c d e f g h i j"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"132":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"CSS font-variant-east-asian "}; diff --git a/website/www/node_modules/caniuse-lite/data/features/font-variant-numeric.js b/website/www/node_modules/caniuse-lite/data/features/font-variant-numeric.js new file mode 100644 index 000000000000..65562357ed21 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/font-variant-numeric.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j nB fB"},D:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o jB kB lB mB L EB oB S"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","16":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:2,C:"CSS font-variant-numeric"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/fontface.js b/website/www/node_modules/caniuse-lite/data/features/fontface.js new file mode 100644 index 000000000000..04a9dbb17b8c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/fontface.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","132":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","2":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","2":"D jB"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","260":"WB pB"},H:{"2":"7B"},I:{"1":"G N BC HB CC DC","2":"8B","4":"GB 9B AC"},J:{"1":"A","4":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"@font-face Web fonts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/form-attribute.js b/website/www/node_modules/caniuse-lite/data/features/form-attribute.js new file mode 100644 index 000000000000..879989293ddc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/form-attribute.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB","16":"U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Form attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/form-submit-attributes.js b/website/www/node_modules/caniuse-lite/data/features/form-submit-attributes.js new file mode 100644 index 000000000000..b236a026fd14 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/form-submit-attributes.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB","16":"kB lB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"G N BC HB CC DC","2":"8B 9B AC","16":"GB"},J:{"1":"A","2":"F"},K:{"1":"B C Q L EB S","16":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Attributes for form submission"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/form-validation.js b/website/www/node_modules/caniuse-lite/data/features/form-validation.js new file mode 100644 index 000000000000..1fe21b3fe450 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/form-validation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D"},E:{"1":"B C O VB L S hB iB","2":"G xB WB","132":"U I F E D A aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","2":"D jB"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB","132":"E pB HB rB sB tB uB vB wB XB"},H:{"516":"7B"},I:{"1":"N DC","2":"GB 8B 9B AC","132":"G BC HB CC"},J:{"1":"A","132":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"260":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"132":"MC"}},B:1,C:"Form validation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/forms.js b/website/www/node_modules/caniuse-lite/data/features/forms.js new file mode 100644 index 000000000000..3fc5d07ac1d5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/forms.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","4":"A B","8":"I F E D"},B:{"1":"H J K UB IB N","4":"C O T P"},C:{"4":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB"},E:{"4":"G U I F E D A B C O aB bB cB dB VB L S hB iB","8":"xB WB"},F:{"1":"2 3 4 5 6 7 8 9 D B C AB CB DB BB w R M jB kB lB mB L EB oB S","4":"0 1 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},G:{"2":"WB","4":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","4":"CC DC"},J:{"2":"F","4":"A"},K:{"1":"A B C L EB S","4":"Q"},L:{"1":"N"},M:{"4":"M"},N:{"4":"A B"},O:{"1":"EC"},P:{"1":"IC JC VB L","4":"G FC GC HC"},Q:{"4":"KC"},R:{"4":"LC"},S:{"4":"MC"}},B:1,C:"HTML5 form features"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/fullscreen.js b/website/www/node_modules/caniuse-lite/data/features/fullscreen.js new file mode 100644 index 000000000000..537d469eb57b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/fullscreen.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","548":"B"},B:{"1":"UB IB N","516":"C O T P H J K"},C:{"1":"9 BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D nB fB","676":"A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q","1700":"0 1 2 3 4 5 6 7 8 x y z TB AB FB CB DB"},D:{"1":"LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T","676":"P H J K V","804":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB"},E:{"2":"G U xB WB","676":"aB","804":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"1":"9 BB w R M S","2":"D B C jB kB lB mB L EB oB","804":"0 1 2 3 4 5 6 7 8 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B","2052":"1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","292":"A"},K:{"2":"A B C L EB S","804":"Q"},L:{"804":"N"},M:{"1":"M"},N:{"2":"A","548":"B"},O:{"804":"EC"},P:{"1":"VB L","804":"G FC GC HC IC JC"},Q:{"804":"KC"},R:{"804":"LC"},S:{"1":"MC"}},B:1,C:"Full Screen API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/gamepad.js b/website/www/node_modules/caniuse-lite/data/features/gamepad.js new file mode 100644 index 000000000000..277da4ec0749 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/gamepad.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W","33":"X Y Z a"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"Gamepad API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/geolocation.js b/website/www/node_modules/caniuse-lite/data/features/geolocation.js new file mode 100644 index 000000000000..298c5e9b5ef2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/geolocation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F E"},B:{"1":"C O T P H J K","129":"UB IB N"},C:{"1":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","8":"qB GB","129":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","4":"G","129":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D B C O aB bB cB dB VB L S hB iB","8":"G xB WB","129":"A"},F:{"1":"B C H J K V W X Y Z a b c d e f g h i j k l m n o mB L EB oB S","2":"D P jB","8":"kB lB","129":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"E WB pB HB rB sB tB uB vB wB","129":"XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G 8B 9B AC BC HB CC DC","129":"N"},J:{"1":"F A"},K:{"1":"B C Q L EB S","8":"A"},L:{"129":"N"},M:{"129":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G","129":"FC GC HC IC JC VB L"},Q:{"129":"KC"},R:{"129":"LC"},S:{"1":"MC"}},B:2,C:"Geolocation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/getboundingclientrect.js b/website/www/node_modules/caniuse-lite/data/features/getboundingclientrect.js new file mode 100644 index 000000000000..9c31438697ed --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/getboundingclientrect.js @@ -0,0 +1 @@ +module.exports={A:{A:{"644":"I F gB","2049":"D A B","2692":"E"},B:{"1":"UB IB N","2049":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","260":"G U I F E D A B","1156":"GB","1284":"nB","1796":"fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","16":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","16":"D jB","132":"kB lB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","132":"A"},L:{"1":"N"},M:{"1":"M"},N:{"2049":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Element.getBoundingClientRect()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/getcomputedstyle.js b/website/www/node_modules/caniuse-lite/data/features/getcomputedstyle.js new file mode 100644 index 000000000000..6442dc3191f6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/getcomputedstyle.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","132":"GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","260":"G U I F E D A"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","260":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","260":"D jB kB lB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","260":"WB pB HB"},H:{"260":"7B"},I:{"1":"G N BC HB CC DC","260":"GB 8B 9B AC"},J:{"1":"A","260":"F"},K:{"1":"B C Q L EB S","260":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"getComputedStyle"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/getelementsbyclassname.js b/website/www/node_modules/caniuse-lite/data/features/getelementsbyclassname.js new file mode 100644 index 000000000000..cd3ad9f2d974 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/getelementsbyclassname.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","8":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"getElementsByClassName"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/getrandomvalues.js b/website/www/node_modules/caniuse-lite/data/features/getrandomvalues.js new file mode 100644 index 000000000000..d254be032de3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/getrandomvalues.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","33":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U I xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A","33":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"crypto.getRandomValues()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/gyroscope.js b/website/www/node_modules/caniuse-lite/data/features/gyroscope.js new file mode 100644 index 000000000000..4f2ad3d6d6f1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/gyroscope.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"8 9 TB AB FB CB DB BB w"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Gyroscope"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/hardwareconcurrency.js b/website/www/node_modules/caniuse-lite/data/features/hardwareconcurrency.js new file mode 100644 index 000000000000..f7e939b11c3c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/hardwareconcurrency.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},E:{"2":"G U I F xB WB aB bB cB","129":"B C O VB L S hB iB","194":"E D A dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"2":"WB pB HB rB sB tB","129":"yB zB 0B 1B 2B 3B 4B 5B 6B","194":"E uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"navigator.hardwareConcurrency"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/hashchange.js b/website/www/node_modules/caniuse-lite/data/features/hashchange.js new file mode 100644 index 000000000000..57cd7f84e12d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/hashchange.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","8":"I F gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","8":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","8":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","8":"D jB kB lB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"GB G N 9B AC BC HB CC DC","2":"8B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","8":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Hashchange event"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/heif.js b/website/www/node_modules/caniuse-lite/data/features/heif.js new file mode 100644 index 000000000000..48a6e1da9985 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/heif.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A xB WB aB bB cB dB VB","130":"B C O L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB","130":"zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"HEIF/ISO Base Media File Format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/hevc.js b/website/www/node_modules/caniuse-lite/data/features/hevc.js new file mode 100644 index 000000000000..b2e969d480eb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/hevc.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"2":"UB IB N","132":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"O hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","516":"B C L S"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","258":"N"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"258":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","258":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"HEVC/H.265 video format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/hidden.js b/website/www/node_modules/caniuse-lite/data/features/hidden.js new file mode 100644 index 000000000000..fdc534e0e6de --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/hidden.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D B jB kB lB mB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"G N BC HB CC DC","2":"GB 8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"C Q L EB S","2":"A B"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"hidden attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/high-resolution-time.js b/website/www/node_modules/caniuse-lite/data/features/high-resolution-time.js new file mode 100644 index 000000000000..0a91506dd2df --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/high-resolution-time.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V","33":"W X Y Z"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"High Resolution Time API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/history.js b/website/www/node_modules/caniuse-lite/data/features/history.js new file mode 100644 index 000000000000..095f0ec9afe2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/history.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G xB WB","4":"U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M EB oB S","2":"D B jB kB lB mB L"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB","4":"HB"},H:{"2":"7B"},I:{"1":"N 9B AC HB CC DC","2":"GB G 8B BC"},J:{"1":"F A"},K:{"1":"C Q L EB S","2":"A B"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Session history management"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/html-media-capture.js b/website/www/node_modules/caniuse-lite/data/features/html-media-capture.js new file mode 100644 index 000000000000..b5b4ac44c3bc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/html-media-capture.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"WB pB HB rB","129":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B","257":"9B AC"},J:{"1":"A","16":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"516":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:4,C:"HTML Media Capture"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/html5semantic.js b/website/www/node_modules/caniuse-lite/data/features/html5semantic.js new file mode 100644 index 000000000000..18c54c7cdfaf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/html5semantic.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E","260":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","132":"GB nB fB","260":"G U I F E D A B C O T P H J K V W"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U","260":"I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","132":"G xB WB","260":"U I aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","132":"D B jB kB lB mB","260":"C L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"WB","260":"pB HB rB sB"},H:{"132":"7B"},I:{"1":"N CC DC","132":"8B","260":"GB G 9B AC BC HB"},J:{"260":"F A"},K:{"1":"Q","132":"A","260":"B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"260":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"HTML5 semantic elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/http-live-streaming.js b/website/www/node_modules/caniuse-lite/data/features/http-live-streaming.js new file mode 100644 index 000000000000..0e18fe52e15b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/http-live-streaming.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"HTTP Live Streaming (HLS)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/http2.js b/website/www/node_modules/caniuse-lite/data/features/http2.js new file mode 100644 index 000000000000..6bd29f8d816a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/http2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"1":"C O T P H J K","513":"UB IB N"},C:{"1":"0 1 2 m n o p q r s t u v Q x y z","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB","513":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 r s t u v Q x y z","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","513":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"B C O L S hB iB","2":"G U I F E xB WB aB bB cB","260":"D A dB VB"},F:{"1":"e f g h i j k l m n","2":"D B C P H J K V W X Y Z a b c d jB kB lB mB L EB oB S","513":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","513":"N"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"513":"N"},M:{"513":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G","513":"FC GC HC IC JC VB L"},Q:{"513":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"HTTP/2 protocol"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/http3.js b/website/www/node_modules/caniuse-lite/data/features/http3.js new file mode 100644 index 000000000000..2f46bb38bd96 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/http3.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB nB fB","194":"MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","322":"UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"HTTP/3 protocol"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/iframe-sandbox.js b/website/www/node_modules/caniuse-lite/data/features/iframe-sandbox.js new file mode 100644 index 000000000000..f8c5a0fd8f2d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/iframe-sandbox.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H nB fB","4":"J K V W X Y Z a b c d"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB"},H:{"2":"7B"},I:{"1":"GB G N 9B AC BC HB CC DC","2":"8B"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"sandbox attribute for iframes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/iframe-seamless.js b/website/www/node_modules/caniuse-lite/data/features/iframe-seamless.js new file mode 100644 index 000000000000..0c85241afc7b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/iframe-seamless.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","66":"W X Y Z a b c"},E:{"2":"G U I E D A B C O xB WB aB bB dB VB L S hB iB","130":"F cB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","130":"tB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"seamless attribute for iframes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/iframe-srcdoc.js b/website/www/node_modules/caniuse-lite/data/features/iframe-srcdoc.js new file mode 100644 index 000000000000..1fe0806d162d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/iframe-srcdoc.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E D A B"},B:{"1":"UB IB N","8":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB","8":"GB G U I F E D A B C O T P H J K V W X Y Z a nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O","8":"T P H J K V"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"xB WB","8":"G U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B jB kB lB mB","8":"C L EB oB S"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB","8":"pB HB rB"},H:{"2":"7B"},I:{"1":"N CC DC","8":"GB G 8B 9B AC BC HB"},J:{"1":"A","8":"F"},K:{"1":"Q","2":"A B","8":"C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"srcdoc attribute for iframes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/imagecapture.js b/website/www/node_modules/caniuse-lite/data/features/imagecapture.js new file mode 100644 index 000000000000..9b12c1e2eb11 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/imagecapture.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","322":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k nB fB","194":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","322":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p jB kB lB mB L EB oB S","322":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"322":"KC"},R:{"1":"LC"},S:{"194":"MC"}},B:5,C:"ImageCapture API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ime.js b/website/www/node_modules/caniuse-lite/data/features/ime.js new file mode 100644 index 000000000000..79145af6dd17 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ime.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","161":"B"},B:{"2":"UB IB N","161":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A","161":"B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Input Method Editor API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js b/website/www/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js new file mode 100644 index 000000000000..fa7d191ca401 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"naturalWidth & naturalHeight image properties"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/imports.js b/website/www/node_modules/caniuse-lite/data/features/imports.js new file mode 100644 index 000000000000..36bb8a378a3c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/imports.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","8":"A B"},B:{"1":"UB","2":"IB N","8":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f nB fB","8":"6 7 8 9 g h TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","72":"0 1 2 3 4 5 i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f IB N eB ZB YB","66":"g h i j k","72":"l"},E:{"2":"G U xB WB aB","8":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w","2":"D B C P H R M jB kB lB mB L EB oB S","66":"J K V W X","72":"Y"},G:{"2":"WB pB HB rB sB","8":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"2":"N"},M:{"8":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"HTML Imports"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js b/website/www/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js new file mode 100644 index 000000000000..6b5bbe977b7b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB","16":"nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"indeterminate checkbox"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/indexeddb.js b/website/www/node_modules/caniuse-lite/data/features/indexeddb.js new file mode 100644 index 000000000000..7c3da245df2c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/indexeddb.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"A B C O T P","36":"G U I F E D"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"A","8":"G U I F E D","33":"Z","36":"B C O T P H J K V W X Y"},E:{"1":"A B C O VB L S hB iB","8":"G U I F xB WB aB bB","260":"E D cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D jB kB","8":"B C lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB rB sB tB","260":"E uB vB wB"},H:{"2":"7B"},I:{"1":"N CC DC","8":"GB G 8B 9B AC BC HB"},J:{"1":"A","8":"F"},K:{"1":"Q","2":"A","8":"B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"IndexedDB"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/indexeddb2.js b/website/www/node_modules/caniuse-lite/data/features/indexeddb2.js new file mode 100644 index 000000000000..6d70701b3716 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/indexeddb2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t nB fB","132":"u v Q","260":"0 x y z"},D:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x","132":"0 1 y z","260":"2 3 4 5 6 7"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S","132":"l m n o","260":"p q r s t u"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB","16":"XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"HC IC JC VB L","2":"G","260":"FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"260":"MC"}},B:4,C:"IndexedDB 2.0"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/inline-block.js b/website/www/node_modules/caniuse-lite/data/features/inline-block.js new file mode 100644 index 000000000000..bbd0a6213556 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/inline-block.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","4":"gB","132":"I F"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","36":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS inline-block"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/innertext.js b/website/www/node_modules/caniuse-lite/data/features/innertext.js new file mode 100644 index 000000000000..1a9d87a2bf5d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/innertext.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","16":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"HTMLElement.innerText"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js b/website/www/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js new file mode 100644 index 000000000000..fda52389bc76 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A gB","132":"B"},B:{"132":"C O T P H J K","260":"UB IB N"},C:{"1":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f nB fB","516":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"J K V W X Y Z a b c","2":"G U I F E D A B C O T P H","132":"d e f g h i j k l m n o p q","260":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I aB bB","2":"G U xB WB","2052":"F E D A B C O cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"WB pB HB","1025":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1025":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2052":"A B"},O:{"1025":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"260":"KC"},R:{"1":"LC"},S:{"516":"MC"}},B:1,C:"autocomplete attribute: on & off values"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-color.js b/website/www/node_modules/caniuse-lite/data/features/input-color.js new file mode 100644 index 000000000000..f7187078a9e9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-color.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D P H jB kB lB mB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B","129":"2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"Color input type"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-datetime.js b/website/www/node_modules/caniuse-lite/data/features/input-datetime.js new file mode 100644 index 000000000000..6d2f7a2d5e20 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-datetime.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","132":"C"},C:{"2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","1090":"3 4 5 6","2052":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V","2052":"W X Y Z a"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"WB pB HB","260":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB 8B 9B AC","514":"G BC HB"},J:{"1":"A","2":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2052":"MC"}},B:1,C:"Date and time input types"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-email-tel-url.js b/website/www/node_modules/caniuse-lite/data/features/input-email-tel-url.js new file mode 100644 index 000000000000..9b47c9ef3bd7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-email-tel-url.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","132":"8B 9B AC"},J:{"1":"A","132":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Email, telephone & URL input types"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-event.js b/website/www/node_modules/caniuse-lite/data/features/input-event.js new file mode 100644 index 000000000000..46230b583696 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-event.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","2561":"A B","2692":"D"},B:{"1":"UB IB N","2561":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB","1537":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y fB","1796":"GB nB"},D:{"1":"w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T","1025":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB","1537":"P H J K V W X Y Z a b c d e f g h i j k"},E:{"1":"hB iB","16":"G U I xB WB","1025":"F E D A B C bB cB dB VB L","1537":"aB","4097":"O S"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M S","16":"D B C jB kB lB mB L EB","260":"oB","1025":"0 1 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","1537":"P H J K V W X"},G:{"16":"WB pB HB","1025":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","1537":"rB sB tB"},H:{"2":"7B"},I:{"16":"8B 9B","1025":"N DC","1537":"GB G AC BC HB CC"},J:{"1025":"A","1537":"F"},K:{"1":"A B C L EB S","1025":"Q"},L:{"1":"N"},M:{"1537":"M"},N:{"2561":"A B"},O:{"1537":"EC"},P:{"1025":"G FC GC HC IC JC VB L"},Q:{"1025":"KC"},R:{"1025":"LC"},S:{"1537":"MC"}},B:1,C:"input event"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-file-accept.js b/website/www/node_modules/caniuse-lite/data/features/input-file-accept.js new file mode 100644 index 000000000000..3a3738524e92 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-file-accept.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G","16":"U I F E X Y Z a b","132":"D A B C O T P H J K V W"},E:{"1":"C O L S hB iB","2":"G U xB WB aB","132":"I F E D A B bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"2":"sB tB","132":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","514":"WB pB HB rB"},H:{"2":"7B"},I:{"2":"8B 9B AC","260":"GB G BC HB","514":"N CC DC"},J:{"132":"A","260":"F"},K:{"2":"A B C L EB S","260":"Q"},L:{"260":"N"},M:{"2":"M"},N:{"514":"A","1028":"B"},O:{"2":"EC"},P:{"260":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"260":"LC"},S:{"1":"MC"}},B:1,C:"accept attribute for file input"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-file-directory.js b/website/www/node_modules/caniuse-lite/data/features/input-file-directory.js new file mode 100644 index 000000000000..03fb8311e27f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-file-directory.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Directory selection from file input"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-file-multiple.js b/website/www/node_modules/caniuse-lite/data/features/input-file-multiple.js new file mode 100644 index 000000000000..47e3dfbb6812 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-file-multiple.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB kB lB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"130":"7B"},I:{"130":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"130":"A B C Q L EB S"},L:{"132":"N"},M:{"130":"M"},N:{"2":"A B"},O:{"130":"EC"},P:{"130":"G","132":"FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"132":"LC"},S:{"2":"MC"}},B:1,C:"Multiple file selection"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-inputmode.js b/website/www/node_modules/caniuse-lite/data/features/input-inputmode.js new file mode 100644 index 000000000000..4c88db7ab44b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-inputmode.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H nB fB","4":"J K V W","194":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","66":"6 7 8 9 TB AB FB CB DB BB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s jB kB lB mB L EB oB S","66":"0 1 2 t u v Q x y z"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"194":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"JC VB L","2":"G FC GC HC IC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"194":"MC"}},B:1,C:"inputmode attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-minlength.js b/website/www/node_modules/caniuse-lite/data/features/input-minlength.js new file mode 100644 index 000000000000..2c66a5b29316 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-minlength.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"Minimum length attribute for input fields"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-number.js b/website/www/node_modules/caniuse-lite/data/features/input-number.js new file mode 100644 index 000000000000..4fdfce409c15 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-number.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","129":"A B"},B:{"1":"UB IB N","129":"C O","1025":"T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","513":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"388":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB 8B 9B AC","388":"G N BC HB CC DC"},J:{"2":"F","388":"A"},K:{"1":"A B C L EB S","388":"Q"},L:{"388":"N"},M:{"641":"M"},N:{"388":"A B"},O:{"388":"EC"},P:{"388":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"388":"LC"},S:{"513":"MC"}},B:1,C:"Number input type"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-pattern.js b/website/www/node_modules/caniuse-lite/data/features/input-pattern.js new file mode 100644 index 000000000000..925c661139a9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-pattern.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D"},E:{"1":"B C O VB L S hB iB","2":"G xB WB","16":"U","388":"I F E D A aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB","388":"E rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB CC"},J:{"1":"A","2":"F"},K:{"1":"A B C L EB S","132":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Pattern attribute for input fields"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-placeholder.js b/website/www/node_modules/caniuse-lite/data/features/input-placeholder.js new file mode 100644 index 000000000000..0f3992a12a1c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-placeholder.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","132":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M EB oB S","2":"D jB kB lB mB","132":"B L"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB N 8B 9B AC HB CC DC","4":"G BC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"input placeholder attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-range.js b/website/www/node_modules/caniuse-lite/data/features/input-range.js new file mode 100644 index 000000000000..2be7973bc3d5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-range.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"N HB CC DC","4":"GB G 8B 9B AC BC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Range input type"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-search.js b/website/www/node_modules/caniuse-lite/data/features/input-search.js new file mode 100644 index 000000000000..f1f0f78ba31b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-search.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","129":"A B"},B:{"1":"UB IB N","129":"C O T P H J K"},C:{"2":"qB GB nB fB","129":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T X Y Z a b","129":"P H J K V W"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D jB kB lB mB","16":"B L EB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"129":"7B"},I:{"1":"N CC DC","16":"8B 9B","129":"GB G AC BC HB"},J:{"1":"F","129":"A"},K:{"1":"C","2":"A","16":"B L EB","129":"Q S"},L:{"1":"N"},M:{"129":"M"},N:{"129":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"129":"MC"}},B:1,C:"Search input type"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/input-selection.js b/website/www/node_modules/caniuse-lite/data/features/input-selection.js new file mode 100644 index 000000000000..6dc5ffa33a9d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/input-selection.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","16":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","16":"D jB kB lB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Selection controls for input & textarea"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/insert-adjacent.js b/website/www/node_modules/caniuse-lite/data/features/insert-adjacent.js new file mode 100644 index 000000000000..9630bc4bcef7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/insert-adjacent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Element.insertAdjacentElement() & Element.insertAdjacentText()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/insertadjacenthtml.js b/website/www/node_modules/caniuse-lite/data/features/insertadjacenthtml.js new file mode 100644 index 000000000000..ffb7534504b5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/insertadjacenthtml.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","16":"gB","132":"I F E D"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","16":"D jB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Element.insertAdjacentHTML()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/internationalization-plural-rul.js b/website/www/node_modules/caniuse-lite/data/features/internationalization-plural-rul.js new file mode 100644 index 000000000000..a8ff0cdd6bff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/internationalization-plural-rul.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"L H G E A B jB"},B:{"1":"8","2":"C D e K I N","130":"J"},C:{"1":"1 2 3 9 KB JB CB DB EB O GB HB IB","2":"0 4 5 7 gB BB F L H G E A B C D e K I N J P Q R S T U V W X Y Z a b c d f g h i j k l m n o M q r s t u v w x y z aB ZB"},D:{"1":"8 JB CB DB EB O GB HB IB TB PB OB mB MB QB RB","2":"0 1 2 3 4 5 7 9 F L H G E A B C D e K I N J P Q R S T U V W X Y Z a b c d f g h i j k l m n o M q r s t u v w x y z KB"},E:{"2":"4 6 F L H G E A B C SB LB UB VB WB XB YB p","16":"D bB"},F:{"1":"0 1 2 3 t u v w x y z","2":"5 6 7 E B C K I N J P Q R S T U V W X Y Z a b c d f g h i j k l m n o M q r s cB dB eB fB p AB hB"},G:{"2":"G D LB iB FB kB lB NB nB oB pB qB rB sB tB uB vB"},H:{"2":"wB"},I:{"1":"O","2":"BB F xB yB zB 0B FB 1B 2B"},J:{"2":"H A"},K:{"2":"6 A B C M p AB"},L:{"1":"MB"},M:{"1":"O"},N:{"2":"A B"},O:{"2":"3B"},P:{"2":"F 4B 5B 6B 7B 8B"},Q:{"2":"9B"},R:{"2":"AC"},S:{"2":"BC"}},B:6,C:"Intl.PluralRules API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/internationalization.js b/website/www/node_modules/caniuse-lite/data/features/internationalization.js new file mode 100644 index 000000000000..13f9e3ad6f0a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/internationalization.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:6,C:"Internationalization API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js b/website/www/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js new file mode 100644 index 000000000000..a107387be358 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"9 CB DB BB w R M","2":"0 1 2 3 4 5 6 7 8 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"L","2":"G FC GC HC IC JC VB"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"IntersectionObserver V2"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/intersectionobserver.js b/website/www/node_modules/caniuse-lite/data/features/intersectionobserver.js new file mode 100644 index 000000000000..9184600c398c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/intersectionobserver.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K","2":"C O T","516":"P","1025":"UB IB N"},C:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","194":"2 3 4"},D:{"1":"8 TB AB FB CB DB BB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","516":"1 2 3 4 5 6 7","1025":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 v Q x y z AB CB DB","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB S","516":"o p q r s t u","1025":"9 BB w R M"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","1025":"N"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"516":"EC"},P:{"1":"HC IC JC VB L","2":"G","516":"FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"IntersectionObserver"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/intl-pluralrules.js b/website/www/node_modules/caniuse-lite/data/features/intl-pluralrules.js new file mode 100644 index 000000000000..5c0c37d6f820 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/intl-pluralrules.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J","130":"K"},C:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"1":"O hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Intl.PluralRules API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/intrinsic-width.js b/website/www/node_modules/caniuse-lite/data/features/intrinsic-width.js new file mode 100644 index 000000000000..6ffda65d87bd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/intrinsic-width.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","1537":"UB IB N"},C:{"2":"qB","932":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB nB fB","2308":"w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X","545":"Y Z a b c d e f g h i j k l m n o p q r s t u v","1537":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I xB WB aB","516":"B C O L S hB iB","548":"D A dB VB","676":"F E bB cB"},F:{"2":"D B C jB kB lB mB L EB oB S","513":"k","545":"P H J K V W X Y Z a b c d e f g h i","1537":"0 1 2 3 4 5 6 7 8 9 j l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB rB sB","548":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","676":"E tB uB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","545":"CC DC","1537":"N"},J:{"2":"F","545":"A"},K:{"2":"A B C L EB S","1537":"Q"},L:{"1537":"N"},M:{"2340":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"545":"G","1537":"FC GC HC IC JC VB L"},Q:{"545":"KC"},R:{"1537":"LC"},S:{"932":"MC"}},B:5,C:"Intrinsic & Extrinsic Sizing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/jpeg2000.js b/website/www/node_modules/caniuse-lite/data/features/jpeg2000.js new file mode 100644 index 000000000000..756afed2babf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/jpeg2000.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G xB WB","129":"U aB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"JPEG 2000 image format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/jpegxr.js b/website/www/node_modules/caniuse-lite/data/features/jpegxr.js new file mode 100644 index 000000000000..54576a288b6f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/jpegxr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"JPEG XR image format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js b/website/www/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js new file mode 100644 index 000000000000..3463d06d7f55 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Lookbehind in JS regular expressions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/json.js b/website/www/node_modules/caniuse-lite/data/features/json.js new file mode 100644 index 000000000000..fc5f7fc4bd90 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/json.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F gB","129":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"JSON parsing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js b/website/www/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js new file mode 100644 index 000000000000..71aa1f67fe92 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P","132":"H J K"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","132":"7 8 TB"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB","132":"VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t jB kB lB mB L EB oB S","132":"u v Q"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB","132":"yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"1":"IC JC VB L","2":"G FC GC","132":"HC"},Q:{"132":"KC"},R:{"2":"LC"},S:{"132":"MC"}},B:5,C:"CSS justify-content: space-evenly"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js b/website/www/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js new file mode 100644 index 000000000000..b78bb52def62 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"K UB IB N","2":"C O T P H J"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"8B 9B AC","132":"GB G BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"High-quality kerning pairs & ligatures"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js new file mode 100644 index 000000000000..c831cea3e8dd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","16":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","16":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","16":"C"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"S","2":"A B L EB","16":"C","130":"Q"},L:{"1":"N"},M:{"130":"M"},N:{"130":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"KeyboardEvent.charCode"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-code.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-code.js new file mode 100644 index 000000000000..be41850d10f4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-code.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r","194":"s t u v Q x"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e jB kB lB mB L EB oB S","194":"f g h i j k"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","194":"Q"},L:{"194":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","194":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"194":"LC"},S:{"1":"MC"}},B:5,C:"KeyboardEvent.code"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js new file mode 100644 index 000000000000..e169fb635a40 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B P H jB kB lB mB L EB oB","16":"C"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q S","2":"A B L EB","16":"C"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"KeyboardEvent.getModifierState()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-key.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-key.js new file mode 100644 index 000000000000..3c158e6e1194 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-key.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","260":"D A B"},B:{"1":"UB IB N","260":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y nB fB","132":"Z a b c d e"},D:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB","16":"C"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"1":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"S","2":"A B L EB","16":"C Q"},L:{"1":"N"},M:{"1":"M"},N:{"260":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:5,C:"KeyboardEvent.key"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-location.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-location.js new file mode 100644 index 000000000000..5ec2f7c5180e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-location.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","16":"I xB WB","132":"G U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","16":"C","132":"P H"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB","132":"rB sB tB"},H:{"2":"7B"},I:{"1":"N CC DC","16":"8B 9B","132":"GB G AC BC HB"},J:{"132":"F A"},K:{"1":"Q S","2":"A B L EB","16":"C"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"KeyboardEvent.location"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/keyboardevent-which.js b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-which.js new file mode 100644 index 000000000000..30867b76ec46 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/keyboardevent-which.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB","16":"U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","16":"D jB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB","16":"8B 9B","132":"CC DC"},J:{"1":"F A"},K:{"1":"A B C L EB S","132":"Q"},L:{"132":"N"},M:{"132":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"2":"G","132":"FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:7,C:"KeyboardEvent.which"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/lazyload.js b/website/www/node_modules/caniuse-lite/data/features/lazyload.js new file mode 100644 index 000000000000..51746a791a30 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/lazyload.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"1":"B","2":"A"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Resource Hints: Lazyload"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/let.js b/website/www/node_modules/caniuse-lite/data/features/let.js new file mode 100644 index 000000000000..6fa3f046aaa4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/let.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","2052":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","194":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K","322":"V W X Y Z a b c d e f g h i j k l m n o p q","516":"r s t u v Q x y"},E:{"1":"B C O L S hB iB","2":"G U I F E D xB WB aB bB cB dB","1028":"A VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","322":"P H J K V W X Y Z a b c d","516":"e f g h i j k l"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB","1028":"XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","516":"G"},Q:{"2":"KC"},R:{"516":"LC"},S:{"1":"MC"}},B:6,C:"let"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-icon-png.js b/website/www/node_modules/caniuse-lite/data/features/link-icon-png.js new file mode 100644 index 000000000000..d90713e252ec --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-icon-png.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K","129":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"129":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"257":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"129":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","513":"D B C jB kB lB mB L EB oB S"},G:{"1026":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1026":"7B"},I:{"1":"GB G 8B 9B AC BC HB","513":"N CC DC"},J:{"1":"F","1026":"A"},K:{"1026":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1026":"A B"},O:{"257":"EC"},P:{"1":"FC GC HC IC JC VB L","513":"G"},Q:{"129":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"PNG favicons"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-icon-svg.js b/website/www/node_modules/caniuse-lite/data/features/link-icon-svg.js new file mode 100644 index 000000000000..34cc0f870399 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-icon-svg.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB","3073":"IB N"},C:{"2":"qB GB nB fB","260":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","1025":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","3073":"IB N eB ZB YB"},E:{"2":"G U I F E xB WB aB bB cB","516":"D A B C O dB VB L S hB iB"},F:{"1":"0 1 2 3 u v Q x y z","2":"4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t AB CB DB BB w jB kB lB mB L EB oB S","3073":"R M"},G:{"130":"E WB pB HB rB sB tB uB","516":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"130":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","130":"A"},K:{"130":"A B C Q L EB S"},L:{"3073":"N"},M:{"2":"M"},N:{"130":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1025":"MC"}},B:1,C:"SVG favicons"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js new file mode 100644 index 000000000000..55336e714c93 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E gB","132":"D"},B:{"1":"C O T P H J K UB IB N"},C:{"2":"qB GB","260":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"16":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Resource Hints: dns-prefetch"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js new file mode 100644 index 000000000000..41a2f5d630fc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"3 4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"JC VB L","2":"G FC GC HC IC"},Q:{"16":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:1,C:"Resource Hints: modulepreload"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-preconnect.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-preconnect.js new file mode 100644 index 000000000000..5b28321c1c2c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-preconnect.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T","260":"P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o nB fB","129":"p"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"16":"M"},N:{"2":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Resource Hints: preconnect"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-prefetch.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-prefetch.js new file mode 100644 index 000000000000..780a62cef314 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-prefetch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"G N CC DC","2":"GB 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Resource Hints: prefetch"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-preload.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-preload.js new file mode 100644 index 000000000000..22c043ed1107 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-preload.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H","1028":"J K"},C:{"2":"0 1 2 3 4 5 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","132":"6","578":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","322":"B"},F:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB","322":"zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"578":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Resource Hints: preload"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/link-rel-prerender.js b/website/www/node_modules/caniuse-lite/data/features/link-rel-prerender.js new file mode 100644 index 000000000000..2ed2e9c247d8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/link-rel-prerender.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"1":"B","2":"A"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"Resource Hints: prerender"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/loading-lazy-attr.js b/website/www/node_modules/caniuse-lite/data/features/loading-lazy-attr.js new file mode 100644 index 000000000000..0b4b1b1c3eda --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/loading-lazy-attr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB nB fB"},D:{"1":"QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB","194":"PB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"9 BB w R M","2":"0 1 2 3 4 5 6 7 8 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B","322":"6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"Lazy loading via attribute for images & iframes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/localecompare.js b/website/www/node_modules/caniuse-lite/data/features/localecompare.js new file mode 100644 index 000000000000..269ab1ce42a0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/localecompare.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","16":"gB","132":"I F E D A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z"},E:{"1":"A B C O VB L S hB iB","132":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B C jB kB lB mB L EB oB","132":"S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"E WB pB HB rB sB tB uB vB wB"},H:{"132":"7B"},I:{"1":"N CC DC","132":"GB G 8B 9B AC BC HB"},J:{"132":"F A"},K:{"1":"Q","16":"A B C L EB","132":"S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","132":"A"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","132":"G"},Q:{"132":"KC"},R:{"1":"LC"},S:{"4":"MC"}},B:6,C:"localeCompare()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/magnetometer.js b/website/www/node_modules/caniuse-lite/data/features/magnetometer.js new file mode 100644 index 000000000000..5dccfa434605 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/magnetometer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"8 9 TB AB FB CB DB BB w"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"194":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Magnetometer"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/matchesselector.js b/website/www/node_modules/caniuse-lite/data/features/matchesselector.js new file mode 100644 index 000000000000..d6cb918291e5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/matchesselector.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","36":"D A B"},B:{"1":"P H J K UB IB N","36":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB","36":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","36":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G xB WB","36":"U I F aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B jB kB lB mB L","36":"C P H J K V W EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB","36":"pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N","2":"8B","36":"GB G 9B AC BC HB CC DC"},J:{"36":"F A"},K:{"1":"Q","2":"A B","36":"C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"36":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","36":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"matches() DOM method"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/matchmedia.js b/website/www/node_modules/caniuse-lite/data/features/matchmedia.js new file mode 100644 index 000000000000..5b67c5a691ff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/matchmedia.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"matchMedia"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mathml.js b/website/www/node_modules/caniuse-lite/data/features/mathml.js new file mode 100644 index 000000000000..1dd2c2bed4eb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mathml.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"D A B gB","8":"I F E"},B:{"2":"C O T P H J K","8":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","129":"qB GB nB fB"},D:{"1":"a","8":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","260":"G U I F E D xB WB aB bB cB dB"},F:{"2":"D","4":"B C jB kB lB mB L EB oB S","8":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB"},H:{"8":"7B"},I:{"8":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"A","8":"F"},K:{"8":"A B C Q L EB S"},L:{"8":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"4":"EC"},P:{"8":"G FC GC HC IC JC VB L"},Q:{"8":"KC"},R:{"8":"LC"},S:{"1":"MC"}},B:2,C:"MathML"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/maxlength.js b/website/www/node_modules/caniuse-lite/data/features/maxlength.js new file mode 100644 index 000000000000..c6359091ea14 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/maxlength.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","16":"gB","900":"I F E D"},B:{"1":"UB IB N","1025":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","900":"qB GB nB fB","1025":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"U xB","900":"G WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D","132":"B C jB kB lB mB L EB oB S"},G:{"1":"pB HB rB sB tB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB","2052":"E uB"},H:{"132":"7B"},I:{"1":"GB G AC BC HB CC DC","16":"8B 9B","4097":"N"},J:{"1":"F A"},K:{"132":"A B C L EB S","4100":"Q"},L:{"4097":"N"},M:{"4097":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"4097":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1025":"MC"}},B:1,C:"maxlength attribute for input and textarea elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/media-attribute.js b/website/www/node_modules/caniuse-lite/data/features/media-attribute.js new file mode 100644 index 000000000000..105ff7ce9b7c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/media-attribute.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K","16":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j","2":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","16":"eB ZB YB"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"B C P H J K V W X Y Z a kB lB mB L EB oB S","2":"0 1 2 3 4 5 6 7 8 9 D b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"16":"7B"},I:{"1":"G N BC HB CC DC","16":"GB 8B 9B AC"},J:{"16":"F A"},K:{"1":"C Q S","16":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Media attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/media-fragments.js b/website/www/node_modules/caniuse-lite/data/features/media-fragments.js new file mode 100644 index 000000000000..231241fc04b4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/media-fragments.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","132":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j nB fB","132":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J","132":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U xB WB aB","132":"I F E D A B C O bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","132":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB rB sB tB","132":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","132":"N CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"132":"N"},M:{"132":"M"},N:{"132":"A B"},O:{"2":"EC"},P:{"2":"G FC","132":"GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"132":"MC"}},B:2,C:"Media Fragments"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/media-session-api.js b/website/www/node_modules/caniuse-lite/data/features/media-session-api.js new file mode 100644 index 000000000000..2030e2b3191e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/media-session-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S","16":"hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Media Session API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js b/website/www/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js new file mode 100644 index 000000000000..2ca018fae1a6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s nB fB","260":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","324":"1 2 3 4 5 6 7 8 TB AB FB"},E:{"2":"G U I F E D A xB WB aB bB cB dB VB","132":"B C O L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S","324":"m n o p q r s t u v Q x"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"260":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"1":"IC JC VB L","2":"G","132":"FC GC HC"},Q:{"132":"KC"},R:{"2":"LC"},S:{"260":"MC"}},B:5,C:"Media Capture from DOM Elements API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mediarecorder.js b/website/www/node_modules/caniuse-lite/data/features/mediarecorder.js new file mode 100644 index 000000000000..f5804229c167 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mediarecorder.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q","194":"x y"},E:{"1":"hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L","322":"O S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j jB kB lB mB L EB oB S","194":"k l"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B","578":"1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:5,C:"MediaRecorder API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mediasource.js b/website/www/node_modules/caniuse-lite/data/features/mediasource.js new file mode 100644 index 000000000000..5a8f018f1426 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mediasource.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","260":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB","194":"b c d e f g h i j k l m n o p q r"},D:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H","33":"Z a b c d e f g","66":"J K V W X Y"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B","1028":"3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB CC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"514":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Media Source Extensions"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/menu.js b/website/www/node_modules/caniuse-lite/data/features/menu.js new file mode 100644 index 000000000000..edac5e32f9f7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/menu.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","2114":"UB IB N"},C:{"2":"qB GB G U I F nB fB","132":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","322":"0 1 y z","578":"r s t u v Q x","2114":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S","322":"l m n o","2114":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1156":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2114":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Context menu item (menuitem element)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/meta-theme-color.js b/website/www/node_modules/caniuse-lite/data/features/meta-theme-color.js new file mode 100644 index 000000000000..6107d96ee9f1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/meta-theme-color.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o","132":"NB OB PB QB RB SB UB IB N eB ZB YB","258":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"513":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"GC HC IC JC VB L","2":"G","16":"FC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"theme-color Meta Tag"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/meter.js b/website/www/node_modules/caniuse-lite/data/features/meter.js new file mode 100644 index 000000000000..86aaa6c93b28 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/meter.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D jB kB lB mB"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"meter element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/midi.js b/website/www/node_modules/caniuse-lite/data/features/midi.js new file mode 100644 index 000000000000..f3a61f223739 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/midi.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"Web MIDI API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/minmaxwh.js b/website/www/node_modules/caniuse-lite/data/features/minmaxwh.js new file mode 100644 index 000000000000..f1b6daf10339 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/minmaxwh.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","8":"I gB","129":"F","257":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"CSS min/max-width/height"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mp3.js b/website/www/node_modules/caniuse-lite/data/features/mp3.js new file mode 100644 index 000000000000..422841760e3e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mp3.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","132":"G U I F E D A B C O T P H J K V W X nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","2":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"MP3 audio format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mpeg-dash.js b/website/www/node_modules/caniuse-lite/data/features/mpeg-dash.js new file mode 100644 index 000000000000..fa518ae9d590 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mpeg-dash.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","386":"X Y"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Dynamic Adaptive Streaming over HTTP (MPEG-DASH)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mpeg4.js b/website/www/node_modules/caniuse-lite/data/features/mpeg4.js new file mode 100644 index 000000000000..4d30b2f73a04 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mpeg4.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W nB fB","4":"X Y Z a b c d e f g h i j k"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","2":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","4":"GB G 8B 9B BC HB","132":"AC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"260":"M"},N:{"1":"A B"},O:{"4":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"MPEG-4/H.264 video format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/multibackgrounds.js b/website/www/node_modules/caniuse-lite/data/features/multibackgrounds.js new file mode 100644 index 000000000000..bdaf78077d3c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/multibackgrounds.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 Multiple backgrounds"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/multicolumn.js b/website/www/node_modules/caniuse-lite/data/features/multicolumn.js new file mode 100644 index 000000000000..e7bc93631e29 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/multicolumn.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K","516":"UB IB N"},C:{"132":"2 3 4 5 6 7 8 TB AB FB CB DB BB","164":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","516":"9 w R M JB KB LB MB NB OB PB QB RB SB"},D:{"420":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","516":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"A B C O VB L S hB iB","132":"D dB","164":"F E cB","420":"G U I xB WB aB bB"},F:{"1":"C L EB oB S","2":"D B jB kB lB mB","420":"P H J K V W X Y Z a b c d e f g h i j k l m","516":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"vB wB","164":"E tB uB","420":"WB pB HB rB sB"},H:{"1":"7B"},I:{"420":"GB G 8B 9B AC BC HB CC DC","516":"N"},J:{"420":"F A"},K:{"1":"C L EB S","2":"A B","132":"Q"},L:{"516":"N"},M:{"132":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","420":"G"},Q:{"132":"KC"},R:{"132":"LC"},S:{"164":"MC"}},B:4,C:"CSS3 Multiple column layout"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mutation-events.js b/website/www/node_modules/caniuse-lite/data/features/mutation-events.js new file mode 100644 index 000000000000..814f93959175 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mutation-events.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","260":"D A B"},B:{"132":"UB IB N","260":"C O T P H J K"},C:{"2":"qB GB G U nB fB","260":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"16":"G U I F E D A B C O T","132":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"16":"xB WB","132":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"1":"C oB S","2":"D jB kB lB mB","16":"B L EB","132":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"16":"WB pB","132":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"8B 9B","132":"GB G N AC BC HB CC DC"},J:{"132":"F A"},K:{"1":"C S","2":"A","16":"B L EB","132":"Q"},L:{"132":"N"},M:{"260":"M"},N:{"260":"A B"},O:{"132":"EC"},P:{"132":"G FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"260":"MC"}},B:5,C:"Mutation events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/mutationobserver.js b/website/www/node_modules/caniuse-lite/data/features/mutationobserver.js new file mode 100644 index 000000000000..804a75a075f2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/mutationobserver.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E gB","8":"D A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J","33":"K V W X Y Z a b c"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","33":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","33":"sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB 8B 9B AC","8":"G BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","8":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Mutation Observer"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/namevalue-storage.js b/website/www/node_modules/caniuse-lite/data/features/namevalue-storage.js new file mode 100644 index 000000000000..135b2f875f84 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/namevalue-storage.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"gB","8":"I F"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","4":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Web Storage - name/value pairs"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/native-filesystem-api.js b/website/www/node_modules/caniuse-lite/data/features/native-filesystem-api.js new file mode 100644 index 000000000000..ab3c7e768fc3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/native-filesystem-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB","194":"QB RB UB IB N eB ZB YB","450":"SB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"194":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Native Filesystem API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/nav-timing.js b/website/www/node_modules/caniuse-lite/data/features/nav-timing.js new file mode 100644 index 000000000000..8c6c2cd757e3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/nav-timing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U","33":"I F E D A B C"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"G N BC HB CC DC","2":"GB 8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"Navigation Timing API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/navigator-language.js b/website/www/node_modules/caniuse-lite/data/features/navigator-language.js new file mode 100644 index 000000000000..084fec73daf4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/navigator-language.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"16":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"16":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"1":"MC"}},B:2,C:"Navigator Language API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/netinfo.js b/website/www/node_modules/caniuse-lite/data/features/netinfo.js new file mode 100644 index 000000000000..00accfe93c9e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/netinfo.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","1028":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB","1028":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x jB kB lB mB L EB oB S","1028":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"8B CC DC","132":"GB G 9B AC BC HB"},J:{"2":"F A"},K:{"2":"A B C L EB S","516":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"IC JC VB L","132":"G","516":"FC GC HC"},Q:{"2":"KC"},R:{"516":"LC"},S:{"260":"MC"}},B:7,C:"Network Information API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/node-contains.js b/website/www/node_modules/caniuse-lite/data/features/node-contains.js new file mode 100644 index 000000000000..607dea786cbb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/node-contains.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"gB","644":"D A B","2308":"I F E"},B:{"1":"O T P H J K UB IB N","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","16":"G U I xB WB","1668":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","16":"D B C jB kB lB mB L EB","132":"oB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB"},H:{"16":"7B"},I:{"1":"N CC DC","16":"GB 8B 9B AC","1668":"G BC HB"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Node.contains()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/node-parentelement.js b/website/www/node_modules/caniuse-lite/data/features/node-parentelement.js new file mode 100644 index 000000000000..32c1e3e27bb1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/node-parentelement.js @@ -0,0 +1 @@ +module.exports={A:{A:{"16":"gB","132":"D A B","260":"I F E"},B:{"1":"O T P H J K UB IB N","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D B jB kB lB mB L EB","132":"C oB S"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB"},H:{"16":"7B"},I:{"1":"G N BC HB CC DC","16":"GB 8B 9B AC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Node.parentElement"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/notifications.js b/website/www/node_modules/caniuse-lite/data/features/notifications.js new file mode 100644 index 000000000000..7d912be8e1d5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/notifications.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G","36":"U I F E D A B C O T P H J K V W X"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","36":"N CC DC"},J:{"1":"A","2":"F"},K:{"2":"A B C L EB S","36":"Q"},L:{"513":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"36":"G","258":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"258":"LC"},S:{"1":"MC"}},B:1,C:"Web Notifications"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/object-entries.js b/website/www/node_modules/caniuse-lite/data/features/object-entries.js new file mode 100644 index 000000000000..1dacbb153ba2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/object-entries.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","16":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:6,C:"Object.entries"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/object-fit.js b/website/www/node_modules/caniuse-lite/data/features/object-fit.js new file mode 100644 index 000000000000..0e0d6aff71f1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/object-fit.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P","260":"H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g"},E:{"1":"A B C O VB L S hB iB","2":"G U I F xB WB aB bB","132":"E D cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D P H J K jB kB lB","33":"B C mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","132":"E uB vB wB"},H:{"33":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB CC"},J:{"2":"F A"},K:{"1":"Q","2":"A","33":"B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 object-fit/object-position"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/object-observe.js b/website/www/node_modules/caniuse-lite/data/features/object-observe.js new file mode 100644 index 000000000000..54f04de76dd7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/object-observe.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"m n o p q r s t u v Q x y z","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"Z a b c d e f g h i j k l m","2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G","2":"FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"Object.observe data binding"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/object-values.js b/website/www/node_modules/caniuse-lite/data/features/object-values.js new file mode 100644 index 000000000000..dc0fd9cdc559 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/object-values.js @@ -0,0 +1 @@ +module.exports={A:{A:{"8":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O VB L S hB iB","8":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z AB CB DB BB w R M","8":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","8":"E WB pB HB rB sB tB uB vB wB XB"},H:{"8":"7B"},I:{"1":"N","8":"GB G 8B 9B AC BC HB CC DC"},J:{"8":"F A"},K:{"1":"Q","8":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","8":"G FC"},Q:{"1":"KC"},R:{"8":"LC"},S:{"1":"MC"}},B:6,C:"Object.values method"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/objectrtc.js b/website/www/node_modules/caniuse-lite/data/features/objectrtc.js new file mode 100644 index 000000000000..ce8d0ee2ad3c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/objectrtc.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K","2":"C UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","130":"A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Object RTC (ORTC) API for WebRTC"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/offline-apps.js b/website/www/node_modules/caniuse-lite/data/features/offline-apps.js new file mode 100644 index 000000000000..7fb7ad2351fe --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/offline-apps.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"D gB","8":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","4":"GB","8":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","2":"eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","8":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB","8":"kB lB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"Offline web applications"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/offscreencanvas.js b/website/www/node_modules/caniuse-lite/data/features/offscreencanvas.js new file mode 100644 index 000000000000..98197a0e739c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/offscreencanvas.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t nB fB","194":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","322":"8 9 TB AB FB CB DB BB w R M"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"9 BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u jB kB lB mB L EB oB S","322":"0 1 2 3 4 5 6 7 8 v Q x y z AB CB DB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"194":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"194":"MC"}},B:1,C:"OffscreenCanvas"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ogg-vorbis.js b/website/www/node_modules/caniuse-lite/data/features/ogg-vorbis.js new file mode 100644 index 000000000000..d92de29c83c9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ogg-vorbis.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"A","2":"F"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Ogg Vorbis audio format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ogv.js b/website/www/node_modules/caniuse-lite/data/features/ogv.js new file mode 100644 index 000000000000..bcf094664918 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ogv.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","8":"D A B"},B:{"1":"J K UB IB N","8":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:6,C:"Ogg/Theora video format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ol-reversed.js b/website/www/node_modules/caniuse-lite/data/features/ol-reversed.js new file mode 100644 index 000000000000..288a3c65d995 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ol-reversed.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P","16":"H J K V"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","16":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","16":"C"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Reversed attribute of ordered lists"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/once-event-listener.js b/website/www/node_modules/caniuse-lite/data/features/once-event-listener.js new file mode 100644 index 000000000000..fe764a9bf5e2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/once-event-listener.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"\"once\" event listener option"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/online-status.js b/website/www/node_modules/caniuse-lite/data/features/online-status.js new file mode 100644 index 000000000000..24921ea218de --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/online-status.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F gB","260":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB","516":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB","4":"S"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"A","132":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Online/offline status"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/opus.js b/website/www/node_modules/caniuse-lite/data/features/opus.js new file mode 100644 index 000000000000..c8db31bd82fe --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/opus.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i"},E:{"2":"G U I F E D A xB WB aB bB cB dB VB","132":"B C O L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB","132":"zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Opus"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/orientation-sensor.js b/website/www/node_modules/caniuse-lite/data/features/orientation-sensor.js new file mode 100644 index 000000000000..186656a26595 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/orientation-sensor.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"8 9 TB AB FB CB DB BB w"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Orientation Sensor"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/outline.js b/website/www/node_modules/caniuse-lite/data/features/outline.js new file mode 100644 index 000000000000..760c23560a27 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/outline.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","260":"E","388":"D A B"},B:{"1":"P H J K UB IB N","388":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB","129":"S","260":"D B jB kB lB mB L EB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"C Q S","260":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"388":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS outline properties"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/pad-start-end.js b/website/www/node_modules/caniuse-lite/data/features/pad-start-end.js new file mode 100644 index 000000000000..ff35214293b4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/pad-start-end.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:6,C:"String.prototype.padStart(), String.prototype.padEnd()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/page-transition-events.js b/website/www/node_modules/caniuse-lite/data/features/page-transition-events.js new file mode 100644 index 000000000000..8b838c7e5622 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/page-transition-events.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"PageTransitionEvent"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/pagevisibility.js b/website/www/node_modules/caniuse-lite/data/features/pagevisibility.js new file mode 100644 index 000000000000..35cf8f660398 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/pagevisibility.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D nB fB","33":"A B C O T P H J"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O","33":"T P H J K V W X Y Z a b c d e f g h i"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U I xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB","33":"P H J K V"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB","33":"CC DC"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","33":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"Page Visibility"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/passive-event-listener.js b/website/www/node_modules/caniuse-lite/data/features/passive-event-listener.js new file mode 100644 index 000000000000..edc662df0d55 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/passive-event-listener.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"Passive event listeners"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/passwordrules.js b/website/www/node_modules/caniuse-lite/data/features/passwordrules.js new file mode 100644 index 000000000000..d1e1dfdb9c93 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/passwordrules.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","16":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB nB fB","16":"RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N","16":"eB ZB YB"},E:{"1":"C O S","2":"G U I F E D A B xB WB aB bB cB dB VB L","16":"hB iB"},F:{"2":"0 1 2 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S","16":"3 4 5 6 7 8 9 AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","16":"N"},J:{"2":"F","16":"A"},K:{"2":"A B C L EB S","16":"Q"},L:{"16":"N"},M:{"16":"M"},N:{"2":"A","16":"B"},O:{"16":"EC"},P:{"2":"G FC GC","16":"HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:1,C:"Password Rules"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/path2d.js b/website/www/node_modules/caniuse-lite/data/features/path2d.js new file mode 100644 index 000000000000..0e5a7e5ed593 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/path2d.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O","132":"T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB","132":"h i j k l m n o p q r s t u v Q x"},D:{"1":"M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l","132":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB","132":"E D cB"},F:{"1":"5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y jB kB lB mB L EB oB S","132":"0 1 2 3 4 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","16":"E","132":"uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"1":"A","2":"F"},K:{"2":"A B C L EB S","132":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"1":"VB L","132":"G FC GC HC IC JC"},Q:{"132":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:1,C:"Path2D"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/payment-request.js b/website/www/node_modules/caniuse-lite/data/features/payment-request.js new file mode 100644 index 000000000000..fc632aa777c2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/payment-request.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O","322":"T","8196":"P H J K"},C:{"2":"0 1 2 3 4 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","4162":"5 6 7 8 9 TB AB FB CB DB BB","16452":"w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"SB UB IB N eB ZB YB","2":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"3 4 5 6 7 8","1090":"TB AB","8196":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB"},E:{"1":"O S hB iB","2":"G U I F E D xB WB aB bB cB dB","514":"A B VB","8196":"C L"},F:{"1":"w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p jB kB lB mB L EB oB S","194":"q r s t u v Q x","8196":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB","514":"XB yB zB","8196":"0B 1B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2052":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","8196":"FC GC HC IC JC VB L"},Q:{"194":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:4,C:"Payment Request API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/permissions-api.js b/website/www/node_modules/caniuse-lite/data/features/permissions-api.js new file mode 100644 index 000000000000..70c29b3621ea --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/permissions-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:7,C:"Permissions API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/picture-in-picture.js b/website/www/node_modules/caniuse-lite/data/features/picture-in-picture.js new file mode 100644 index 000000000000..f4c3b817dfd8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/picture-in-picture.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w nB fB","132":"MB NB OB PB QB RB SB","1090":"R","1412":"LB","1668":"M JB KB"},D:{"1":"KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M","2114":"JB"},E:{"1":"hB iB","2":"G U I F E D xB WB aB bB cB dB","4100":"A B C O VB L S"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m jB kB lB mB L EB oB S","8196":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB","4100":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"16388":"N"},M:{"16388":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Picture-in-Picture"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/picture.js b/website/www/node_modules/caniuse-lite/data/features/picture.js new file mode 100644 index 000000000000..43a8f2d3a6b6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/picture.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j nB fB","578":"k l m n"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m","194":"n"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S","322":"a"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Picture element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ping.js b/website/www/node_modules/caniuse-lite/data/features/ping.js new file mode 100644 index 000000000000..60e3834852cf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ping.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"2":"qB","194":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"194":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"194":"MC"}},B:1,C:"Ping attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/png-alpha.js b/website/www/node_modules/caniuse-lite/data/features/png-alpha.js new file mode 100644 index 000000000000..9447774aff7e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/png-alpha.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"F E D A B","2":"gB","8":"I"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"PNG alpha transparency"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/pointer-events.js b/website/www/node_modules/caniuse-lite/data/features/pointer-events.js new file mode 100644 index 000000000000..d8f7cf0cb37f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/pointer-events.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"CSS pointer-events (for HTML)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/pointer.js b/website/www/node_modules/caniuse-lite/data/features/pointer.js new file mode 100644 index 000000000000..7c203e1ad2fd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/pointer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D gB","164":"A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB","8":"I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q","328":"0 1 2 3 4 5 6 7 8 r s t u v Q x y z"},D:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X","8":"0 1 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","584":"2 3 4"},E:{"1":"O hB iB","2":"G U I xB WB aB","8":"F E D A B C bB cB dB VB L","1096":"S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","8":"P H J K V W X Y Z a b c d e f g h i j k l m n o","584":"p q r"},G:{"1":"4B 5B 6B","8":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B","6148":"3B"},H:{"2":"7B"},I:{"1":"N","8":"GB G 8B 9B AC BC HB CC DC"},J:{"8":"F A"},K:{"1":"Q","2":"A","8":"B C L EB S"},L:{"1":"N"},M:{"328":"M"},N:{"1":"B","36":"A"},O:{"8":"EC"},P:{"1":"GC HC IC JC VB L","2":"FC","8":"G"},Q:{"584":"KC"},R:{"2":"LC"},S:{"328":"MC"}},B:2,C:"Pointer events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/pointerlock.js b/website/www/node_modules/caniuse-lite/data/features/pointerlock.js new file mode 100644 index 000000000000..01fece880ed9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/pointerlock.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O nB fB","33":"T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},D:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P","33":"Y Z a b c d e f g h i j k l m","66":"H J K V W X"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y Z"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:2,C:"Pointer Lock API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/prefers-color-scheme.js b/website/www/node_modules/caniuse-lite/data/features/prefers-color-scheme.js new file mode 100644 index 000000000000..bfc8c1cbec7d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/prefers-color-scheme.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w nB fB"},D:{"1":"QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"1":"9 CB DB BB w R M","2":"0 1 2 3 4 5 6 7 8 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"prefers-color-scheme media query"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js b/website/www/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js new file mode 100644 index 000000000000..70b049c141e2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB nB fB"},D:{"1":"OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"9 BB w R M","2":"0 1 2 3 4 5 6 7 8 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"prefers-reduced-motion media query"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/private-class-fields.js b/website/www/node_modules/caniuse-lite/data/features/private-class-fields.js new file mode 100644 index 000000000000..e9946b9306db --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/private-class-fields.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Private class fields"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/private-methods-and-accessors.js b/website/www/node_modules/caniuse-lite/data/features/private-methods-and-accessors.js new file mode 100644 index 000000000000..bb93de603afd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/private-methods-and-accessors.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Public class fields"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/progress.js b/website/www/node_modules/caniuse-lite/data/features/progress.js new file mode 100644 index 000000000000..d49b53732084 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/progress.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D jB kB lB mB"},G:{"2":"WB pB HB rB sB","132":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"progress element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/promise-finally.js b/website/www/node_modules/caniuse-lite/data/features/promise-finally.js new file mode 100644 index 000000000000..581291856bbf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/promise-finally.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"K UB IB N","2":"C O T P H J"},C:{"1":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"IC JC VB L","2":"G FC GC HC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Promise.prototype.finally"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/promises.js b/website/www/node_modules/caniuse-lite/data/features/promises.js new file mode 100644 index 000000000000..045b68020ec7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/promises.js @@ -0,0 +1 @@ +module.exports={A:{A:{"8":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","4":"d e","8":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"i","8":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h"},E:{"1":"E D A B C O cB dB VB L S hB iB","8":"G U I F xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","4":"V","8":"D B C P H J K jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB rB sB tB"},H:{"8":"7B"},I:{"1":"N DC","8":"GB G 8B 9B AC BC HB CC"},J:{"8":"F A"},K:{"1":"Q","8":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Promises"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/proximity.js b/website/www/node_modules/caniuse-lite/data/features/proximity.js new file mode 100644 index 000000000000..f77a27d53483 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/proximity.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:4,C:"Proximity API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/proxy.js b/website/www/node_modules/caniuse-lite/data/features/proxy.js new file mode 100644 index 000000000000..67a8f1d27ae6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/proxy.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K o p q r s t u v Q x y","66":"V W X Y Z a b c d e f g h i j k l m n"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C b c d e f g h i j k l jB kB lB mB L EB oB S","66":"P H J K V W X Y Z a"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:6,C:"Proxy object"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/public-class-fields.js b/website/www/node_modules/caniuse-lite/data/features/public-class-fields.js new file mode 100644 index 000000000000..b02059677f50 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/public-class-fields.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Public class fields"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/publickeypinning.js b/website/www/node_modules/caniuse-lite/data/features/publickeypinning.js new file mode 100644 index 000000000000..e336ac6512a6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/publickeypinning.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB","2":"D B C P H J K V w R M jB kB lB mB L EB oB S","4":"Z","16":"W X Y a"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB","2":"L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Public Key Pinning"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/push-api.js b/website/www/node_modules/caniuse-lite/data/features/push-api.js new file mode 100644 index 000000000000..eeddae9f2d0e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/push-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K","2":"C O T P H","257":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t nB fB","257":"0 1 3 4 5 6 7 8 9 u Q x y z TB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","1281":"2 v AB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t","257":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","388":"u v Q x y z"},E:{"2":"G U I F E D xB WB aB bB cB","514":"A B C O dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m jB kB lB mB L EB oB S","16":"n o p q r","257":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"2":"LC"},S:{"257":"MC"}},B:5,C:"Push API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/queryselector.js b/website/www/node_modules/caniuse-lite/data/features/queryselector.js new file mode 100644 index 000000000000..9ce243466eb1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/queryselector.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"gB","8":"I F","132":"E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","8":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","8":"D jB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"querySelector/querySelectorAll"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/readonly-attr.js b/website/www/node_modules/caniuse-lite/data/features/readonly-attr.js new file mode 100644 index 000000000000..1e83c64196a6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/readonly-attr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","16":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","16":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D jB","132":"B C kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","132":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"257":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"readonly attribute of input and textarea elements"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/referrer-policy.js b/website/www/node_modules/caniuse-lite/data/features/referrer-policy.js new file mode 100644 index 000000000000..7e085eff4116 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/referrer-policy.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB","2":"G U I F E D A B C O T P H J K V W","260":"0 1 2 3 4 5 6 7 8 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB","513":"ZB YB"},E:{"1":"C O L S hB iB","2":"G U I F xB WB aB bB","132":"E D A B cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","132":"E uB vB wB XB yB zB 0B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Referrer Policy"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/registerprotocolhandler.js b/website/www/node_modules/caniuse-lite/data/features/registerprotocolhandler.js new file mode 100644 index 000000000000..9aaa3c0c0b4f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/registerprotocolhandler.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","129":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"2":"G U I F E D A B C","129":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B jB kB lB mB L EB","129":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F","129":"A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"Custom protocol handling"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rel-noopener.js b/website/www/node_modules/caniuse-lite/data/features/rel-noopener.js new file mode 100644 index 000000000000..daa068887b6e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rel-noopener.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:1,C:"rel=noopener"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rel-noreferrer.js b/website/www/node_modules/caniuse-lite/data/features/rel-noreferrer.js new file mode 100644 index 000000000000..609ab12867ff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rel-noreferrer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","132":"B"},B:{"1":"O T P H J K UB IB N","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Link type \"noreferrer\""}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rellist.js b/website/www/node_modules/caniuse-lite/data/features/rellist.js new file mode 100644 index 000000000000..e13e99ae2052 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rellist.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"K UB IB N","2":"C O T P H","132":"J"},C:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f nB fB"},D:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","132":"0 1 2 3 4 5 6 7 8 TB AB FB CB DB BB"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F E xB WB aB bB cB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m jB kB lB mB L EB oB S","132":"0 1 n o p q r s t u v Q x y z"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"1":"JC VB L","2":"G","132":"FC GC HC IC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"relList (DOMTokenList)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rem.js b/website/www/node_modules/caniuse-lite/data/features/rem.js new file mode 100644 index 000000000000..61e8c22d385e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rem.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E gB","132":"D A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB"},G:{"1":"E pB HB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB","260":"rB"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"rem (root em) units"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/replace-all.js b/website/www/node_modules/caniuse-lite/data/features/replace-all.js new file mode 100644 index 000000000000..a78092838ff6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/replace-all.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"hB iB","2":"G U I F E D A B C O xB WB aB bB cB dB VB L S"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"16":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"16":"LC"},S:{"16":"MC"}},B:7,C:"String.prototype.replaceAll()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/requestanimationframe.js b/website/www/node_modules/caniuse-lite/data/features/requestanimationframe.js new file mode 100644 index 000000000000..6ff771582000 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/requestanimationframe.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","33":"B C O T P H J K V W X Y","164":"G U I F E D A"},D:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D","33":"Y Z","164":"K V W X","420":"A B C O T P H J"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","33":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","33":"sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"requestAnimationFrame"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/requestidlecallback.js b/website/www/node_modules/caniuse-lite/data/features/requestidlecallback.js new file mode 100644 index 000000000000..bd1cf3640eaa --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/requestidlecallback.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","194":"3 4"},D:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:5,C:"requestIdleCallback"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/resizeobserver.js b/website/www/node_modules/caniuse-lite/data/features/resizeobserver.js new file mode 100644 index 000000000000..1d3e66b25a63 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/resizeobserver.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M nB fB"},D:{"1":"9 BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","194":"4 5 6 7 8 TB AB FB CB DB"},E:{"1":"hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L S","66":"O"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S","194":"0 1 r s t u v Q x y z"},G:{"1":"6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"JC VB L","2":"G FC GC HC IC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Resize Observer"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/resource-timing.js b/website/www/node_modules/caniuse-lite/data/features/resource-timing.js new file mode 100644 index 000000000000..3764a99f5a88 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/resource-timing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB","194":"h i j k"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a"},E:{"1":"C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB","260":"B"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Resource Timing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rest-parameters.js b/website/www/node_modules/caniuse-lite/data/features/rest-parameters.js new file mode 100644 index 000000000000..97cbc87700c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rest-parameters.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t","194":"u v Q"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g jB kB lB mB L EB oB S","194":"h i j"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Rest parameters"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/rtcpeerconnection.js b/website/www/node_modules/caniuse-lite/data/features/rtcpeerconnection.js new file mode 100644 index 000000000000..ef803cfb5d09 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/rtcpeerconnection.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T","516":"P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB","33":"Y Z a b c d e f g h i j k l m n o p q r s t"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y","33":"0 1 2 3 4 5 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D B C P H J jB kB lB mB L EB oB S","33":"K V W X Y Z a b c d e f g h i j k l m n o p q r s"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","130":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"1":"MC"}},B:5,C:"WebRTC Peer-to-peer connections"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ruby.js b/website/www/node_modules/caniuse-lite/data/features/ruby.js new file mode 100644 index 000000000000..2e393b5b091c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ruby.js @@ -0,0 +1 @@ +module.exports={A:{A:{"4":"I F E D A B gB"},B:{"4":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB"},D:{"4":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G"},E:{"4":"U I F E D A B C O aB bB cB dB VB L S hB iB","8":"G xB WB"},F:{"4":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","8":"D B C jB kB lB mB L EB oB S"},G:{"4":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB"},H:{"8":"7B"},I:{"4":"GB G N BC HB CC DC","8":"8B 9B AC"},J:{"4":"A","8":"F"},K:{"4":"Q","8":"A B C L EB S"},L:{"4":"N"},M:{"1":"M"},N:{"4":"A B"},O:{"4":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"1":"MC"}},B:1,C:"Ruby annotation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/run-in.js b/website/www/node_modules/caniuse-lite/data/features/run-in.js new file mode 100644 index 000000000000..6f4285cce7a0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/run-in.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"I F gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h","2":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I aB","2":"F E D A B C O cB dB VB L S hB iB","16":"bB","129":"G xB WB"},F:{"1":"D B C P H J K jB kB lB mB L EB oB S","2":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"pB HB rB sB tB","2":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","129":"WB"},H:{"1":"7B"},I:{"1":"GB G 8B 9B AC BC HB CC","2":"N DC"},J:{"1":"F A"},K:{"1":"A B C L EB S","2":"Q"},L:{"2":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"display: run-in"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js b/website/www/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js new file mode 100644 index 000000000000..b3233a3b2508 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","388":"B"},B:{"1":"K UB IB N","2":"C O T P","129":"H J"},C:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB nB fB"},D:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","513":"IB N eB ZB YB"},E:{"2":"G U I F E D A B xB WB aB bB cB dB VB L","2052":"hB iB","3076":"C O S"},F:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o jB kB lB mB L EB oB S"},G:{"1":"3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B","2052":"1B 2B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"513":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:6,C:"'SameSite' cookie attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/screen-orientation.js b/website/www/node_modules/caniuse-lite/data/features/screen-orientation.js new file mode 100644 index 000000000000..66fd29561b1f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/screen-orientation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","164":"B"},B:{"1":"UB IB N","36":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J nB fB","36":"K V W X Y Z a b c d e f g h i j k l m n o p q r s t"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A","36":"B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"Screen Orientation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/script-async.js b/website/www/node_modules/caniuse-lite/data/features/script-async.js new file mode 100644 index 000000000000..bc8d5d5ad010 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/script-async.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB","132":"U"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"async attribute for external scripts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/script-defer.js b/website/www/node_modules/caniuse-lite/data/features/script-defer.js new file mode 100644 index 000000000000..3e76129be5c8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/script-defer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","132":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","257":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"G xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"defer attribute for external scripts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/scrollintoview.js b/website/www/node_modules/caniuse-lite/data/features/scrollintoview.js new file mode 100644 index 000000000000..eed3db704e93 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/scrollintoview.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","132":"E D A B"},B:{"1":"UB IB N","132":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB"},E:{"2":"G U xB WB","132":"I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","2":"D jB kB lB mB","16":"B L EB","132":"C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x oB S"},G:{"16":"WB pB HB","132":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"16":"8B 9B","132":"GB G N AC BC HB CC DC"},J:{"132":"F A"},K:{"132":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"132":"EC"},P:{"132":"G FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:5,C:"scrollIntoView"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js b/website/www/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js new file mode 100644 index 000000000000..066833dc262e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"Element.scrollIntoViewIfNeeded()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sdch.js b/website/www/node_modules/caniuse-lite/data/features/sdch.js new file mode 100644 index 000000000000..d8f4e4cb6015 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sdch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","2":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"SDCH Accept-Encoding/Content-Encoding"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/selection-api.js b/website/www/node_modules/caniuse-lite/data/features/selection-api.js new file mode 100644 index 000000000000..a1636629b341 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/selection-api.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","16":"gB","260":"I F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s nB fB","2180":"0 1 t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","132":"D B C jB kB lB mB L EB oB S"},G:{"16":"HB","132":"WB pB","516":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","16":"GB G 8B 9B AC BC","1025":"HB"},J:{"1":"A","16":"F"},K:{"1":"Q","16":"A B C L EB","132":"S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","16":"A"},O:{"1025":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2180":"MC"}},B:5,C:"Selection API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/server-timing.js b/website/www/node_modules/caniuse-lite/data/features/server-timing.js new file mode 100644 index 000000000000..97a6dd6591a8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/server-timing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB nB fB"},D:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB","196":"AB FB CB DB","324":"BB"},E:{"2":"G U I F E D A B C xB WB aB bB cB dB VB L","516":"O S hB iB"},F:{"1":"2 3 4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Server Timing"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/serviceworkers.js b/website/www/node_modules/caniuse-lite/data/features/serviceworkers.js new file mode 100644 index 000000000000..743d44d381ad --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/serviceworkers.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T","322":"P H"},C:{"1":"0 1 3 4 5 6 7 8 9 u Q x y z TB FB CB DB BB w R JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","194":"j k l m n o p q r s t","513":"2 v AB M"},D:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p","4":"q r s t u"},E:{"1":"C O L S hB iB","2":"G U I F E D A B xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c jB kB lB mB L EB oB S","4":"d e f g h"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","4":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","4":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"2":"MC"}},B:5,C:"Service Workers"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/setimmediate.js b/website/www/node_modules/caniuse-lite/data/features/setimmediate.js new file mode 100644 index 000000000000..e96892b16eff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/setimmediate.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K","2":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"1":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Efficient Script Yielding: setImmediate()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sha-2.js b/website/www/node_modules/caniuse-lite/data/features/sha-2.js new file mode 100644 index 000000000000..e447fe3449f8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sha-2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","2":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"1":"GB G N 9B AC BC HB CC DC","260":"8B"},J:{"1":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"16":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"SHA-2 SSL certificates"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/shadowdom.js b/website/www/node_modules/caniuse-lite/data/features/shadowdom.js new file mode 100644 index 000000000000..dafd2b98e14e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/shadowdom.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB","2":"C O T P H J K IB N"},C:{"2":"9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","66":"0 1 2 3 4 5 6 7 8 f g h i j k l m n o p q r s t u v Q x y z TB AB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","2":"G U I F E D A B C O T P H J K V W X Y Z a IB N eB ZB YB","33":"b c d e f g h i j k"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w","2":"D B C R M jB kB lB mB L EB oB S","33":"P H J K V W X"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB","33":"CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","33":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:7,C:"Shadow DOM (deprecated V0 spec)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/shadowdomv1.js b/website/www/node_modules/caniuse-lite/data/features/shadowdomv1.js new file mode 100644 index 000000000000..fe8cef855a6a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/shadowdomv1.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","322":"8","578":"TB AB FB CB"},D:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"A B C O VB L S hB iB","2":"G U I F E D xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB","132":"XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","2":"G","4":"FC"},Q:{"1":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Shadow DOM (V1)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sharedarraybuffer.js b/website/www/node_modules/caniuse-lite/data/features/sharedarraybuffer.js new file mode 100644 index 000000000000..af2a350b6122 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sharedarraybuffer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P","194":"H J K"},C:{"2":"0 1 2 3 4 5 6 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","194":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB","450":"OB PB QB RB SB"},D:{"1":"M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB","194":"9 AB FB CB DB BB w R"},E:{"2":"G U I F E D A xB WB aB bB cB dB","194":"B C O VB L S hB iB"},F:{"1":"9 BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q jB kB lB mB L EB oB S","194":"0 1 2 3 4 5 6 7 8 x y z AB CB DB"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB","194":"yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"194":"N"},M:{"194":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"Shared Array Buffer"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sharedworkers.js b/website/www/node_modules/caniuse-lite/data/features/sharedworkers.js new file mode 100644 index 000000000000..7c75ee9c06c1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sharedworkers.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"U I aB","2":"G F E D A B C O xB WB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB kB lB"},G:{"1":"rB sB","2":"E WB pB HB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C L EB S","2":"Q","16":"A"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G","2":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"Shared Web Workers"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sni.js b/website/www/node_modules/caniuse-lite/data/features/sni.js new file mode 100644 index 000000000000..d7b4d1f15e88 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sni.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I gB","132":"F E"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB"},H:{"1":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Server Name Indication"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/spdy.js b/website/www/node_modules/caniuse-lite/data/features/spdy.js new file mode 100644 index 000000000000..8b36f3683f6a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/spdy.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D A gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","2":"1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","2":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"E D A B C dB VB L","2":"G U I F xB WB aB bB cB","129":"O S hB iB"},F:{"1":"P H J K V W X Y Z a b c d e f g h i j k l m n o p s u S","2":"0 1 2 3 4 5 6 7 8 9 D B C q r t v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB"},G:{"1":"E uB vB wB XB yB zB 0B 1B","2":"WB pB HB rB sB tB","257":"2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G BC HB CC DC","2":"N 8B 9B AC"},J:{"2":"F A"},K:{"1":"S","2":"A B C Q L EB"},L:{"2":"N"},M:{"2":"M"},N:{"1":"B","2":"A"},O:{"2":"EC"},P:{"1":"G","2":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"16":"LC"},S:{"1":"MC"}},B:7,C:"SPDY protocol"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/speech-recognition.js b/website/www/node_modules/caniuse-lite/data/features/speech-recognition.js new file mode 100644 index 000000000000..c2fdb93fdfaa --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/speech-recognition.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","164":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X nB fB","322":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a","164":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c jB kB lB mB L EB oB S","1026":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"164":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"322":"MC"}},B:7,C:"Speech Recognition API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/speech-synthesis.js b/website/www/node_modules/caniuse-lite/data/features/speech-synthesis.js new file mode 100644 index 000000000000..7dc9eccd9922 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/speech-synthesis.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K","2":"C O","257":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g nB fB","194":"h i j k l m n o p q r s t u v Q x y"},D:{"1":"0 1 2 3 4 j k l m n o p q r s t u v Q x y z","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i","257":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB","2":"D B C P H J K V W X Y Z a b c jB kB lB mB L EB oB S","257":"9 BB w R M"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:7,C:"Speech Synthesis API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/spellcheck-attribute.js b/website/www/node_modules/caniuse-lite/data/features/spellcheck-attribute.js new file mode 100644 index 000000000000..3271f7a52e20 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/spellcheck-attribute.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"4":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"4":"7B"},I:{"4":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"A","4":"F"},K:{"4":"A B C Q L EB S"},L:{"4":"N"},M:{"4":"M"},N:{"4":"A B"},O:{"4":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"4":"LC"},S:{"2":"MC"}},B:1,C:"Spellcheck attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sql-storage.js b/website/www/node_modules/caniuse-lite/data/features/sql-storage.js new file mode 100644 index 000000000000..9e168017a811 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sql-storage.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C xB WB aB bB cB dB VB L S","2":"O hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B","2":"3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:7,C:"Web SQL Database"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/srcset.js b/website/www/node_modules/caniuse-lite/data/features/srcset.js new file mode 100644 index 000000000000..e4fec4b6f77a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/srcset.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","260":"C","514":"O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h nB fB","194":"i j k l m n"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j","260":"k l m n"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F xB WB aB bB","260":"E cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W jB kB lB mB L EB oB S","260":"X Y Z a"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","260":"E uB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Srcset and sizes attributes"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/stopimmediatepropagation.js b/website/www/node_modules/caniuse-lite/data/features/stopimmediatepropagation.js new file mode 100644 index 000000000000..f6c1f2340678 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/stopimmediatepropagation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","16":"C"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB"},H:{"16":"7B"},I:{"1":"G N BC HB CC DC","16":"GB 8B 9B AC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"1":"FC GC HC IC JC VB L","16":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Event.stopImmediatePropagation()"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/stream.js b/website/www/node_modules/caniuse-lite/data/features/stream.js new file mode 100644 index 000000000000..d6c1e9f205da --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/stream.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H nB fB","129":"m n o p q r","420":"J K V W X Y Z a b c d e f g h i j k l"},D:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W","420":"0 1 2 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 q r s t u v Q x y z AB CB DB BB w R M","2":"D B P H J jB kB lB mB L EB oB","420":"C K V W X Y Z a b c d e f g h i j k l m n o p S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB","513":"zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","420":"A"},K:{"1":"Q","2":"A B L EB","420":"C S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"GC HC IC JC VB L","420":"G FC"},Q:{"420":"KC"},R:{"420":"LC"},S:{"2":"MC"}},B:4,C:"getUserMedia/Stream API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/streams.js b/website/www/node_modules/caniuse-lite/data/features/streams.js new file mode 100644 index 000000000000..275afa2e6745 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/streams.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","130":"B"},B:{"16":"C O","260":"T P","1028":"UB IB N","5124":"H J K"},C:{"2":"0 1 2 3 4 5 6 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","6148":"9 w R M JB KB LB MB NB OB PB QB RB SB","6722":"7 8 TB AB FB CB DB BB"},D:{"2":"0 1 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","260":"2 3 4 5 6 7 8","1028":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D xB WB aB bB cB dB","3076":"A B C O VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o jB kB lB mB L EB oB S","260":"p q r s t u v","1028":"0 1 2 3 4 5 6 7 8 9 Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB","16":"XB","1028":"yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","260":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","1028":"Q"},L:{"1028":"N"},M:{"2626":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC","1028":"HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"Streams"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/stricttransportsecurity.js b/website/www/node_modules/caniuse-lite/data/features/stricttransportsecurity.js new file mode 100644 index 000000000000..897697f2961c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/stricttransportsecurity.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A gB","129":"B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Strict Transport Security"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/style-scoped.js b/website/www/node_modules/caniuse-lite/data/features/style-scoped.js new file mode 100644 index 000000000000..2a17813978eb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/style-scoped.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","2":"9 qB GB G U I F E D A B C O T P H J K V W FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","322":"5 6 7 8 TB AB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","194":"W X Y Z a b c d e f g h i j k l m"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"322":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:7,C:"Scoped CSS"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/subresource-integrity.js b/website/www/node_modules/caniuse-lite/data/features/subresource-integrity.js new file mode 100644 index 000000000000..5d5b8dda71d7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/subresource-integrity.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB","194":"zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"Subresource Integrity"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-css.js b/website/www/node_modules/caniuse-lite/data/features/svg-css.js new file mode 100644 index 000000000000..8404fb07be3d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-css.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"H J K UB IB N","516":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","260":"G U I F E D A B C O T P H J K V W X Y Z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G"},E:{"1":"U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB","132":"G WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"WB pB"},H:{"260":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"Q","260":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"SVG in CSS backgrounds"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-filters.js b/website/www/node_modules/caniuse-lite/data/features/svg-filters.js new file mode 100644 index 000000000000..07297e44f37c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-filters.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G","4":"U I F"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"SVG filters"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-fonts.js b/website/www/node_modules/caniuse-lite/data/features/svg-fonts.js new file mode 100644 index 000000000000..10ca6c9d9e16 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-fonts.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"D A B gB","8":"I F E"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n","2":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","130":"0 o p q r s t u v Q x y z"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","2":"xB"},F:{"1":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S","2":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z AB CB DB BB w R M","130":"b c d e f g h i j k l m"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"258":"7B"},I:{"1":"GB G BC HB CC DC","2":"N 8B 9B AC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"130":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G","130":"FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"130":"LC"},S:{"2":"MC"}},B:2,C:"SVG fonts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-fragment.js b/website/www/node_modules/caniuse-lite/data/features/svg-fragment.js new file mode 100644 index 000000000000..b687af021fd3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-fragment.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","260":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l","132":"m n o p q r s t u v Q x y z"},E:{"1":"C O L S hB iB","2":"G U I F D A B xB WB aB bB dB VB","132":"E cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"P H J K V W X Y","4":"B C kB lB mB L EB oB","16":"D jB","132":"Z a b c d e f g h i j k l m"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB vB wB XB yB zB","132":"E uB"},H:{"1":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F","132":"A"},K:{"1":"Q S","4":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","132":"G"},Q:{"132":"KC"},R:{"132":"LC"},S:{"1":"MC"}},B:4,C:"SVG fragment identifiers"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-html.js b/website/www/node_modules/caniuse-lite/data/features/svg-html.js new file mode 100644 index 000000000000..8d8884cb631f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-html.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","388":"D A B"},B:{"4":"UB IB N","260":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB","4":"GB"},D:{"4":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"xB WB","4":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"4":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"4":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","4":"N CC DC"},J:{"1":"A","2":"F"},K:{"4":"A B C Q L EB S"},L:{"4":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"1":"MC"}},B:2,C:"SVG effects for HTML"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-html5.js b/website/www/node_modules/caniuse-lite/data/features/svg-html5.js new file mode 100644 index 000000000000..b1357965e06f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-html5.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E","129":"D A B"},B:{"1":"J K UB IB N","129":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","8":"G U I"},E:{"1":"D A B C O dB VB L S hB iB","8":"G U xB WB","129":"I F E aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"B mB L EB","8":"D jB kB lB"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","8":"WB pB HB","129":"E rB sB tB uB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"8B 9B AC","129":"GB G BC HB"},J:{"1":"A","129":"F"},K:{"1":"C Q S","8":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"129":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Inline SVG in HTML5"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-img.js b/website/www/node_modules/caniuse-lite/data/features/svg-img.js new file mode 100644 index 000000000000..c2c696333ca0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-img.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d"},E:{"1":"D A B C O dB VB L S hB iB","2":"xB","4":"WB","132":"G U I F E aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"E WB pB HB rB sB tB uB"},H:{"1":"7B"},I:{"1":"N CC DC","2":"8B 9B AC","132":"GB G BC HB"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"SVG in HTML img element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg-smil.js b/website/www/node_modules/caniuse-lite/data/features/svg-smil.js new file mode 100644 index 000000000000..79091f528b02 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg-smil.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E D A B"},B:{"1":"UB IB N","8":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","8":"xB WB","132":"G U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"WB pB HB rB"},H:{"2":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"SVG SMIL animation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/svg.js b/website/www/node_modules/caniuse-lite/data/features/svg.js new file mode 100644 index 000000000000..b1d63e0e6743 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/svg.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E","772":"D A B"},B:{"1":"UB IB N","513":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","4":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","4":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"N CC DC","2":"8B 9B AC","132":"GB G BC HB"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"257":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"SVG (basic support)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/sxg.js b/website/www/node_modules/caniuse-lite/data/features/sxg.js new file mode 100644 index 000000000000..88fecef681c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/sxg.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB","132":"LB MB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"9 BB w R M","2":"0 1 2 3 4 5 6 7 8 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"16":"EC"},P:{"2":"G FC GC HC IC JC VB","16":"L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:6,C:"Signed HTTP Exchanges (SXG)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/symbols.js b/website/www/node_modules/caniuse-lite/data/features/symbols.js new file mode 100644 index 000000000000..1069cee2cb74 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/symbols.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n"},E:{"1":"D A B C O xB WB aB bB cB dB VB L S hB iB","2":"G U I F E"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"1":"MC"}},B:6,C:"Symbols"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/tabindex-attr.js b/website/www/node_modules/caniuse-lite/data/features/tabindex-attr.js new file mode 100644 index 000000000000..22c845131510 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/tabindex-attr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"F E D A B","16":"I gB"},B:{"1":"C O T P H J K UB IB N"},C:{"16":"qB GB nB fB","129":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T"},E:{"16":"G U xB WB","257":"I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"769":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"16":"GB G N 8B 9B AC BC HB CC DC"},J:{"16":"F A"},K:{"16":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"16":"A B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"16":"LC"},S:{"129":"MC"}},B:1,C:"tabindex global attribute"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/template-literals.js b/website/www/node_modules/caniuse-lite/data/features/template-literals.js new file mode 100644 index 000000000000..b1a3724bf8a1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/template-literals.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"O T P H J K UB IB N","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},E:{"1":"A B O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB","129":"C"},F:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e jB kB lB mB L EB oB S"},G:{"1":"vB wB XB yB zB 0B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB","129":"1B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ES6 Template Literals (Template Strings)"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/template.js b/website/www/node_modules/caniuse-lite/data/features/template.js new file mode 100644 index 000000000000..3a3b43631abc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/template.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"P H J K UB IB N","2":"C","388":"O T"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b","132":"c d e f g h i j k"},E:{"1":"D A B C O dB VB L S hB iB","2":"G U I F xB WB aB","388":"E cB","514":"bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","132":"P H J K V W X"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB","388":"E uB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"HTML templates"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/testfeat.js b/website/www/node_modules/caniuse-lite/data/features/testfeat.js new file mode 100644 index 000000000000..b24d05d7f59b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/testfeat.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E A B gB","16":"D"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","16":"G U"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"B C"},E:{"2":"G I xB WB aB","16":"U F E D A B C O bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB EB oB S","16":"L"},G:{"2":"WB pB HB rB sB","16":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B BC HB CC DC","16":"AC"},J:{"2":"A","16":"F"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Test feature - updated"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-decoration.js b/website/www/node_modules/caniuse-lite/data/features/text-decoration.js new file mode 100644 index 000000000000..bdebf0c6e1d2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-decoration.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","2052":"UB IB N"},C:{"2":"qB GB G U nB fB","1028":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","1060":"I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b","226":"0 1 2 3 4 5 6 c d e f g h i j k l m n o p q r s t u v Q x y z","2052":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F xB WB aB bB","772":"O S hB iB","804":"E D A B C dB VB L","1316":"cB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k jB kB lB mB L EB oB S","226":"l m n o p q r s t","2052":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M"},G:{"2":"WB pB HB rB sB tB","292":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","2052":"Q"},L:{"2052":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2052":"EC"},P:{"2":"G FC GC","2052":"HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1028":"MC"}},B:4,C:"text-decoration styling"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-emphasis.js b/website/www/node_modules/caniuse-lite/data/features/text-emphasis.js new file mode 100644 index 000000000000..f45e66dee356 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-emphasis.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","164":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u nB fB","322":"v"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a","164":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB","164":"F bB"},F:{"2":"D B C jB kB lB mB L EB oB S","164":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB","164":"N CC DC"},J:{"2":"F","164":"A"},K:{"2":"A B C L EB S","164":"Q"},L:{"164":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"164":"EC"},P:{"164":"G FC GC HC IC JC VB L"},Q:{"164":"KC"},R:{"164":"LC"},S:{"1":"MC"}},B:4,C:"text-emphasis styling"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-overflow.js b/website/www/node_modules/caniuse-lite/data/features/text-overflow.js new file mode 100644 index 000000000000..5b1bb002f4c8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-overflow.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B","2":"gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","8":"qB GB G U I nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","33":"D jB kB lB mB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"Q S","33":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"CSS3 Text-overflow"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-size-adjust.js b/website/www/node_modules/caniuse-lite/data/features/text-size-adjust.js new file mode 100644 index 000000000000..34ccc7d90674 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-size-adjust.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","33":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b d e f g h i j k l m n o p q r s t u v Q x y z","258":"c"},E:{"2":"G U I F E D A B C O xB WB bB cB dB VB L S hB iB","258":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s u jB kB lB mB L EB oB S"},G:{"2":"WB pB HB","33":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"33":"M"},N:{"161":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"CSS text-size-adjust"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-stroke.js b/website/www/node_modules/caniuse-lite/data/features/text-stroke.js new file mode 100644 index 000000000000..1517e3f16fa8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-stroke.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T","33":"UB IB N","161":"P H J K"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x nB fB","161":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","450":"y"},D:{"33":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"33":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C jB kB lB mB L EB oB S","33":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"33":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","36":"WB"},H:{"2":"7B"},I:{"2":"GB","33":"G N 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"2":"A B C L EB S","33":"Q"},L:{"33":"N"},M:{"161":"M"},N:{"2":"A B"},O:{"33":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"33":"LC"},S:{"161":"MC"}},B:7,C:"CSS text-stroke and text-fill"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/text-underline-offset.js b/website/www/node_modules/caniuse-lite/data/features/text-underline-offset.js new file mode 100644 index 000000000000..8e8267f6a019 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/text-underline-offset.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"1":"KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M nB fB","130":"JB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"text-underline-offset"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/textcontent.js b/website/www/node_modules/caniuse-lite/data/features/textcontent.js new file mode 100644 index 000000000000..4d7bcb980366 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/textcontent.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","16":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Node.textContent"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/textencoder.js b/website/www/node_modules/caniuse-lite/data/features/textencoder.js new file mode 100644 index 000000000000..20da52b661e7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/textencoder.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K nB fB","132":"V"},D:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"TextEncoder & TextDecoder"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/tls1-1.js b/website/www/node_modules/caniuse-lite/data/features/tls1-1.js new file mode 100644 index 000000000000..9dbc1aa2c6c6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/tls1-1.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F gB","66":"E D A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB","2":"qB GB G U I F E D A B C O T P H J K V W X Y nB fB","16":"RB SB","66":"Z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB","2":"G U I F E D A B C O T P H J K V W X ZB YB"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B C jB kB lB mB L EB oB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","66":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"TLS 1.1"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/tls1-2.js b/website/www/node_modules/caniuse-lite/data/features/tls1-2.js new file mode 100644 index 000000000000..e716de6c7352 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/tls1-2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F gB","66":"E D A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z nB fB","66":"a b c"},D:{"1":"0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D P jB","66":"B C kB lB mB L EB oB S"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"1":"A","2":"F"},K:{"1":"Q S","2":"A B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","66":"A"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"TLS 1.2"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/tls1-3.js b/website/www/node_modules/caniuse-lite/data/features/tls1-3.js new file mode 100644 index 000000000000..176f2b10d5fe --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/tls1-3.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","132":"AB FB CB","450":"1 2 3 4 5 6 7 8 TB"},D:{"1":"KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","706":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB"},E:{"2":"G U I F E D A B C xB WB aB bB cB dB VB L","1028":"O S hB iB"},F:{"1":"7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S","706":"4 5 6"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"VB L","2":"G FC GC HC IC JC"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:6,C:"TLS 1.3"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/token-binding.js b/website/www/node_modules/caniuse-lite/data/features/token-binding.js new file mode 100644 index 000000000000..1b345af302ea --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/token-binding.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T","194":"UB IB N","257":"P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB nB fB","16":"RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o","16":"0 1 2 3 4 5 6 7 p q r s t u v Q x y z","194":"8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E xB WB aB bB cB","16":"D A B C O dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S","16":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB","16":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"16":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","16":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","16":"Q"},L:{"16":"N"},M:{"16":"M"},N:{"2":"A","16":"B"},O:{"16":"EC"},P:{"16":"G FC GC HC IC JC VB L"},Q:{"16":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:6,C:"Token Binding"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/touch.js b/website/www/node_modules/caniuse-lite/data/features/touch.js new file mode 100644 index 000000000000..c676f753300d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/touch.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","8":"A B"},B:{"1":"UB IB N","578":"C O T P H J K"},C:{"1":"2 3 4 5 6 7 8 9 K V W X Y Z a TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","4":"G U I F E D A B C O T P H J","194":"0 1 b c d e f g h i j k l m n o p q r s t u v Q x y z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A","260":"B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"2":"MC"}},B:2,C:"Touch events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/transforms2d.js b/website/www/node_modules/caniuse-lite/data/features/transforms2d.js new file mode 100644 index 000000000000..180732327079 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/transforms2d.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E","129":"A B","161":"D"},B:{"1":"J K UB IB N","129":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","33":"G U I F E D A B C O T P nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"1":"D A B C O dB VB L S hB iB","33":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D jB kB","33":"B C P H J K V W X Y lB mB L EB oB"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","33":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","33":"GB G 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS3 2D Transforms"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/transforms3d.js b/website/www/node_modules/caniuse-lite/data/features/transforms3d.js new file mode 100644 index 000000000000..f67c81149bcb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/transforms3d.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D nB fB","33":"A B C O T P"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B","33":"C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"2":"xB WB","33":"G U I F E aB bB cB","257":"D A B C O dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y"},G:{"33":"E WB pB HB rB sB tB uB","257":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"8B 9B AC","33":"GB G BC HB CC DC"},J:{"33":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS3 3D Transforms"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/trusted-types.js b/website/www/node_modules/caniuse-lite/data/features/trusted-types.js new file mode 100644 index 000000000000..d83aa427dbfd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/trusted-types.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Trusted Types for DOM manipulation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/ttf.js b/website/www/node_modules/caniuse-lite/data/features/ttf.js new file mode 100644 index 000000000000..1198549722ee --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/ttf.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M kB lB mB L EB oB S","2":"D jB"},G:{"1":"E HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB"},H:{"2":"7B"},I:{"1":"GB G N 9B AC BC HB CC DC","2":"8B"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"TTF/OTF - TrueType and OpenType font support"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/typedarrays.js b/website/www/node_modules/caniuse-lite/data/features/typedarrays.js new file mode 100644 index 000000000000..8dd6e3166792 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/typedarrays.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"B","2":"I F E D gB","132":"A"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB","260":"aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB","260":"HB"},H:{"1":"7B"},I:{"1":"G N BC HB CC DC","2":"GB 8B 9B AC"},J:{"1":"A","2":"F"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Typed Arrays"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/u2f.js b/website/www/node_modules/caniuse-lite/data/features/u2f.js new file mode 100644 index 000000000000..078a4458ea74 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/u2f.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","513":"UB IB N"},C:{"1":"R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB","322":"0 1 2 3 4 5 6 7 8 9 x y z TB AB FB CB DB BB w"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n","130":"o p q","513":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"O hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L S"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p r jB kB lB mB L EB oB S","513":"0 1 2 3 4 5 6 7 8 9 q s t u v Q x y z AB CB DB BB w R M"},G:{"1":"5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"322":"MC"}},B:6,C:"FIDO U2F API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/unhandledrejection.js b/website/www/node_modules/caniuse-lite/data/features/unhandledrejection.js new file mode 100644 index 000000000000..48ec2dfdf2de --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/unhandledrejection.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S"},G:{"1":"0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB","16":"zB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:1,C:"unhandledrejection/rejectionhandled events"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js b/website/www/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js new file mode 100644 index 000000000000..563070b50ceb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Upgrade Insecure Requests"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js b/website/www/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js new file mode 100644 index 000000000000..dcdda7d6800d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB","66":"OB PB QB RB SB UB IB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"M","2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"URL Scroll-To-Text Fragment"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/url.js b/website/www/node_modules/caniuse-lite/data/features/url.js new file mode 100644 index 000000000000..732a7c45b06a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/url.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y","130":"Z a b c d e f g h"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G U I xB WB aB bB","130":"F"},F:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","130":"P H J K"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB","130":"tB"},H:{"2":"7B"},I:{"1":"N DC","2":"GB G 8B 9B AC BC HB","130":"CC"},J:{"2":"F","130":"A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"URL API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/urlsearchparams.js b/website/www/node_modules/caniuse-lite/data/features/urlsearchparams.js new file mode 100644 index 000000000000..0c579d420977 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/urlsearchparams.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","132":"f g h i j k l m n o p q r s t"},D:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y"},E:{"1":"B C O VB L S hB iB","2":"G U I F E D A xB WB aB bB cB dB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S"},G:{"1":"yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","2":"G"},Q:{"2":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"URLSearchParams"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/use-strict.js b/website/www/node_modules/caniuse-lite/data/features/use-strict.js new file mode 100644 index 000000000000..d3c9e6839d6b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/use-strict.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G xB WB","132":"U aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","2":"D B jB kB lB mB L EB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"1":"7B"},I:{"1":"GB G N BC HB CC DC","2":"8B 9B AC"},J:{"1":"F A"},K:{"1":"C Q EB S","2":"A B L"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"ECMAScript 5 Strict Mode"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/user-select-none.js b/website/www/node_modules/caniuse-lite/data/features/user-select-none.js new file mode 100644 index 000000000000..c800d27c3d54 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/user-select-none.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","33":"A B"},B:{"1":"UB IB N","33":"C O T P H J K"},C:{"1":"JB KB LB MB NB OB PB QB RB SB","33":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M nB fB"},D:{"1":"4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","33":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z"},E:{"33":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","33":"P H J K V W X Y Z a b c d e f g h i j k l m n o p q"},G:{"33":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","33":"GB G 8B 9B AC BC HB CC DC"},J:{"33":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"33":"M"},N:{"33":"A B"},O:{"2":"EC"},P:{"33":"G FC GC HC IC JC VB L"},Q:{"33":"KC"},R:{"2":"LC"},S:{"33":"MC"}},B:5,C:"CSS user-select: none"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/user-timing.js b/website/www/node_modules/caniuse-lite/data/features/user-timing.js new file mode 100644 index 000000000000..637d86847c4f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/user-timing.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"User Timing API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/variable-fonts.js b/website/www/node_modules/caniuse-lite/data/features/variable-fonts.js new file mode 100644 index 000000000000..f2d5a9422f4e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/variable-fonts.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"J K UB IB N","2":"C O T P H"},C:{"2":"0 1 2 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","4609":"9 CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","4674":"FB","5698":"AB","7490":"3 4 5 6 7","7746":"8 TB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","4097":"w","4290":"TB AB FB","6148":"9 CB DB BB"},E:{"2":"G U I F E D A xB WB aB bB cB dB VB","4097":"O hB iB","4609":"B C L S"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y jB kB lB mB L EB oB S","4097":"3","6148":"0 1 2 z"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB","4097":"zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"4097":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC","4097":"IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"Variable fonts"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/vibration.js b/website/www/node_modules/caniuse-lite/data/features/vibration.js new file mode 100644 index 000000000000..19d0305465ee --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/vibration.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A nB fB","33":"B C O T P"},D:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"Vibration API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/video.js b/website/www/node_modules/caniuse-lite/data/features/video.js new file mode 100644 index 000000000000..6972a5e45f50 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/video.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","260":"G U I F E D A B C O T P H J K V nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A aB bB cB dB VB","2":"xB WB","513":"B C O L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB","513":"zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","132":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Video element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/videotracks.js b/website/www/node_modules/caniuse-lite/data/features/videotracks.js new file mode 100644 index 000000000000..fcdc0d2faae3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/videotracks.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K","322":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","194":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u","322":"0 1 2 3 4 5 6 7 8 9 v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U I xB WB aB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h jB kB lB mB L EB oB S","322":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","322":"Q"},L:{"322":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"194":"MC"}},B:1,C:"Video Tracks"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/viewport-units.js b/website/www/node_modules/caniuse-lite/data/features/viewport-units.js new file mode 100644 index 000000000000..0bd7560a56db --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/viewport-units.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","132":"D","260":"A B"},B:{"1":"H J K UB IB N","260":"C O T P"},C:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V","260":"W X Y Z a b"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB","260":"I"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB","516":"tB","772":"sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"260":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"Viewport units: vw, vh, vmin, vmax"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/wai-aria.js b/website/www/node_modules/caniuse-lite/data/features/wai-aria.js new file mode 100644 index 000000000000..da9c860b1991 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/wai-aria.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","4":"E D A B"},B:{"4":"C O T P H J K UB IB N"},C:{"4":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"4":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"xB WB","4":"G U I F E D A B C O aB bB cB dB VB L S hB iB"},F:{"2":"D","4":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"4":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"4":"7B"},I:{"2":"GB G 8B 9B AC BC HB","4":"N CC DC"},J:{"2":"F A"},K:{"4":"A B C Q L EB S"},L:{"4":"N"},M:{"4":"M"},N:{"4":"A B"},O:{"2":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"4":"MC"}},B:2,C:"WAI-ARIA Accessibility features"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/wasm.js b/website/www/node_modules/caniuse-lite/data/features/wasm.js new file mode 100644 index 000000000000..e6727829e579 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/wasm.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"H J K UB IB N","2":"C O T","578":"P"},C:{"1":"3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q nB fB","194":"0 1 x y z","1025":"2"},D:{"1":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","322":"1 2 3 4 5 6"},E:{"1":"B C O L S hB iB","2":"G U I F E D A xB WB aB bB cB dB VB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n jB kB lB mB L EB oB S","322":"o p q r s t"},G:{"1":"zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"322":"KC"},R:{"2":"LC"},S:{"194":"MC"}},B:6,C:"WebAssembly"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/wav.js b/website/www/node_modules/caniuse-lite/data/features/wav.js new file mode 100644 index 000000000000..4668339a91df --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/wav.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M lB mB L EB oB S","2":"D jB kB"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","16":"A"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"Wav audio format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/wbr-element.js b/website/www/node_modules/caniuse-lite/data/features/wbr-element.js new file mode 100644 index 000000000000..27961fd2c257 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/wbr-element.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F gB","2":"E D A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O WB aB bB cB dB VB L S hB iB","16":"xB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","16":"D"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB"},H:{"1":"7B"},I:{"1":"GB G N AC BC HB CC DC","16":"8B 9B"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"wbr (word break opportunity) element"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/web-animation.js b/website/www/node_modules/caniuse-lite/data/features/web-animation.js new file mode 100644 index 000000000000..6905c025637b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/web-animation.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","260":"UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i nB fB","260":"9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","516":"0 1 2 3 4 5 6 7 8 x y z","580":"j k l m n o p q r s t u v Q"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l","132":"m n o","260":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A xB WB aB bB cB dB VB","1090":"B C O L S","2049":"hB iB"},F:{"2":"D B C P H J K V W X Y jB kB lB mB L EB oB S","132":"Z a b","260":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB","1090":"zB 0B 1B 2B 3B 4B 5B","2049":"6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","260":"N"},J:{"2":"F A"},K:{"2":"A B C L EB S","260":"Q"},L:{"260":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"260":"EC"},P:{"260":"G FC GC HC IC JC VB L"},Q:{"260":"KC"},R:{"260":"LC"},S:{"516":"MC"}},B:5,C:"Web Animations API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/web-app-manifest.js b/website/www/node_modules/caniuse-lite/data/features/web-app-manifest.js new file mode 100644 index 000000000000..95cc92ed5693 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/web-app-manifest.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H","514":"J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o","132":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w","260":"R M JB KB LB MB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB","132":"0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","132":"Q"},L:{"1":"N"},M:{"132":"M"},N:{"2":"A B"},O:{"132":"EC"},P:{"132":"G FC GC HC IC JC VB L"},Q:{"132":"KC"},R:{"132":"LC"},S:{"2":"MC"}},B:5,C:"Web App Manifest"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/web-bluetooth.js b/website/www/node_modules/caniuse-lite/data/features/web-bluetooth.js new file mode 100644 index 000000000000..d526c397f509 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/web-bluetooth.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","1025":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u","194":"0 1 2 v Q x y z","706":"3 4 5","1025":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"D B C P H J K V W X Y Z a b c d e f g h i j k l jB kB lB mB L EB oB S","450":"m n o p","706":"q r s","1025":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC DC","1025":"N"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1025":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1":"GC HC IC JC VB L","2":"G FC"},Q:{"706":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"Web Bluetooth"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/web-share.js b/website/www/node_modules/caniuse-lite/data/features/web-share.js new file mode 100644 index 000000000000..29302cde2f72 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/web-share.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","258":"K V W X Y Z a"},E:{"1":"O S hB iB","2":"G U I F E D A B C xB WB aB cB dB VB L","16":"bB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B"},H:{"2":"7B"},I:{"2":"GB G 8B 9B AC BC HB CC","514":"N DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"514":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G","514":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"16":"LC"},S:{"2":"MC"}},B:7,C:"Web Share API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webauthn.js b/website/www/node_modules/caniuse-lite/data/features/webauthn.js new file mode 100644 index 000000000000..71c1fd73add8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webauthn.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"K UB IB N","2":"C","226":"O T P H J"},C:{"1":"9 AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB nB fB"},D:{"1":"R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w"},E:{"1":"O hB iB","2":"G U I F E D A B C xB WB aB bB cB dB VB L","322":"S"},F:{"1":"4 5 6 7 8 9 AB CB DB BB w R M","2":"0 1 2 3 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z jB kB lB mB L EB oB S"},G:{"1":"5B 6B","2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B","578":"4B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:2,C:"Web Authentication API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webgl.js b/website/www/node_modules/caniuse-lite/data/features/webgl.js new file mode 100644 index 000000000000..f845f4e6199a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webgl.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"gB","8":"I F E D A","129":"B"},B:{"1":"UB IB N","129":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","129":"G U I F E D A B C O T P H J K V W X Y Z"},D:{"1":"0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F","129":"E D A B C O T P H J K V W X Y Z a b c d e f g h i"},E:{"1":"E D A B C O dB VB L S hB iB","2":"G U xB WB","129":"I F aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B jB kB lB mB L EB oB","129":"C P H J K S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB tB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"1":"A","2":"F"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A","129":"B"},O:{"129":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"129":"MC"}},B:6,C:"WebGL - 3D Canvas graphics"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webgl2.js b/website/www/node_modules/caniuse-lite/data/features/webgl2.js new file mode 100644 index 000000000000..2dcbb044cdd9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webgl2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"1 2 3 4 5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a nB fB","194":"s t u","450":"b c d e f g h i j k l m n o p q r","2242":"0 v Q x y z"},D:{"1":"6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s","578":"0 1 2 3 4 5 t u v Q x y z"},E:{"2":"G U I F E D A xB WB aB bB cB dB","1090":"B C O VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B","1090":"1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"HC IC JC VB L","2":"G FC GC"},Q:{"578":"KC"},R:{"2":"LC"},S:{"2242":"MC"}},B:6,C:"WebGL 2.0"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webgpu.js b/website/www/node_modules/caniuse-lite/data/features/webgpu.js new file mode 100644 index 000000000000..498d481ac46d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webgpu.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K UB","578":"IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB nB fB","194":"9 DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB","578":"IB N eB ZB YB"},E:{"2":"G U I F E D A B xB WB aB bB cB dB VB","322":"C O L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"194":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"WebGPU"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webhid.js b/website/www/node_modules/caniuse-lite/data/features/webhid.js new file mode 100644 index 000000000000..6116c0b9b75f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webhid.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","194":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB","194":"SB UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"WebHID API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webm.js b/website/www/node_modules/caniuse-lite/data/features/webm.js new file mode 100644 index 000000000000..023e2d0ff4ce --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webm.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E gB","8":"D A B"},B:{"1":"UB IB N","4":"T P H J K","8":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","4":"G U I F E D A B C O T P H J K V W X Y Z a b c d"},D:{"1":"0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U","4":"I F E D A B C O T P H J K V W X Y Z a"},E:{"2":"xB","8":"G U I F E D A B C WB aB bB cB dB VB L","132":"O S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D jB kB lB","4":"B C P mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B","132":"2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"1":"N","2":"8B 9B","4":"GB G AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C L EB S","4":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"8":"A B"},O:{"1":"EC"},P:{"1":"FC GC HC IC JC VB L","4":"G"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:6,C:"WebM video format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webp.js b/website/www/node_modules/caniuse-lite/data/features/webp.js new file mode 100644 index 000000000000..03f8899577d4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webp.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"K UB IB N","2":"C O T P H J"},C:{"1":"9 w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","8":"0 1 2 3 4 5 6 7 8 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U","8":"I F E","132":"D A B C O T P H J K V W X Y","260":"Z a b c d e f g h"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D jB kB lB","8":"B mB","132":"L EB oB","260":"C P H J K S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"N HB CC DC","2":"GB 8B 9B AC","132":"G BC"},J:{"2":"F A"},K:{"1":"C Q L EB S","2":"A","132":"B"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"8":"MC"}},B:7,C:"WebP image format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/websockets.js b/website/www/node_modules/caniuse-lite/data/features/websockets.js new file mode 100644 index 000000000000..3697e941e86c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/websockets.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB nB fB","132":"G U","292":"I F E D A"},D:{"1":"0 1 2 3 4 5 6 7 8 9 H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T","260":"P"},E:{"1":"F E D A B C O cB dB VB L S hB iB","2":"G xB WB","132":"U aB","260":"I bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D jB kB lB mB","132":"B C L EB oB"},G:{"1":"E sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB","132":"HB rB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","129":"F"},K:{"1":"Q S","2":"A","132":"B C L EB"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Web Sockets"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webusb.js b/website/www/node_modules/caniuse-lite/data/features/webusb.js new file mode 100644 index 000000000000..489f576e5b46 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webusb.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"9 FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"0 1 2 3 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z","66":"4 5 6 7 8 TB AB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q jB kB lB mB L EB oB S","66":"r s t u v Q x"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"1":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:7,C:"WebUSB"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webvr.js b/website/www/node_modules/caniuse-lite/data/features/webvr.js new file mode 100644 index 000000000000..3de33a542ffb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webvr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T","322":"UB IB N","513":"P H J K"},C:{"2":"0 1 2 3 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z nB fB","129":"5 6 7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","194":"4"},D:{"2":"0 1 2 3 4 5 6 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z IB N eB ZB YB","322":"7 8 9 TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"2049":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"1025":"G","1028":"FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"322":"LC"},S:{"2":"MC"}},B:7,C:"WebVR API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webvtt.js b/website/www/node_modules/caniuse-lite/data/features/webvtt.js new file mode 100644 index 000000000000..3f9d239c8a3d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webvtt.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"2":"qB GB G U I F E D A B C O T P H J K V W X Y Z nB fB","66":"a b c d e f g","129":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J"},E:{"1":"I F E D A B C O bB cB dB VB L S hB iB","2":"G U xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB rB sB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB G 8B 9B AC BC HB"},J:{"1":"A","2":"F"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"B","2":"A"},O:{"2":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"129":"MC"}},B:5,C:"WebVTT - Web Video Text Tracks"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webworkers.js b/website/www/node_modules/caniuse-lite/data/features/webworkers.js new file mode 100644 index 000000000000..6096c735d2fa --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webworkers.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","2":"gB","8":"I F E D"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","8":"qB GB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","8":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M mB L EB oB S","2":"D jB","8":"kB lB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"N 8B CC DC","2":"GB G 9B AC BC HB"},J:{"1":"F A"},K:{"1":"B C Q L EB S","8":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Web Workers"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/webxr.js b/website/www/node_modules/caniuse-lite/data/features/webxr.js new file mode 100644 index 000000000000..9fdb44704fed --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/webxr.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"2":"C O T P H J K","132":"UB IB N"},C:{"2":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB","66":"w R M JB KB LB MB NB OB PB QB RB SB","132":"UB IB N eB ZB YB"},E:{"2":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"2":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"2":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"2":"7B"},I:{"2":"GB G N 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"2":"A B C Q L EB S"},L:{"132":"N"},M:{"2":"M"},N:{"2":"A B"},O:{"2":"EC"},P:{"2":"G FC GC HC IC JC VB L"},Q:{"2":"KC"},R:{"2":"LC"},S:{"2":"MC"}},B:5,C:"WebXR Device API"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/will-change.js b/website/www/node_modules/caniuse-lite/data/features/will-change.js new file mode 100644 index 000000000000..adb3a15b87e6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/will-change.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"UB IB N","2":"C O T P H J K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e nB fB","194":"f g h i j k l"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"1":"A B C O dB VB L S hB iB","2":"G U I F E D xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y Z jB kB lB mB L EB oB S"},G:{"1":"wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS will-change property"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/woff.js b/website/www/node_modules/caniuse-lite/data/features/woff.js new file mode 100644 index 000000000000..035980b7c494 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/woff.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB fB","2":"qB GB nB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G"},E:{"1":"I F E D A B C O aB bB cB dB VB L S hB iB","2":"G U xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M L EB oB S","2":"D B jB kB lB mB"},G:{"1":"E rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB"},H:{"2":"7B"},I:{"1":"N CC DC","2":"GB 8B 9B AC BC HB","130":"G"},J:{"1":"F A"},K:{"1":"B C Q L EB S","2":"A"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:2,C:"WOFF - Web Open Font Format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/woff2.js b/website/www/node_modules/caniuse-lite/data/features/woff2.js new file mode 100644 index 000000000000..01e1297908b6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/woff2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D A B gB"},B:{"1":"T P H J K UB IB N","2":"C O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","2":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l"},E:{"1":"C O S hB iB","2":"G U I F E D xB WB aB bB cB dB","132":"A B VB L"},F:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C P H J K V W X Y jB kB lB mB L EB oB S"},G:{"1":"XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"E WB pB HB rB sB tB uB vB wB"},H:{"2":"7B"},I:{"1":"N","2":"GB G 8B 9B AC BC HB CC DC"},J:{"2":"F A"},K:{"1":"Q","2":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"2":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"WOFF 2.0 - Web Open Font Format"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/word-break.js b/website/www/node_modules/caniuse-lite/data/features/word-break.js new file mode 100644 index 000000000000..da5490680439 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/word-break.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"I F E D A B gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB G U I F E D A B C O T nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t"},E:{"1":"D A B C O dB VB L S hB iB","4":"G U I F E xB WB aB bB cB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","2":"D B C jB kB lB mB L EB oB S","4":"P H J K V W X Y Z a b c d e f g"},G:{"1":"vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","4":"E WB pB HB rB sB tB uB"},H:{"2":"7B"},I:{"1":"N","4":"GB G 8B 9B AC BC HB CC DC"},J:{"4":"F A"},K:{"2":"A B C L EB S","4":"Q"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"4":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:5,C:"CSS3 word-break"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/wordwrap.js b/website/www/node_modules/caniuse-lite/data/features/wordwrap.js new file mode 100644 index 000000000000..1e0786f840b8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/wordwrap.js @@ -0,0 +1 @@ +module.exports={A:{A:{"4":"I F E D A B gB"},B:{"1":"K UB IB N","4":"C O T P H J"},C:{"1":"0 1 2 3 4 5 6 7 8 9 z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","4":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","4":"G U I F E D A B C O T P H J K V W X Y"},E:{"1":"F E D A B C O bB cB dB VB L S hB iB","4":"G U I xB WB aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D jB kB","4":"B C lB mB L EB oB"},G:{"1":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","4":"WB pB HB rB sB"},H:{"4":"7B"},I:{"1":"N CC DC","4":"GB G 8B 9B AC BC HB"},J:{"1":"A","4":"F"},K:{"1":"Q","4":"A B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"4":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"4":"MC"}},B:5,C:"CSS3 Overflow-wrap"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/x-doc-messaging.js b/website/www/node_modules/caniuse-lite/data/features/x-doc-messaging.js new file mode 100644 index 000000000000..a29ca21cccb9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/x-doc-messaging.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F gB","132":"E D","260":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB","2":"qB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O aB bB cB dB VB L S hB iB","2":"xB WB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S","2":"D"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"4":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"Cross-document messaging"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/x-frame-options.js b/website/www/node_modules/caniuse-lite/data/features/x-frame-options.js new file mode 100644 index 000000000000..2de01f81fe5c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/x-frame-options.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"E D A B","2":"I F gB"},B:{"1":"C O T P H J K","4":"UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB","4":"G U I F E D A B C O T P H J KB LB MB NB OB PB QB RB SB","16":"qB GB nB fB"},D:{"4":"0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I F E D A B C O T P H J K V W X Y Z a b"},E:{"4":"I F E D A B C O aB bB cB dB VB L S hB iB","16":"G U xB WB"},F:{"4":"0 1 2 3 4 5 6 7 8 9 C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M oB S","16":"D B jB kB lB mB L EB"},G:{"4":"E tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","16":"WB pB HB rB sB"},H:{"2":"7B"},I:{"4":"G N BC HB CC DC","16":"GB 8B 9B AC"},J:{"4":"F A"},K:{"4":"Q S","16":"A B C L EB"},L:{"4":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"4":"EC"},P:{"4":"G FC GC HC IC JC VB L"},Q:{"4":"KC"},R:{"4":"LC"},S:{"1":"MC"}},B:6,C:"X-Frame-Options HTTP header"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/xhr2.js b/website/www/node_modules/caniuse-lite/data/features/xhr2.js new file mode 100644 index 000000000000..db10b91dfb5a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/xhr2.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"I F E D gB","132":"A B"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","2":"qB GB","260":"A B","388":"I F E D","900":"G U nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","16":"G U I","132":"f g","388":"F E D A B C O T P H J K V W X Y Z a b c d e"},E:{"1":"E D A B C O cB dB VB L S hB iB","2":"G xB WB","132":"F bB","388":"U I aB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 C K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M S","2":"D B jB kB lB mB L EB oB","132":"P H J"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","2":"WB pB HB","132":"tB","388":"rB sB"},H:{"2":"7B"},I:{"1":"N DC","2":"8B 9B AC","388":"CC","900":"GB G BC HB"},J:{"132":"A","388":"F"},K:{"1":"C Q S","2":"A B L EB"},L:{"1":"N"},M:{"1":"M"},N:{"132":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:1,C:"XMLHttpRequest advanced features"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/xhtml.js b/website/www/node_modules/caniuse-lite/data/features/xhtml.js new file mode 100644 index 000000000000..c5066b9e9347 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/xhtml.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"D A B","2":"I F E gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"1":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"1":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"1":"7B"},I:{"1":"GB G N 8B 9B AC BC HB CC DC"},J:{"1":"F A"},K:{"1":"A B C Q L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"2":"LC"},S:{"1":"MC"}},B:1,C:"XHTML served as application/xhtml+xml"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/xhtmlsmil.js b/website/www/node_modules/caniuse-lite/data/features/xhtmlsmil.js new file mode 100644 index 000000000000..906067b8a711 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/xhtmlsmil.js @@ -0,0 +1 @@ +module.exports={A:{A:{"2":"D A B gB","4":"I F E"},B:{"2":"C O T P H J K","8":"UB IB N"},C:{"8":"0 1 2 3 4 5 6 7 8 9 qB GB G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB nB fB"},D:{"8":"0 1 2 3 4 5 6 7 8 9 G U I F E D A B C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB"},E:{"8":"G U I F E D A B C O xB WB aB bB cB dB VB L S hB iB"},F:{"8":"0 1 2 3 4 5 6 7 8 9 D B C P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M jB kB lB mB L EB oB S"},G:{"8":"E WB pB HB rB sB tB uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B"},H:{"8":"7B"},I:{"8":"GB G N 8B 9B AC BC HB CC DC"},J:{"8":"F A"},K:{"8":"A B C Q L EB S"},L:{"8":"N"},M:{"8":"M"},N:{"2":"A B"},O:{"8":"EC"},P:{"8":"G FC GC HC IC JC VB L"},Q:{"8":"KC"},R:{"8":"LC"},S:{"8":"MC"}},B:7,C:"XHTML+SMIL animation"}; diff --git a/website/www/node_modules/caniuse-lite/data/features/xml-serializer.js b/website/www/node_modules/caniuse-lite/data/features/xml-serializer.js new file mode 100644 index 000000000000..483f44d68846 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/features/xml-serializer.js @@ -0,0 +1 @@ +module.exports={A:{A:{"1":"A B","260":"I F E D gB"},B:{"1":"C O T P H J K UB IB N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 C O T P H J K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB","132":"B","260":"qB GB G U I F nB fB","516":"E D A"},D:{"1":"0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v Q x y z TB AB FB CB DB BB w R M JB KB LB MB NB OB PB QB RB SB UB IB N eB ZB YB","132":"G U I F E D A B C O T P H J K V W X Y Z a b c d e f g"},E:{"1":"E D A B C O cB dB VB L S hB iB","132":"G U I F xB WB aB bB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 K V W X Y Z a b c d e f g h i j k l m n o p q r s t u v Q x y z AB CB DB BB w R M","16":"D jB","132":"B C P H J kB lB mB L EB oB S"},G:{"1":"E uB vB wB XB yB zB 0B 1B 2B 3B 4B 5B 6B","132":"WB pB HB rB sB tB"},H:{"132":"7B"},I:{"1":"N CC DC","132":"GB G 8B 9B AC BC HB"},J:{"132":"F A"},K:{"1":"Q","16":"A","132":"B C L EB S"},L:{"1":"N"},M:{"1":"M"},N:{"1":"A B"},O:{"1":"EC"},P:{"1":"G FC GC HC IC JC VB L"},Q:{"1":"KC"},R:{"1":"LC"},S:{"1":"MC"}},B:4,C:"DOM Parsing and Serialization"}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AD.js b/website/www/node_modules/caniuse-lite/data/regions/AD.js new file mode 100644 index 000000000000..c61038002aa8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AD.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00557,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00557,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00557,"44":0,"45":0,"46":0,"47":0,"48":0.00557,"49":0.2785,"50":0,"51":0.00557,"52":0.00557,"53":0.02228,"54":0,"55":0,"56":0,"57":0,"58":0.04456,"59":0,"60":0.00557,"61":0.01671,"62":0.01114,"63":0.01114,"64":0,"65":0.28964,"66":0.00557,"67":0.02228,"68":0.01114,"69":0.01671,"70":0.00557,"71":0.01114,"72":0.00557,"73":0.3342,"74":0.02785,"75":0.05013,"76":0.01114,"77":0.04456,"78":0.10026,"79":0.1671,"80":10.8615,"81":6.08244,"83":0,"84":0.08912,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00557,"46":0,"47":0.00557,"48":0.01114,"49":0,"50":0,"51":0,"52":0.02228,"53":0,"54":0,"55":0,"56":0.00557,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00557,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.10026,"69":0,"70":0.00557,"71":0.00557,"72":0.01114,"73":0.01114,"74":0.60713,"75":1.20869,"76":0.02785,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.38433,"68":0.00557,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00236,"3.2":0.00236,"4.0-4.1":0,"4.2-4.3":0.00473,"5.0-5.1":0.02364,"6.0-6.1":0.00709,"7.0-7.1":0.02364,"8.1-8.4":0.0331,"9.0-9.2":0.02837,"9.3":0.34045,"10.0-10.2":0.08748,"10.3":0.30025,"11.0-11.2":0.19386,"11.3-11.4":0.32862,"12.0-12.1":0.40664,"12.2-12.4":2.66446,"13.0-13.1":0.56741,"13.2":0.27661,"13.3":15.49025,"13.4":2.87014},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.04456,"10":0.00557,"11":0.00557,"12":0.12254,"13":3.48125,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01114,"10.1":0.09469,"11.1":0.23951,"12.1":0.25065,"13.1":2.50093},I:{"3":0.00065,"4":0.00587,_:"81","2.1":0,"2.2":0.00196,"2.3":0.00065,"4.1":0.01304,"4.2-4.3":0.02738,"4.4":0,"4.4.3-4.4.4":0.18843},B:{"12":0,"13":0.00557,"14":0.03342,"15":0.00557,"16":0.02785,"17":0.03342,"18":1.25882,_:"79 80 81"},P:{"4":0.20054,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.03166,"10.1":0.04222,"11.1":2.15321},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00557,"9":0.01671,"10":0.01114,"11":0.34534,"5.5":0},N:{"10":0,"11":0.02658},J:{"7":0,"10":0.00443},R:{_:"0"},M:{"0":0.1329},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.02516},L:{"0":42.23598}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AE.js b/website/www/node_modules/caniuse-lite/data/regions/AE.js new file mode 100644 index 000000000000..6226b1b6db0a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00421,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00421,"23":0,"24":0,"25":0,"26":0.00421,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00421,"35":0.02949,"36":0.00421,"37":0,"38":0.01264,"39":0,"40":0.00843,"41":0,"42":0,"43":0.00421,"44":0,"45":0,"46":0,"47":0,"48":0.00421,"49":0.0969,"50":0,"51":0,"52":0,"53":0.00421,"54":0,"55":0.00421,"56":0.00421,"57":0.00421,"58":0.00421,"59":0,"60":0.00421,"61":0.00421,"62":0.00421,"63":0.01685,"64":0.00421,"65":0.01685,"66":0.00421,"67":0.01264,"68":0.00421,"69":0.01685,"70":0.02528,"71":0.04634,"72":0.02949,"73":0.03792,"74":0.0337,"75":0.02949,"76":0.02528,"77":0.03792,"78":0.09269,"79":0.25699,"80":7.97521,"81":3.76221,"83":0.02107,"84":0.00843,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00421,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00421,"49":0,"50":0,"51":0,"52":0.00843,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.02528,"59":0,"60":0.00843,"61":0,"62":0,"63":0,"64":0.00421,"65":0.00843,"66":0.00421,"67":0,"68":0.05477,"69":0.00421,"70":0,"71":0.00843,"72":0.01264,"73":0.00843,"74":0.28227,"75":0.39181,"76":0.01685,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00421,"47":0.01264,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00421,"58":0.00421,"60":0,"62":0,"63":0.00421,"64":0,"65":0.00421,"66":0.00421,"67":0.2907,"68":0.00843,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00209,"3.2":0.00209,"4.0-4.1":0,"4.2-4.3":0.00418,"5.0-5.1":0.02092,"6.0-6.1":0.00628,"7.0-7.1":0.02092,"8.1-8.4":0.02929,"9.0-9.2":0.02511,"9.3":0.30128,"10.0-10.2":0.07741,"10.3":0.26571,"11.0-11.2":0.17156,"11.3-11.4":0.29082,"12.0-12.1":0.35986,"12.2-12.4":2.35795,"13.0-13.1":0.50214,"13.2":0.24479,"13.3":13.70832,"13.4":2.53997},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00843,"11":0.02107,"12":0.06741,"13":0.96056,_:"0","3.1":0,"3.2":0,"5.1":0.01264,"6.1":0,"7.1":0,"9.1":0.01685,"10.1":0.0337,"11.1":0.06741,"12.1":0.20222,"13.1":0.74991},I:{"3":0.00054,"4":0.00487,_:"81","2.1":0,"2.2":0.00162,"2.3":0.00054,"4.1":0.01081,"4.2-4.3":0.02271,"4.4":0,"4.4.3-4.4.4":0.15627},B:{"12":0.00421,"13":0.00421,"14":0.00843,"15":0.02107,"16":0.01264,"17":0.05477,"18":0.69093,_:"79 80 81"},P:{"4":0.17378,"5.0-5.4":0.01022,"6.2-6.4":0.01022,"7.2-7.4":0.06134,"8.2":0.03067,"9.2":0.14312,"10.1":0.28623,"11.1":2.69875},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01509,"9":0.00503,"10":0.00503,"11":0.28662,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.01157},R:{_:"0"},M:{"0":0.12153},O:{"0":7.80088},Q:{"1.2":0.02894},S:{"2.5":0},H:{"0":1.15054},L:{"0":43.71727}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AF.js b/website/www/node_modules/caniuse-lite/data/regions/AF.js new file mode 100644 index 000000000000..20f061a0953f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.02767,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00231,"26":0,"27":0,"28":0.00231,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00231,"35":0,"36":0.00231,"37":0.00231,"38":0,"39":0,"40":0.00461,"41":0,"42":0,"43":0.02075,"44":0.00231,"45":0.00231,"46":0.00461,"47":0.00231,"48":0.00461,"49":0.01614,"50":0.00231,"51":0,"52":0.00231,"53":0.00231,"54":0.00231,"55":0.00692,"56":0,"57":0.00231,"58":0.00231,"59":0,"60":0.00231,"61":0.00231,"62":0.00692,"63":0.01845,"64":0.00231,"65":0.00231,"66":0.00692,"67":0.00461,"68":0.00231,"69":0.01384,"70":0.00461,"71":0.01614,"72":0.00692,"73":0.01845,"74":0.00922,"75":0.01153,"76":0.00692,"77":0.02306,"78":0.02075,"79":0.04843,"80":2.05465,"81":1.08613,"83":0.00231,"84":0.00231,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00231,"23":0.00231,"24":0.00231,"25":0.00231,"26":0.00231,"27":0,"28":0,"29":0.00231,"30":0,"31":0,"32":0.00231,"33":0.00692,"34":0,"35":0.00231,"36":0,"37":0,"38":0.00461,"39":0,"40":0,"41":0.00461,"42":0,"43":0.00461,"44":0.00231,"45":0,"46":0,"47":0.00461,"48":0.00692,"49":0.00231,"50":0.00231,"51":0,"52":0.00461,"53":0,"54":0,"55":0,"56":0.00461,"57":0.00231,"58":0.00231,"59":0,"60":0.00231,"61":0.00231,"62":0,"63":0.00231,"64":0.0369,"65":0.00231,"66":0.00692,"67":0,"68":0.02998,"69":0.00231,"70":0.00231,"71":0.00231,"72":0.01845,"73":0.00692,"74":0.17987,"75":0.25597,"76":0.03459,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00231,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00231,"44":0,"45":0.00231,"46":0.00231,"47":0.01614,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00231,"54":0,"55":0,"56":0.00231,"57":0.00231,"58":0.00231,"60":0.00231,"62":0,"63":0,"64":0,"65":0.00461,"66":0.00231,"67":0.18679,"68":0.00692,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00231},G:{"8":0.00091,"3.2":0.00091,"4.0-4.1":0,"4.2-4.3":0.00183,"5.0-5.1":0.00913,"6.0-6.1":0.00274,"7.0-7.1":0.00913,"8.1-8.4":0.01278,"9.0-9.2":0.01095,"9.3":0.13141,"10.0-10.2":0.03377,"10.3":0.1159,"11.0-11.2":0.07483,"11.3-11.4":0.12685,"12.0-12.1":0.15696,"12.2-12.4":1.02848,"13.0-13.1":0.21902,"13.2":0.10677,"13.3":5.97923,"13.4":1.10787},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00231,"10":0.00231,"11":0.00231,"12":0.00461,"13":0.05534,_:"0","3.1":0,"3.2":0,"5.1":0.00231,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00231,"11.1":0.00231,"12.1":0.00922,"13.1":0.05996},I:{"3":0.00379,"4":0.03412,_:"81","2.1":0,"2.2":0.01137,"2.3":0.00379,"4.1":0.07583,"4.2-4.3":0.15924,"4.4":0,"4.4.3-4.4.4":1.09571},B:{"12":0.00922,"13":0.00922,"14":0.00692,"15":0.00461,"16":0.01384,"17":0.02075,"18":0.14528,_:"79 80 81"},P:{"4":2.10006,"5.0-5.4":0.42405,"6.2-6.4":0.24231,"7.2-7.4":0.82791,"8.2":0.15145,"9.2":0.74714,"10.1":1.11061,"11.1":1.89813},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02688,"9":0.00978,"10":0.00978,"11":0.23951,"5.5":0},N:{"10":0,"11":0.03847},J:{"7":0,"10":0.00769},R:{_:"0"},M:{"0":0.1231},O:{"0":3.09299},Q:{"1.2":0},S:{"2.5":0.00769},H:{"0":1.04164},L:{"0":69.68752}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AG.js b/website/www/node_modules/caniuse-lite/data/regions/AG.js new file mode 100644 index 000000000000..0a9ca35027b8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00378,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00756,"37":0,"38":0.04911,"39":0,"40":0,"41":0,"42":0.01133,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.034,"50":0,"51":0,"52":0,"53":0.01511,"54":0,"55":0.00378,"56":0.00756,"57":0.00378,"58":0.00378,"59":0.00378,"60":0.00378,"61":0.01133,"62":0.01133,"63":0.00378,"64":0.03778,"65":0.01889,"66":0.00378,"67":0.02267,"68":0.01133,"69":0.00378,"70":0.02267,"71":0.00378,"72":0.02645,"73":0.26824,"74":0.01133,"75":0.01133,"76":0.01511,"77":0.01133,"78":0.01133,"79":0.07178,"80":4.47315,"81":2.14968,"83":0.00756,"84":0.00378,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00378,"38":0,"39":0.00378,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00378,"46":0,"47":0,"48":0.00378,"49":0,"50":0,"51":0.00756,"52":0.03778,"53":0,"54":0,"55":0,"56":0,"57":0.01511,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.09067,"69":0.00378,"70":0.00378,"71":0.01133,"72":0.00378,"73":0.00756,"74":0.32869,"75":0.4458,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00378,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00756,"47":0.00378,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00378,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.29846,"68":0.00378,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00181,"3.2":0.00181,"4.0-4.1":0,"4.2-4.3":0.00363,"5.0-5.1":0.01814,"6.0-6.1":0.00544,"7.0-7.1":0.01814,"8.1-8.4":0.0254,"9.0-9.2":0.02177,"9.3":0.26126,"10.0-10.2":0.06713,"10.3":0.23042,"11.0-11.2":0.14877,"11.3-11.4":0.25219,"12.0-12.1":0.31206,"12.2-12.4":2.04475,"13.0-13.1":0.43544,"13.2":0.21228,"13.3":11.88748,"13.4":2.20259},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00378,"12":0.00756,"13":0.77827,_:"0","3.1":0,"3.2":0,"5.1":0.01889,"6.1":0,"7.1":0,"9.1":0.00756,"10.1":0.01511,"11.1":0.10201,"12.1":0.09445,"13.1":0.51381},I:{"3":0.0043,"4":0.03873,_:"81","2.1":0,"2.2":0.01291,"2.3":0.0043,"4.1":0.08606,"4.2-4.3":0.18072,"4.4":0,"4.4.3-4.4.4":1.24351},B:{"12":0.02645,"13":0.02645,"14":0.01133,"15":0.034,"16":0.01511,"17":0.09445,"18":1.63587,_:"79 80 81"},P:{"4":0.4499,"5.0-5.4":0.12854,"6.2-6.4":0.04285,"7.2-7.4":0.16068,"8.2":0.02142,"9.2":0.36421,"10.1":0.59987,"11.1":5.31316},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00823,"8":0.00412,"9":0.00823,"10":0.00823,"11":0.24698,"5.5":0},N:{"10":0.01867,"11":0.03733},J:{"7":0,"10":0.02489},R:{_:"0"},M:{"0":0.23021},O:{"0":0.16799},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.10014},L:{"0":57.10298}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AI.js b/website/www/node_modules/caniuse-lite/data/regions/AI.js new file mode 100644 index 000000000000..f66fad3d7b1f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01382,"37":0,"38":0,"39":0,"40":0,"41":0.00461,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00922,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01382,"64":0.00461,"65":0.00922,"66":0.00461,"67":0,"68":0.02765,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00461,"75":0.00922,"76":0.01382,"77":0.01843,"78":0.08294,"79":0.03226,"80":5.24851,"81":4.99968,"83":0,"84":0.00922,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00461,"65":0,"66":0,"67":0,"68":0.03226,"69":0,"70":0,"71":0,"72":0.03686,"73":0,"74":0.14285,"75":0.45158,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.28109,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00197,"3.2":0.00197,"4.0-4.1":0,"4.2-4.3":0.00393,"5.0-5.1":0.01966,"6.0-6.1":0.0059,"7.0-7.1":0.01966,"8.1-8.4":0.02752,"9.0-9.2":0.02359,"9.3":0.28311,"10.0-10.2":0.07274,"10.3":0.24969,"11.0-11.2":0.16121,"11.3-11.4":0.27328,"12.0-12.1":0.33816,"12.2-12.4":2.21572,"13.0-13.1":0.47185,"13.2":0.23003,"13.3":12.88146,"13.4":2.38677},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00922,"13":2.28096,_:"0","3.1":0,"3.2":0,"5.1":0.00461,"6.1":0,"7.1":0,"9.1":0.43776,"10.1":0.01843,"11.1":0.12902,"12.1":0.21197,"13.1":0.93542},I:{"3":0.00235,"4":0.02116,_:"81","2.1":0,"2.2":0.00705,"2.3":0.00235,"4.1":0.04701,"4.2-4.3":0.09873,"4.4":0,"4.4.3-4.4.4":0.67932},B:{"12":0.02304,"13":0.00922,"14":0.01382,"15":0.00461,"16":0.02304,"17":0.06451,"18":2.75558,_:"79 80 81"},P:{"4":0.06381,"5.0-5.4":0,"6.2-6.4":0.01063,"7.2-7.4":0.36157,"8.2":0.01063,"9.2":0.23396,"10.1":0.52109,"11.1":3.7859},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00534,"10":0.01067,"11":0.18675,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.45293},R:{_:"0"},M:{"0":0.04314},O:{"0":0.04853},Q:{"1.2":0},S:{"2.5":0.01078},H:{"0":0.30118},L:{"0":52.01493}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AL.js b/website/www/node_modules/caniuse-lite/data/regions/AL.js new file mode 100644 index 000000000000..3755f8fa7599 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00356,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00356,"37":0,"38":0.00712,"39":0,"40":0,"41":0.00356,"42":0.00356,"43":0.00356,"44":0,"45":0,"46":0.00356,"47":0.00356,"48":0.00356,"49":0.23489,"50":0,"51":0.00356,"52":0,"53":0.0178,"54":0.00356,"55":0.00712,"56":0.01068,"57":0.00356,"58":0.00356,"59":0,"60":0.00356,"61":0.02135,"62":0.00712,"63":0.0178,"64":0.00356,"65":0.00712,"66":0.00356,"67":0.01068,"68":0.0178,"69":0.03203,"70":0.06406,"71":0.12812,"72":0.05339,"73":0.06406,"74":0.02491,"75":0.02491,"76":0.03203,"77":0.02135,"78":0.04627,"79":0.04983,"80":5.91506,"81":3.54832,"83":0.01424,"84":0.00356,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00356,"48":0,"49":0,"50":0,"51":0,"52":0.0178,"53":0,"54":0,"55":0,"56":0.00356,"57":0,"58":0,"59":0,"60":0.00356,"61":0,"62":0,"63":0.00356,"64":0.0178,"65":0.00356,"66":0.00356,"67":0,"68":0.05339,"69":0,"70":0.00356,"71":0.00356,"72":0.00356,"73":0.00356,"74":0.19575,"75":0.38793,"76":0.00356,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00356,"37":0,"38":0,"39":0,"40":0.00712,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00356,"57":0.00712,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.23845,"68":0.00712,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00279,"3.2":0.00279,"4.0-4.1":0,"4.2-4.3":0.00557,"5.0-5.1":0.02786,"6.0-6.1":0.00836,"7.0-7.1":0.02786,"8.1-8.4":0.03901,"9.0-9.2":0.03343,"9.3":0.40121,"10.0-10.2":0.10309,"10.3":0.35385,"11.0-11.2":0.22847,"11.3-11.4":0.38728,"12.0-12.1":0.47923,"12.2-12.4":3.14005,"13.0-13.1":0.66869,"13.2":0.32599,"13.3":18.2552,"13.4":3.38245},E:{"4":0,"5":0,"6":0,"7":0.00356,"8":0,"9":0,"10":0,"11":0.00356,"12":0.00356,"13":0.14236,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01068,"11.1":0.04271,"12.1":0.04271,"13.1":0.14948},I:{"3":0.00072,"4":0.00646,_:"81","2.1":0,"2.2":0.00215,"2.3":0.00072,"4.1":0.01436,"4.2-4.3":0.03015,"4.4":0,"4.4.3-4.4.4":0.20747},B:{"12":0.00356,"13":0.00356,"14":0.00712,"15":0.00712,"16":0.00356,"17":0.02847,"18":0.19219,_:"79 80 81"},P:{"4":0.36506,"5.0-5.4":0,"6.2-6.4":0.0507,"7.2-7.4":0.15211,"8.2":0.0507,"9.2":0.25351,"10.1":0.54759,"11.1":4.98913},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00356,"7":0.00356,"8":0.07474,"9":0.00356,"10":0.00356,"11":0.05694,"5.5":0},N:{"10":0,"11":0.05153},J:{"7":0,"10":0.03865},R:{_:"0"},M:{"0":0.12882},O:{"0":0.05153},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.16464},L:{"0":50.12952}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AM.js b/website/www/node_modules/caniuse-lite/data/regions/AM.js new file mode 100644 index 000000000000..02f554b44acf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00779,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00779,"32":0,"33":0,"34":0,"35":0,"36":0.01558,"37":0,"38":0.01558,"39":0.00779,"40":0,"41":0,"42":0,"43":0.00779,"44":0,"45":0.00779,"46":0.00779,"47":0,"48":0,"49":0.76332,"50":0,"51":0.01558,"52":0.00779,"53":0.00779,"54":0,"55":0.01558,"56":0.01558,"57":0.00779,"58":0.03116,"59":0.00779,"60":0.02337,"61":0.00779,"62":0,"63":0.02337,"64":0.00779,"65":0.01558,"66":0.00779,"67":0.01558,"68":0.01558,"69":0.01558,"70":0.05452,"71":0.05452,"72":0.03116,"73":0.10126,"74":0.05452,"75":0.05452,"76":0.05452,"77":0.12462,"78":0.1402,"79":0.25704,"80":18.42877,"81":9.24554,"83":0.02337,"84":0.01558,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00779,"39":0,"40":0,"41":0,"42":0.01558,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00779,"51":0,"52":25.38435,"53":0.09347,"54":0,"55":0,"56":0,"57":0.00779,"58":0.00779,"59":0,"60":0,"61":0.00779,"62":0.00779,"63":0,"64":0.05452,"65":0,"66":0,"67":0,"68":0.03895,"69":0,"70":0,"71":0,"72":0.01558,"73":0.02337,"74":0.32714,"75":0.61533,"76":0.01558,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00779,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.73996,"68":0.01558,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0009,"3.2":0.0009,"4.0-4.1":0,"4.2-4.3":0.0018,"5.0-5.1":0.00902,"6.0-6.1":0.00271,"7.0-7.1":0.00902,"8.1-8.4":0.01262,"9.0-9.2":0.01082,"9.3":0.12985,"10.0-10.2":0.03336,"10.3":0.11452,"11.0-11.2":0.07394,"11.3-11.4":0.12534,"12.0-12.1":0.1551,"12.2-12.4":1.01624,"13.0-13.1":0.21641,"13.2":0.1055,"13.3":5.90808,"13.4":1.09469},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00779,"12":0.01558,"13":0.67764,_:"0","3.1":0,"3.2":0,"5.1":0.00779,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00779,"11.1":0.03116,"12.1":0.10126,"13.1":0.53744},I:{"3":0.00049,"4":0.00438,_:"81","2.1":0,"2.2":0.00146,"2.3":0.00049,"4.1":0.00973,"4.2-4.3":0.02043,"4.4":0,"4.4.3-4.4.4":0.14061},B:{"12":0,"13":0.00779,"14":0.02337,"15":0.01558,"16":0.01558,"17":0.02337,"18":0.29598,_:"79 80 81"},P:{"4":0.07123,"5.0-5.4":0,"6.2-6.4":0.01018,"7.2-7.4":0.06106,"8.2":0.02035,"9.2":0.07123,"10.1":0.23405,"11.1":1.17025},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00876,"7":0.00876,"8":0.02629,"9":0.00876,"10":0.00876,"11":0.07886,"5.5":0},N:{"10":0,"11":0.01327},J:{"7":0,"10":0.02432},R:{_:"0"},M:{"0":0.05085},O:{"0":0.17688},Q:{"1.2":0.00663},S:{"2.5":0},H:{"0":0.19886},L:{"0":26.48759}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AN.js b/website/www/node_modules/caniuse-lite/data/regions/AN.js new file mode 100644 index 000000000000..9ce90e499d67 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AN.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.080201,"21":0.051037,"22":0.080201,"24":0.029164,"26":0.131238,"28":0.102074,"31":0.51037,"32":0.306222,"33":2.223755,"34":0.204148,"35":1.407163,"36":28.87236,"38":0.080201,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 23 25 27 29 30 37 39 40"},C:{"10":0.029164,"12":0.051037,"21":0.029164,"26":0.051037,"27":0.029164,"29":0.029164,"30":4.031923,"31":10.827135,"32":0.051037,_:"2 3 4 5 6 7 8 9 11 13 14 15 16 17 18 19 20 22 23 24 25 28 33 34 3.5 3.6"},F:{"21":0.051037,"23":0.051037,"24":0.051037,_:"9 11 12 15 16 17 18 19 20 22 25 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.539534},E:{"4":0,"5":0.233312,"6":0.102074,"7":6.05153,"8":0.029164,_:"3.1 3.2","5.1":0.765555,"6.1":0.561407},I:{"3":0,"4":0.648893454545,"2.1":0.00612163636364,"2.2":0.0428514545455,"2.3":0.832542545455,"4.1":1.62223363636,"4.2-4.3":1.69569327273,"4.4":1.279422,_:"4.4.3"},K:{"10":0,"11":0,"12":0.0000648307692308,_:"0","11.1":0,"11.5":0,"12.1":0.000356569230769},A:{"8":1.4582,"9":2.47894,"10":1.633184,"11":9.471009,_:"6 7 5.5"},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0939043474576,"6.0-6.1":0.473354567797,"7.0-7.1":8.93049508475},J:{"7":0.40838175,_:"10"},M:{"0":0.051471},N:{"10":0.09419193},H:{"5.0-7.0":0.0239596},L:{"0":8.88552}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AO.js b/website/www/node_modules/caniuse-lite/data/regions/AO.js new file mode 100644 index 000000000000..527eb6a2600b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01406,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00469,"26":0.01874,"27":0,"28":0.00469,"29":0,"30":0,"31":0,"32":0,"33":0.00469,"34":0,"35":0.00937,"36":0.01874,"37":0,"38":0.00469,"39":0.00469,"40":0.04686,"41":0,"42":0.02343,"43":0.07966,"44":0,"45":0,"46":0.02343,"47":0.01406,"48":0.00469,"49":0.07498,"50":0.00469,"51":0,"52":0,"53":0.01874,"54":0.00469,"55":0.01406,"56":0.01406,"57":0.03749,"58":0.01406,"59":0.00469,"60":0.00937,"61":0.00469,"62":0.01406,"63":0.10778,"64":0.01406,"65":0.0328,"66":0.01406,"67":0.02812,"68":0.00937,"69":0.05155,"70":0.01406,"71":0.03749,"72":0.00937,"73":0.02812,"74":0.06092,"75":0.04686,"76":0.0656,"77":0.13121,"78":0.07966,"79":0.17338,"80":7.62881,"81":4.44701,"83":0.02343,"84":0.00937,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00469,"14":0,"15":0,"16":0.00469,"17":0,"18":0,"19":0.00469,"20":0.00469,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00469,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00937,"42":0,"43":0.00469,"44":0,"45":0.00469,"46":0,"47":0.00937,"48":0.00937,"49":0.00469,"50":0,"51":0.00469,"52":0.01406,"53":0,"54":0,"55":0,"56":0,"57":0.00469,"58":0.00469,"59":0,"60":0.00469,"61":0.00937,"62":0.00469,"63":0,"64":0,"65":0.00469,"66":0.00469,"67":0.00937,"68":0.0656,"69":0.00469,"70":0.00469,"71":0.00469,"72":0.02343,"73":0.01406,"74":0.43111,"75":0.67478,"76":0.00937,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00469,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00469,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00937,"43":0,"44":0,"45":0.00937,"46":0.00937,"47":0.01874,"48":0,"49":0.02812,"50":0,"51":0.00469,"52":0,"53":0.00469,"54":0,"55":0,"56":0.00469,"57":0.00937,"58":0,"60":0,"62":0,"63":0.01406,"64":0.00469,"65":0.0328,"66":0.01406,"67":1.09652,"68":0.02812,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00937},G:{"8":0.00109,"3.2":0.00109,"4.0-4.1":0,"4.2-4.3":0.00218,"5.0-5.1":0.01089,"6.0-6.1":0.00327,"7.0-7.1":0.01089,"8.1-8.4":0.01524,"9.0-9.2":0.01306,"9.3":0.15677,"10.0-10.2":0.04028,"10.3":0.13826,"11.0-11.2":0.08927,"11.3-11.4":0.15133,"12.0-12.1":0.18725,"12.2-12.4":1.22694,"13.0-13.1":0.26128,"13.2":0.12737,"13.3":7.133,"13.4":1.32165},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00469,"9":0,"10":0,"11":0.02812,"12":0.01874,"13":0.41705,_:"0","3.1":0,"3.2":0,"5.1":0.00937,"6.1":0,"7.1":0,"9.1":0.00937,"10.1":0.04217,"11.1":0.07029,"12.1":0.19681,"13.1":0.65604},I:{"3":0.00756,"4":0.06804,_:"81","2.1":0,"2.2":0.02268,"2.3":0.00756,"4.1":0.15119,"4.2-4.3":0.31751,"4.4":0,"4.4.3-4.4.4":2.18474},B:{"12":0.14058,"13":0.02343,"14":0.04217,"15":0.02343,"16":0.03749,"17":0.14527,"18":1.25585,_:"79 80 81"},P:{"4":0.84627,"5.0-5.4":0.07137,"6.2-6.4":0.05098,"7.2-7.4":0.23451,"8.2":0.06118,"9.2":0.31608,"10.1":0.63216,"11.1":1.92706},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05831,"9":0.04535,"10":0.03887,"11":0.60254,"5.5":0},N:{"10":0.01727,"11":0.05181},J:{"7":0,"10":0.18068},R:{_:"0"},M:{"0":0.15942},O:{"0":1.00966},Q:{"1.2":0.09034},S:{"2.5":0},H:{"0":3.38583},L:{"0":52.00466}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AR.js b/website/www/node_modules/caniuse-lite/data/regions/AR.js new file mode 100644 index 000000000000..213d325397ec --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0045,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0045,"35":0,"36":0.0045,"37":0,"38":0.018,"39":0,"40":0,"41":0,"42":0.0045,"43":0.0045,"44":0,"45":0,"46":0.0045,"47":0,"48":0.0045,"49":0.28806,"50":0.0045,"51":0.0045,"52":0,"53":0.0045,"54":0,"55":0.0045,"56":0.0045,"57":0.0045,"58":0.018,"59":0.0045,"60":0.0045,"61":0.0045,"62":0.0045,"63":0.02251,"64":0.0045,"65":0.018,"66":0.018,"67":0.02251,"68":0.009,"69":0.009,"70":0.02701,"71":0.03601,"72":0.03151,"73":0.03601,"74":0.02701,"75":0.03151,"76":0.04051,"77":0.04051,"78":0.06301,"79":0.13053,"80":10.05523,"81":5.62625,"83":0.009,"84":0.0045,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0045,"48":0.0045,"49":0,"50":0,"51":0,"52":0.04051,"53":0,"54":0,"55":0,"56":0.009,"57":0,"58":0,"59":0.0045,"60":0.0045,"61":0,"62":0,"63":0,"64":0.0045,"65":0.0045,"66":0.009,"67":0.0045,"68":0.04951,"69":0.0045,"70":0.0045,"71":0.0045,"72":0.0135,"73":0.009,"74":0.33307,"75":0.63914,"76":0.0045,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0045,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.0045,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.34658,"68":0.009,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00058,"3.2":0.00058,"4.0-4.1":0,"4.2-4.3":0.00117,"5.0-5.1":0.00585,"6.0-6.1":0.00175,"7.0-7.1":0.00585,"8.1-8.4":0.00819,"9.0-9.2":0.00702,"9.3":0.0842,"10.0-10.2":0.02164,"10.3":0.07426,"11.0-11.2":0.04795,"11.3-11.4":0.08128,"12.0-12.1":0.10058,"12.2-12.4":0.65901,"13.0-13.1":0.14034,"13.2":0.06842,"13.3":3.83124,"13.4":0.70988},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0045,"11":0.0045,"12":0.018,"13":0.22505,_:"0","3.1":0,"3.2":0,"5.1":0.16204,"6.1":0,"7.1":0,"9.1":0.0045,"10.1":0.018,"11.1":0.04051,"12.1":0.06301,"13.1":0.23405},I:{"3":0.00058,"4":0.00522,_:"81","2.1":0,"2.2":0.00174,"2.3":0.00058,"4.1":0.01159,"4.2-4.3":0.02434,"4.4":0,"4.4.3-4.4.4":0.16747},B:{"12":0.0045,"13":0.0045,"14":0.009,"15":0.02701,"16":0.0045,"17":0.02701,"18":0.40059,_:"79 80 81"},P:{"4":0.29564,"5.0-5.4":0.01019,"6.2-6.4":0.03058,"7.2-7.4":0.13253,"8.2":0.03058,"9.2":0.11214,"10.1":0.30584,"11.1":2.22242},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01834,"9":0.00917,"10":0.00458,"11":0.21546,"5.5":0},N:{"10":0,"11":0.11548},J:{"7":0,"10":0.0055},R:{_:"0"},M:{"0":0.07699},O:{"0":0.03849},Q:{"1.2":0.0055},S:{"2.5":0},H:{"0":0.14056},L:{"0":68.8126}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AS.js b/website/www/node_modules/caniuse-lite/data/regions/AS.js new file mode 100644 index 000000000000..25067d7162ca --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.02771,"46":0.00554,"47":0,"48":0,"49":0.40457,"50":0,"51":0,"52":0,"53":0,"54":0.00554,"55":0,"56":0,"57":0,"58":0.02217,"59":0,"60":0,"61":0.01663,"62":0.00554,"63":0.03325,"64":0.00554,"65":0.02217,"66":0.00554,"67":0.01663,"68":0.06096,"69":0.26602,"70":0.00554,"71":0,"72":0.03325,"73":0,"74":0.00554,"75":0.05542,"76":1.29129,"77":0.02771,"78":0.02771,"79":0.09421,"80":8.55685,"81":10.83461,"83":0.03325,"84":0.00554,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01108,"48":0.01663,"49":0,"50":0,"51":0,"52":0.03879,"53":0,"54":0,"55":0,"56":0,"57":0.01108,"58":0,"59":0,"60":0,"61":0,"62":0.00554,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02771,"69":0.00554,"70":0,"71":0,"72":0,"73":0.00554,"74":0.73709,"75":1.49634,"76":0.03325,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00554,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.01663,"66":0.02217,"67":0.2106,"68":0.00554,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00169,"3.2":0.00169,"4.0-4.1":0,"4.2-4.3":0.00337,"5.0-5.1":0.01685,"6.0-6.1":0.00506,"7.0-7.1":0.01685,"8.1-8.4":0.02359,"9.0-9.2":0.02022,"9.3":0.24268,"10.0-10.2":0.06236,"10.3":0.21403,"11.0-11.2":0.13819,"11.3-11.4":0.23426,"12.0-12.1":0.28987,"12.2-12.4":1.89933,"13.0-13.1":0.40447,"13.2":0.19718,"13.3":11.04205,"13.4":2.04595},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00554,"12":0.01108,"13":0.43782,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.13301,"11.1":0.35469,"12.1":0.12747,"13.1":0.60962},I:{"3":0.00143,"4":0.01285,_:"81","2.1":0,"2.2":0.00428,"2.3":0.00143,"4.1":0.02855,"4.2-4.3":0.05996,"4.4":0,"4.4.3-4.4.4":0.41257},B:{"12":0.07759,"13":0.00554,"14":0,"15":0.03879,"16":0.08313,"17":0.08313,"18":1.50742,_:"79 80 81"},P:{"4":0.03063,"5.0-5.4":0,"6.2-6.4":0.08167,"7.2-7.4":0.25523,"8.2":0.03063,"9.2":0.07147,"10.1":0.09188,"11.1":1.0924},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.26047,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.0535},O:{"0":0.1382},Q:{"1.2":0.00446},S:{"2.5":0},H:{"0":11.03251},L:{"0":33.15222}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AT.js b/website/www/node_modules/caniuse-lite/data/regions/AT.js new file mode 100644 index 000000000000..922a01920b10 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00529,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00529,"35":0,"36":0,"37":0,"38":0.01588,"39":0,"40":0.01059,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00529,"48":0,"49":0.17467,"50":0,"51":0.00529,"52":0,"53":0.02647,"54":0,"55":0,"56":0,"57":0.00529,"58":0.01059,"59":0.01059,"60":0.00529,"61":0.00529,"62":0.00529,"63":0.04234,"64":0.01588,"65":0.01588,"66":0.00529,"67":0.02647,"68":0.00529,"69":0.01588,"70":0.03705,"71":0.03176,"72":0.05822,"73":0.11115,"74":0.02117,"75":0.02647,"76":0.02647,"77":0.04764,"78":0.06352,"79":0.1535,"80":8.11417,"81":4.03327,"83":0.01059,"84":0.00529,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00529,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00529,"44":0.00529,"45":0.00529,"46":0,"47":0.00529,"48":0.01588,"49":0,"50":0.00529,"51":0.00529,"52":0.09527,"53":0,"54":0.00529,"55":0.00529,"56":0.01059,"57":0.01059,"58":0.00529,"59":0.00529,"60":0.05293,"61":0.01059,"62":0.01059,"63":0.01059,"64":0.00529,"65":0.02647,"66":0.01059,"67":0.02117,"68":0.5293,"69":0.01059,"70":0.01588,"71":0.01588,"72":0.05822,"73":0.04764,"74":1.61966,"75":2.84763,"76":0.02117,"77":0.00529,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00529,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00529,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00529,"67":0.79924,"68":0.01588,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00222,"3.2":0.00222,"4.0-4.1":0,"4.2-4.3":0.00445,"5.0-5.1":0.02223,"6.0-6.1":0.00667,"7.0-7.1":0.02223,"8.1-8.4":0.03112,"9.0-9.2":0.02667,"9.3":0.32004,"10.0-10.2":0.08223,"10.3":0.28226,"11.0-11.2":0.18225,"11.3-11.4":0.30893,"12.0-12.1":0.38227,"12.2-12.4":2.50476,"13.0-13.1":0.5334,"13.2":0.26003,"13.3":14.56183,"13.4":2.69812},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00529,"9":0.00529,"10":0.01059,"11":0.02117,"12":0.08998,"13":1.60907,_:"0","3.1":0,"3.2":0,"5.1":0.00529,"6.1":0.00529,"7.1":0,"9.1":0.02647,"10.1":0.06881,"11.1":0.15879,"12.1":0.25936,"13.1":1.22798},I:{"3":0.00103,"4":0.00925,_:"81","2.1":0,"2.2":0.00308,"2.3":0.00103,"4.1":0.02056,"4.2-4.3":0.04318,"4.4":0,"4.4.3-4.4.4":0.29713},B:{"12":0.00529,"13":0.00529,"14":0.01059,"15":0.01059,"16":0.02117,"17":0.08469,"18":2.21777,_:"79 80 81"},P:{"4":0.28017,"5.0-5.4":0.02075,"6.2-6.4":0.02075,"7.2-7.4":0.05188,"8.2":0.03113,"9.2":0.19716,"10.1":0.4047,"11.1":4.4724},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01121,"9":0.01121,"10":0.00561,"11":1.29522,"5.5":0},N:{"10":0,"11":0.00941},J:{"7":0,"10":0.00471},R:{_:"0"},M:{"0":0.42834},O:{"0":0.08943},Q:{"1.2":0.00941},S:{"2.5":0},H:{"0":0.16934},L:{"0":40.82336}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AU.js b/website/www/node_modules/caniuse-lite/data/regions/AU.js new file mode 100644 index 000000000000..3f1ef2b2d27a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00516,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00516,"35":0,"36":0,"37":0,"38":0.02062,"39":0,"40":0.01031,"41":0.00516,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00516,"49":0.1495,"50":0,"51":0,"52":0.00516,"53":0.02578,"54":0.00516,"55":0.01031,"56":0.01031,"57":0.01547,"58":0.01031,"59":0.01031,"60":0.01031,"61":0.00516,"62":0.00516,"63":0.02062,"64":0.01547,"65":0.03609,"66":0.01547,"67":0.03609,"68":0.02578,"69":0.03609,"70":0.05155,"71":0.0464,"72":0.05671,"73":0.11857,"74":0.09279,"75":0.08764,"76":0.09279,"77":0.09795,"78":0.15981,"79":0.31961,"80":9.62954,"81":4.22195,"83":0.01031,"84":0.00516,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00516,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00516,"46":0,"47":0.00516,"48":0.01031,"49":0,"50":0.00516,"51":0,"52":0.03093,"53":0,"54":0.00516,"55":0,"56":0.00516,"57":0,"58":0.01031,"59":0,"60":0.00516,"61":0,"62":0.00516,"63":0.00516,"64":0.01031,"65":0.00516,"66":0.01547,"67":0.00516,"68":0.1495,"69":0.00516,"70":0.00516,"71":0.01031,"72":0.03093,"73":0.03093,"74":0.55674,"75":0.8712,"76":0.01031,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.02062,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00516,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00516,"67":0.1495,"68":0.00516,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00394,"3.2":0.00394,"4.0-4.1":0,"4.2-4.3":0.00788,"5.0-5.1":0.0394,"6.0-6.1":0.01182,"7.0-7.1":0.0394,"8.1-8.4":0.05516,"9.0-9.2":0.04728,"9.3":0.56735,"10.0-10.2":0.14578,"10.3":0.50037,"11.0-11.2":0.32307,"11.3-11.4":0.54765,"12.0-12.1":0.67767,"12.2-12.4":4.4403,"13.0-13.1":0.94558,"13.2":0.46097,"13.3":25.81441,"13.4":4.78307},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01547,"9":0.00516,"10":0.01031,"11":0.02578,"12":0.07733,"13":2.46409,_:"0","3.1":0,"3.2":0,"5.1":0.00516,"6.1":0,"7.1":0,"9.1":0.02578,"10.1":0.07733,"11.1":0.15981,"12.1":0.27837,"13.1":1.04647},I:{"3":0.00095,"4":0.00851,_:"81","2.1":0,"2.2":0.00284,"2.3":0.00095,"4.1":0.01891,"4.2-4.3":0.03972,"4.4":0,"4.4.3-4.4.4":0.27329},B:{"12":0.00516,"13":0.00516,"14":0.00516,"15":0.01031,"16":0.02062,"17":0.05671,"18":1.52073,_:"79 80 81"},P:{"4":0.15041,"5.0-5.4":0.02149,"6.2-6.4":0.02149,"7.2-7.4":0.03223,"8.2":0.02149,"9.2":0.13966,"10.1":0.30081,"11.1":3.01886},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.01609,"10":0.00805,"11":0.96562,"5.5":0},N:{"10":0,"11":0.00969},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.29555},O:{"0":0.21318},Q:{"1.2":0.08237},S:{"2.5":0},H:{"0":0.22935},L:{"0":28.52094}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AW.js b/website/www/node_modules/caniuse-lite/data/regions/AW.js new file mode 100644 index 000000000000..3b5aa82dfdb1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00306,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00306,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.06112,"50":0,"51":0,"52":0,"53":0.00611,"54":0.00611,"55":0,"56":0.00306,"57":0,"58":0.00611,"59":0,"60":0,"61":0,"62":0,"63":0.00917,"64":0,"65":0,"66":0,"67":0.00611,"68":0,"69":0,"70":0.02139,"71":0.00306,"72":0.00611,"73":0.00611,"74":0.00611,"75":0.00917,"76":0.03973,"77":0.01528,"78":0.03362,"79":0.07334,"80":3.01933,"81":1.58606,"83":0.00611,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00306,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03362,"69":0.00306,"70":0,"71":0,"72":0.00611,"73":0,"74":0.15586,"75":0.30254,"76":0.01834,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.08862,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00213,"3.2":0.00213,"4.0-4.1":0,"4.2-4.3":0.00426,"5.0-5.1":0.0213,"6.0-6.1":0.00639,"7.0-7.1":0.0213,"8.1-8.4":0.02982,"9.0-9.2":0.02556,"9.3":0.30672,"10.0-10.2":0.07881,"10.3":0.27051,"11.0-11.2":0.17466,"11.3-11.4":0.29607,"12.0-12.1":0.36636,"12.2-12.4":2.4005,"13.0-13.1":0.5112,"13.2":0.24921,"13.3":13.9557,"13.4":2.58581},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01528,"11":0.00306,"12":0.01222,"13":0.67843,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01222,"10.1":0.03667,"11.1":0.05501,"12.1":0.0764,"13.1":0.39117},I:{"3":0.00053,"4":0.00477,_:"81","2.1":0,"2.2":0.00159,"2.3":0.00053,"4.1":0.01061,"4.2-4.3":0.02228,"4.4":0,"4.4.3-4.4.4":0.15331},B:{"12":0,"13":0,"14":0.01222,"15":0.03362,"16":0.00611,"17":0.0275,"18":1.06349,_:"79 80 81"},P:{"4":0.12637,"5.0-5.4":0.03159,"6.2-6.4":0.02106,"7.2-7.4":0.20009,"8.2":0.05265,"9.2":0.50548,"10.1":0.74769,"11.1":10.09904},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00929,"9":0,"10":0,"11":0.46745,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13888},O:{"0":0.10416},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.06574},L:{"0":54.12362}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AX.js b/website/www/node_modules/caniuse-lite/data/regions/AX.js new file mode 100644 index 000000000000..2a0376ab9e8e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AX.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01226,"47":0,"48":0,"49":0.26355,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01839,"64":0,"65":0.00613,"66":0.00613,"67":0.00613,"68":0.07355,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.01839,"75":0.41677,"76":0.11032,"77":0.00613,"78":0.01226,"79":0.07355,"80":18.77313,"81":2.43934,"83":0.01839,"84":0.01226,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00613,"49":0,"50":0,"51":0,"52":0.14097,"53":0,"54":0,"55":0,"56":0,"57":0.00613,"58":0,"59":0,"60":0,"61":0.04903,"62":0,"63":0,"64":0,"65":0,"66":0.01226,"67":0,"68":0.57,"69":0,"70":0,"71":0,"72":0,"73":0.00613,"74":1.33612,"75":1.70999,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00613,"67":0.20839,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00215,"3.2":0.00215,"4.0-4.1":0,"4.2-4.3":0.00429,"5.0-5.1":0.02147,"6.0-6.1":0.00644,"7.0-7.1":0.02147,"8.1-8.4":0.03006,"9.0-9.2":0.02576,"9.3":0.30915,"10.0-10.2":0.07943,"10.3":0.27265,"11.0-11.2":0.17604,"11.3-11.4":0.29841,"12.0-12.1":0.36926,"12.2-12.4":2.41951,"13.0-13.1":0.51525,"13.2":0.25118,"13.3":14.0662,"13.4":2.60628},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":3.30966,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.03065,"10.1":0.31258,"11.1":0.31258,"12.1":0.22677,"13.1":1.47709},I:{"3":0.00073,"4":0.00655,_:"81","2.1":0,"2.2":0.00218,"2.3":0.00073,"4.1":0.01455,"4.2-4.3":0.03055,"4.4":0,"4.4.3-4.4.4":0.21021},B:{"12":0,"13":0.00613,"14":0.00613,"15":0,"16":0.02452,"17":0.14097,"18":2.2616,_:"79 80 81"},P:{"4":0.19181,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.08525,"8.2":0.02131,"9.2":0.20247,"10.1":0.1705,"11.1":2.17385},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00613,"10":0.0429,"11":0.87032,"5.5":0},N:{"10":0.02323,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":1.23872},O:{"0":0.82839},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.05497},L:{"0":34.92979}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/AZ.js b/website/www/node_modules/caniuse-lite/data/regions/AZ.js new file mode 100644 index 000000000000..3adb2715e847 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/AZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00364,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01457,"23":0,"24":0,"25":0,"26":0.00364,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00364,"35":0,"36":0,"37":0.00364,"38":0.01093,"39":0.00364,"40":0.00364,"41":0.00364,"42":0.00364,"43":0,"44":0,"45":0.00364,"46":0.00364,"47":0.00364,"48":0,"49":0.10926,"50":0.00364,"51":0,"52":0,"53":0.02914,"54":0,"55":0.00364,"56":0.00728,"57":0.00364,"58":0.00728,"59":0.00364,"60":0.00364,"61":0.00364,"62":0.00728,"63":0.02914,"64":0.00728,"65":0.00728,"66":0.00728,"67":0.01093,"68":0.01457,"69":0.01093,"70":0.02914,"71":0.0692,"72":0.02914,"73":0.05099,"74":0.02914,"75":0.04006,"76":0.04006,"77":0.04735,"78":0.06191,"79":0.07648,"80":6.16226,"81":2.68415,"83":0.01457,"84":0.00364,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00364,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00364,"46":0,"47":0.00728,"48":0.02549,"49":0,"50":0.00364,"51":0,"52":0.00728,"53":0,"54":0,"55":0,"56":0.00364,"57":0.00364,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00364,"64":0.01093,"65":0.00364,"66":0.00364,"67":0,"68":0.03642,"69":0,"70":0,"71":0,"72":0.00364,"73":0.00364,"74":0.12019,"75":0.15661,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0.00728,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00364,"37":0,"38":0,"39":0,"40":0.00364,"41":0,"42":0,"43":0,"44":0,"45":0.00364,"46":0.00364,"47":0.00728,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00364,"54":0,"55":0,"56":0.00364,"57":0.00364,"58":0.00364,"60":0,"62":0,"63":0,"64":0,"65":0.00364,"66":0.01821,"67":0.92143,"68":0.01821,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00364},G:{"8":0.00094,"3.2":0.00094,"4.0-4.1":0,"4.2-4.3":0.00189,"5.0-5.1":0.00944,"6.0-6.1":0.00283,"7.0-7.1":0.00944,"8.1-8.4":0.01322,"9.0-9.2":0.01133,"9.3":0.136,"10.0-10.2":0.03494,"10.3":0.11994,"11.0-11.2":0.07744,"11.3-11.4":0.13127,"12.0-12.1":0.16244,"12.2-12.4":1.06435,"13.0-13.1":0.22666,"13.2":0.1105,"13.3":6.18779,"13.4":1.14652},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00728,"12":0.02185,"13":0.1821,_:"0","3.1":0,"3.2":0,"5.1":0.47346,"6.1":0,"7.1":0,"9.1":0.00728,"10.1":0.00364,"11.1":0.01457,"12.1":0.06556,"13.1":0.12383},I:{"3":0.00212,"4":0.0191,_:"81","2.1":0,"2.2":0.00637,"2.3":0.00212,"4.1":0.04244,"4.2-4.3":0.08911,"4.4":0,"4.4.3-4.4.4":0.61319},B:{"12":0.00364,"13":0,"14":0.00364,"15":0.00364,"16":0.00364,"17":0.01093,"18":0.11654,_:"79 80 81"},P:{"4":1.169,"5.0-5.4":0.0305,"6.2-6.4":0.09149,"7.2-7.4":0.2033,"8.2":0.08132,"9.2":0.4676,"10.1":0.87421,"11.1":5.57052},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00427,"7":0,"8":0.064,"9":0.0128,"10":0.00853,"11":0.05973,"5.5":0},N:{"10":0,"11":0.06994},J:{"7":0,"10":0.00636},R:{_:"0"},M:{"0":0.06994},O:{"0":0.44506},Q:{"1.2":0.00636},S:{"2.5":0},H:{"0":1.07144},L:{"0":62.73932}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BA.js b/website/www/node_modules/caniuse-lite/data/regions/BA.js new file mode 100644 index 000000000000..eefafb88ff34 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00254,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00254,"23":0,"24":0,"25":0,"26":0.00254,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.2536,"34":0,"35":0,"36":0,"37":0.00761,"38":0.00254,"39":0,"40":0,"41":0,"42":0,"43":0.00254,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.07354,"50":0,"51":0,"52":0,"53":0.00507,"54":0,"55":0,"56":0.00254,"57":0,"58":0.00254,"59":0,"60":0,"61":0.00254,"62":0.00254,"63":0.00507,"64":0,"65":0.00254,"66":0.00254,"67":0.00507,"68":0.00507,"69":0.01522,"70":0.00507,"71":0.01522,"72":0.00761,"73":0.00761,"74":0.00761,"75":0.00761,"76":0.01268,"77":0.00761,"78":0.01522,"79":0.0355,"80":2.80228,"81":1.36183,"83":0.00254,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00254,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01775,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00254,"52":0.03804,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00254,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00254,"66":0.00254,"67":0,"68":0.04311,"69":0.00254,"70":0,"71":0.00254,"72":0.00507,"73":0.00507,"74":0.21049,"75":0.35504,"76":0.00507,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00254,"37":0,"38":0,"39":0,"40":0.00254,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00761,"57":0.00254,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00254,"67":0.15723,"68":0.00254,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00072,"3.2":0.00072,"4.0-4.1":0,"4.2-4.3":0.00143,"5.0-5.1":0.00717,"6.0-6.1":0.00215,"7.0-7.1":0.00717,"8.1-8.4":0.01003,"9.0-9.2":0.0086,"9.3":0.10318,"10.0-10.2":0.02651,"10.3":0.091,"11.0-11.2":0.05875,"11.3-11.4":0.0996,"12.0-12.1":0.12324,"12.2-12.4":0.80752,"13.0-13.1":0.17196,"13.2":0.08383,"13.3":4.69464,"13.4":0.86986},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00254,"11":0.00254,"12":0.00507,"13":0.08115,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00254,"10.1":0.01522,"11.1":0.00761,"12.1":0.01268,"13.1":0.06594},I:{"3":0.00162,"4":0.01457,_:"81","2.1":0,"2.2":0.00486,"2.3":0.00162,"4.1":0.03238,"4.2-4.3":0.06801,"4.4":0,"4.4.3-4.4.4":0.46795},B:{"12":0,"13":0.00254,"14":0.00507,"15":0.01522,"16":0.00254,"17":0.01775,"18":0.11666,_:"79 80 81"},P:{"4":0.1428,"5.0-5.4":0.0102,"6.2-6.4":0.0306,"7.2-7.4":0.0612,"8.2":0.0408,"9.2":0.22441,"10.1":0.37741,"11.1":4.42694},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00268,"11":0.09369,"5.5":0},N:{"10":0,"11":0.02986},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.12689},O:{"0":0.01493},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.17666},L:{"0":78.95512}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BB.js b/website/www/node_modules/caniuse-lite/data/regions/BB.js new file mode 100644 index 000000000000..4e31da4777cc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BB.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00455,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00455,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00455,"39":0,"40":0.00455,"41":0,"42":0,"43":0,"44":0.00455,"45":0,"46":0,"47":0,"48":0,"49":0.07282,"50":0.00455,"51":0,"52":0,"53":0,"54":0.0182,"55":0,"56":0.00455,"57":0.00455,"58":0.00455,"59":0.00455,"60":0.00455,"61":0,"62":0.0091,"63":0.0091,"64":0,"65":0.0091,"66":0.00455,"67":0.00455,"68":0.00455,"69":0.01365,"70":0.02276,"71":0.05461,"72":0.00455,"73":0.03186,"74":0.0182,"75":0.0091,"76":0.02276,"77":0.0091,"78":0.03186,"79":0.14108,"80":7.92329,"81":3.67721,"83":0.00455,"84":0.00455,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00455,"49":0,"50":0,"51":0,"52":0.01365,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00455,"59":0,"60":0.00455,"61":0,"62":0,"63":0,"64":0.00455,"65":0,"66":0.00455,"67":0,"68":0.14108,"69":0.02731,"70":0,"71":0,"72":0.01365,"73":0.0091,"74":0.40959,"75":0.74181,"76":0.0091,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00455,"66":0,"67":0.37773,"68":0.00455,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00179,"3.2":0.00179,"4.0-4.1":0,"4.2-4.3":0.00358,"5.0-5.1":0.0179,"6.0-6.1":0.00537,"7.0-7.1":0.0179,"8.1-8.4":0.02506,"9.0-9.2":0.02148,"9.3":0.25777,"10.0-10.2":0.06623,"10.3":0.22733,"11.0-11.2":0.14678,"11.3-11.4":0.24882,"12.0-12.1":0.30789,"12.2-12.4":2.01737,"13.0-13.1":0.42961,"13.2":0.20943,"13.3":11.72832,"13.4":2.1731},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0091,"9":0,"10":0,"11":0.0091,"12":0.03186,"13":0.97847,_:"0","3.1":0,"3.2":0,"5.1":0.04096,"6.1":0,"7.1":0,"9.1":0.0091,"10.1":0.02276,"11.1":0.06371,"12.1":0.06371,"13.1":0.70541},I:{"3":0.0049,"4":0.04409,_:"81","2.1":0,"2.2":0.0147,"2.3":0.0049,"4.1":0.09798,"4.2-4.3":0.20575,"4.4":0,"4.4.3-4.4.4":1.41575},B:{"12":0.0091,"13":0.00455,"14":0.00455,"15":0.05916,"16":0.0182,"17":0.08647,"18":2.21634,_:"79 80 81"},P:{"4":0.26214,"5.0-5.4":0,"6.2-6.4":0.02185,"7.2-7.4":0.17476,"8.2":0.01092,"9.2":0.21845,"10.1":0.44782,"11.1":6.13847},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00465,"10":0.0186,"11":0.40454,"5.5":0},N:{"10":0.01362,"11":0.04087},J:{"7":0,"10":0.00545},R:{_:"0"},M:{"0":0.267},O:{"0":0.10898},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.08254},L:{"0":50.057}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BD.js b/website/www/node_modules/caniuse-lite/data/regions/BD.js new file mode 100644 index 000000000000..a5bdd0441ba8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BD.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00419,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00419,"30":0,"31":0.00419,"32":0,"33":0.00419,"34":0,"35":0,"36":0.00419,"37":0,"38":0,"39":0,"40":0.00839,"41":0.00419,"42":0,"43":0.00419,"44":0,"45":0,"46":0.00419,"47":0,"48":0.00419,"49":0.09225,"50":0.00419,"51":0.00419,"52":0,"53":0,"54":0,"55":0,"56":0.00419,"57":0.00419,"58":0.00839,"59":0,"60":0.00419,"61":0.02516,"62":0.00419,"63":0.02516,"64":0.00419,"65":0.00839,"66":0.00419,"67":0.00419,"68":0.00419,"69":0.01258,"70":0.05451,"71":0.04612,"72":0.04193,"73":0.02935,"74":0.04193,"75":0.02516,"76":0.02516,"77":0.03774,"78":0.04193,"79":0.08386,"80":6.65848,"81":4.53683,"83":0.04193,"84":0.01677,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00419,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00419,"39":0.00419,"40":0.00419,"41":0.00419,"42":0.00419,"43":0.01258,"44":0.00839,"45":0.00419,"46":0.00419,"47":0.01677,"48":0.00839,"49":0.00419,"50":0.00419,"51":0.00419,"52":0.03354,"53":0,"54":0,"55":0,"56":0.00839,"57":0.00419,"58":0.00419,"59":0.00419,"60":0.00419,"61":0,"62":0.00419,"63":0.00839,"64":0.01258,"65":0.00839,"66":0.02097,"67":0.00419,"68":0.08805,"69":0.00419,"70":0.01258,"71":0.00839,"72":0.02935,"73":0.01677,"74":0.63314,"75":1.34176,"76":0.20126,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0.00419,"16":0,"17":0,"18":0,"19":0,"20":0.00419,"21":0,"22":0.00419,"23":0,"24":0.00419,"25":0,"26":0.00839,"27":0.00839,"28":0.02935,"29":0.00419,"30":0.00839,"31":0.00419,"32":0.01258,"33":0.00419,"34":0,"35":0.00419,"36":0.00419,"37":0.01258,"38":0.01677,"39":0,"40":0,"41":0,"42":0.01677,"43":0,"44":0.00419,"45":0.04612,"46":0.1803,"47":0.54509,"48":0.01258,"49":0,"50":0,"51":0,"52":0,"53":0.00839,"54":0.00419,"55":0.00839,"56":0.00839,"57":0.01677,"58":0.00839,"60":0,"62":0,"63":0,"64":0,"65":0.00419,"66":0.00419,"67":0.62476,"68":0.02097,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01258},G:{"8":0.0002,"3.2":0.0002,"4.0-4.1":0,"4.2-4.3":0.0004,"5.0-5.1":0.00202,"6.0-6.1":0.0006,"7.0-7.1":0.00202,"8.1-8.4":0.00282,"9.0-9.2":0.00242,"9.3":0.02902,"10.0-10.2":0.00746,"10.3":0.02559,"11.0-11.2":0.01653,"11.3-11.4":0.02801,"12.0-12.1":0.03466,"12.2-12.4":0.22713,"13.0-13.1":0.04837,"13.2":0.02358,"13.3":1.32046,"13.4":0.24466},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00839,"13":0.05032,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00419,"11.1":0.00839,"12.1":0.01677,"13.1":0.05032},I:{"3":0.00217,"4":0.01954,_:"81","2.1":0,"2.2":0.00651,"2.3":0.00217,"4.1":0.04341,"4.2-4.3":0.09116,"4.4":0,"4.4.3-4.4.4":0.6273},B:{"12":0.02097,"13":0.01677,"14":0.02097,"15":0.02097,"16":0.01258,"17":0.02097,"18":0.20965,_:"79 80 81"},P:{"4":0.6966,"5.0-5.4":0.03029,"6.2-6.4":0.05048,"7.2-7.4":0.15143,"8.2":0.05048,"9.2":0.14134,"10.1":0.26249,"11.1":0.81775},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05322,"9":0.00532,"10":0.01064,"11":0.06918,"5.5":0},N:{"10":0.01161,"11":0.05807},J:{"7":0,"10":0.01161},R:{_:"0"},M:{"0":0.17421},O:{"0":6.66063},Q:{"1.2":0.01161},S:{"2.5":0},H:{"0":7.08103},L:{"0":57.13594}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BE.js b/website/www/node_modules/caniuse-lite/data/regions/BE.js new file mode 100644 index 000000000000..948c47235739 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00612,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00612,"39":0,"40":0.01224,"41":0,"42":0,"43":0.00612,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.26928,"50":0,"51":0,"52":0,"53":0.01224,"54":0,"55":0,"56":0,"57":0.00612,"58":0.00612,"59":0.01836,"60":0.00612,"61":0.01224,"62":0.00612,"63":0.01836,"64":0,"65":0.02448,"66":0.01224,"67":0.0306,"68":0.01224,"69":0.02448,"70":0.03672,"71":0.0306,"72":0.0306,"73":0.0306,"74":0.05508,"75":0.06732,"76":0.05508,"77":0.04896,"78":0.0918,"79":0.19584,"80":13.58028,"81":7.02576,"83":0.01224,"84":0.01224,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.02448,"49":0,"50":0.01224,"51":0,"52":0.04896,"53":0,"54":0,"55":0,"56":0.01836,"57":0,"58":0.00612,"59":0,"60":0.01836,"61":0,"62":0.00612,"63":0.00612,"64":0.00612,"65":0.0306,"66":0.02448,"67":0.00612,"68":0.2142,"69":0.00612,"70":0.01224,"71":0.01224,"72":0.04284,"73":0.0306,"74":1.08936,"75":1.9584,"76":0.01836,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00612,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00612,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0.01836,"63":0,"64":0,"65":0,"66":0.00612,"67":0.47736,"68":0.01224,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00234,"3.2":0.00234,"4.0-4.1":0,"4.2-4.3":0.00467,"5.0-5.1":0.02337,"6.0-6.1":0.00701,"7.0-7.1":0.02337,"8.1-8.4":0.03271,"9.0-9.2":0.02804,"9.3":0.33646,"10.0-10.2":0.08645,"10.3":0.29674,"11.0-11.2":0.19159,"11.3-11.4":0.32478,"12.0-12.1":0.40188,"12.2-12.4":2.63326,"13.0-13.1":0.56077,"13.2":0.27337,"13.3":15.30889,"13.4":2.83654},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00612,"9":0,"10":0.01224,"11":0.04284,"12":0.1224,"13":2.46636,_:"0","3.1":0,"3.2":0,"5.1":0.00612,"6.1":0.00612,"7.1":0,"9.1":0.02448,"10.1":0.11016,"11.1":0.20196,"12.1":0.41004,"13.1":1.67688},I:{"3":0.00072,"4":0.00648,_:"81","2.1":0,"2.2":0.00216,"2.3":0.00072,"4.1":0.0144,"4.2-4.3":0.03024,"4.4":0,"4.4.3-4.4.4":0.20811},B:{"12":0.00612,"13":0.00612,"14":0.01224,"15":0.01224,"16":0.06732,"17":0.09792,"18":2.69892,_:"79 80 81"},P:{"4":0.11503,"5.0-5.4":0.01046,"6.2-6.4":0.01046,"7.2-7.4":0.04183,"8.2":0.01046,"9.2":0.08366,"10.1":0.24052,"11.1":4.1203},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01273,"9":0.00637,"10":0.0191,"11":1.38776,"5.5":0},N:{"10":0,"11":0.01552},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.20952},O:{"0":0.03492},Q:{"1.2":0.01164},S:{"2.5":0},H:{"0":0.09918},L:{"0":32.42392}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BF.js b/website/www/node_modules/caniuse-lite/data/regions/BF.js new file mode 100644 index 000000000000..8855b3754885 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0084,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.0028,"27":0.0028,"28":0.0028,"29":0.014,"30":0,"31":0,"32":0.0028,"33":0,"34":0.0028,"35":0,"36":0,"37":0.0028,"38":0,"39":0,"40":0.0028,"41":0,"42":0,"43":0.0028,"44":0,"45":0,"46":0,"47":0,"48":0.0028,"49":0.0336,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0028,"56":0,"57":0,"58":0.0028,"59":0,"60":0,"61":0,"62":0.0028,"63":0.0056,"64":0.0028,"65":0.0448,"66":0.0028,"67":0.1036,"68":0.0028,"69":0.0028,"70":0.0196,"71":0.0028,"72":0.0028,"73":0.0056,"74":0.0308,"75":0.0364,"76":0.014,"77":0.0196,"78":0.0308,"79":0.0728,"80":1.9936,"81":1.0808,"83":0.0028,"84":0.0028,_:"85"},C:{"2":0,"3":0.0028,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.0028,"21":0,"22":0,"23":0.0028,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0028,"37":0,"38":0,"39":0.0028,"40":0,"41":0.0028,"42":0,"43":0.0056,"44":0.0028,"45":0.0028,"46":0.0028,"47":0.014,"48":0.0168,"49":0.0028,"50":0.0028,"51":0,"52":0.0196,"53":0,"54":0,"55":0,"56":0.0112,"57":0.0028,"58":0,"59":0,"60":0.0028,"61":0,"62":0.0028,"63":0,"64":0.014,"65":0.0168,"66":0.0028,"67":0.0084,"68":0.1008,"69":0.0028,"70":0.0056,"71":0.0084,"72":0.0448,"73":0.0392,"74":0.7252,"75":0.9968,"76":0.0056,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.0028,"21":0,"22":0,"23":0.0056,"24":0,"25":0,"26":0,"27":0,"28":0.0056,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0056,"38":0.0028,"39":0,"40":0,"41":0,"42":0.0028,"43":0,"44":0,"45":0.0028,"46":0.0112,"47":0.0308,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.014,"54":0,"55":0,"56":0.0028,"57":0.0056,"58":0,"60":0,"62":0.0028,"63":0,"64":0,"65":0.0196,"66":0.0168,"67":0.364,"68":0.0028,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.014},G:{"8":0.00042,"3.2":0.00042,"4.0-4.1":0,"4.2-4.3":0.00083,"5.0-5.1":0.00417,"6.0-6.1":0.00125,"7.0-7.1":0.00417,"8.1-8.4":0.00584,"9.0-9.2":0.00501,"9.3":0.06008,"10.0-10.2":0.01544,"10.3":0.05299,"11.0-11.2":0.03421,"11.3-11.4":0.058,"12.0-12.1":0.07176,"12.2-12.4":0.47022,"13.0-13.1":0.10014,"13.2":0.04882,"13.3":2.73371,"13.4":0.50652},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0168,"12":0.0252,"13":0.2352,_:"0","3.1":0,"3.2":0,"5.1":0.0252,"6.1":0,"7.1":0,"9.1":0.0084,"10.1":0.07,"11.1":0.042,"12.1":0.0784,"13.1":0.1064},I:{"3":0.00259,"4":0.02331,_:"81","2.1":0,"2.2":0.00777,"2.3":0.00259,"4.1":0.05179,"4.2-4.3":0.10876,"4.4":0,"4.4.3-4.4.4":0.74839},B:{"12":0.0308,"13":0.0168,"14":0.0056,"15":0.0112,"16":0.014,"17":0.084,"18":0.224,_:"79 80 81"},P:{"4":0.35764,"5.0-5.4":0.04087,"6.2-6.4":0.03065,"7.2-7.4":0.16349,"8.2":0.02044,"9.2":0.16349,"10.1":0.38829,"11.1":0.85833},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0112,"9":0.0028,"10":0.0056,"11":0.1512,"5.5":0},N:{"10":0,"11":0.0432},J:{"7":0,"10":0.0432},R:{_:"0"},M:{"0":0.2088},O:{"0":3.0168},Q:{"1.2":0.0432},S:{"2.5":0.0072},H:{"0":4.05581},L:{"0":75.158}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BG.js b/website/www/node_modules/caniuse-lite/data/regions/BG.js new file mode 100644 index 000000000000..f9c44b0b876c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00526,"23":0,"24":0,"25":0,"26":0.00526,"27":0,"28":0,"29":0,"30":0,"31":0.00526,"32":0,"33":0,"34":0.00526,"35":0,"36":0.00526,"37":0,"38":0.01052,"39":0,"40":0.00526,"41":0.00526,"42":0.00526,"43":0.00526,"44":0,"45":0,"46":0,"47":0.00526,"48":0.00526,"49":0.52084,"50":0.00526,"51":0.00526,"52":0.00526,"53":0.01052,"54":0.00526,"55":0.00526,"56":0.00526,"57":0.00526,"58":0.02104,"59":0.00526,"60":0.00526,"61":0.04735,"62":0.01052,"63":0.04209,"64":0.00526,"65":0.01052,"66":0.01052,"67":0.02104,"68":0.07365,"69":0.03157,"70":0.08944,"71":0.05261,"72":0.04735,"73":0.05787,"74":0.03157,"75":0.04209,"76":0.04209,"77":0.05261,"78":0.06839,"79":0.12626,"80":11.20593,"81":5.39779,"83":0.02104,"84":0.00526,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00526,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00526,"39":0,"40":0.00526,"41":0,"42":0,"43":0.00526,"44":0,"45":0.01578,"46":0,"47":0.01052,"48":0.01052,"49":0.00526,"50":0.01578,"51":0.00526,"52":0.31566,"53":0,"54":0.00526,"55":0,"56":0.02104,"57":0.01052,"58":0.04735,"59":0.00526,"60":0.05261,"61":0.00526,"62":0.01052,"63":0.01578,"64":0.01052,"65":0.01578,"66":0.02631,"67":0.01052,"68":0.28936,"69":0.08944,"70":0.01052,"71":0.01578,"72":0.05787,"73":0.04209,"74":1.55726,"75":2.87777,"76":0.01578,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00526,"33":0,"34":0,"35":0,"36":0.01578,"37":0,"38":0,"39":0,"40":0.00526,"41":0,"42":0,"43":0,"44":0,"45":0.01578,"46":0,"47":0.00526,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00526,"57":0.00526,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00526,"66":0.00526,"67":0.9575,"68":0.01578,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02631},G:{"8":0.00091,"3.2":0.00091,"4.0-4.1":0,"4.2-4.3":0.00182,"5.0-5.1":0.00909,"6.0-6.1":0.00273,"7.0-7.1":0.00909,"8.1-8.4":0.01272,"9.0-9.2":0.01091,"9.3":0.13086,"10.0-10.2":0.03362,"10.3":0.11541,"11.0-11.2":0.07452,"11.3-11.4":0.12632,"12.0-12.1":0.15631,"12.2-12.4":1.02417,"13.0-13.1":0.2181,"13.2":0.10632,"13.3":5.95417,"13.4":1.10323},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00526,"12":0.01052,"13":0.28409,_:"0","3.1":0,"3.2":0,"5.1":0.00526,"6.1":0,"7.1":0,"9.1":0.00526,"10.1":0.01052,"11.1":0.03157,"12.1":0.04735,"13.1":0.24201},I:{"3":0.00152,"4":0.0137,_:"81","2.1":0,"2.2":0.00457,"2.3":0.00152,"4.1":0.03045,"4.2-4.3":0.06395,"4.4":0,"4.4.3-4.4.4":0.44006},B:{"12":0.00526,"13":0.00526,"14":0.01052,"15":0.01578,"16":0.01578,"17":0.04735,"18":0.69445,_:"79 80 81"},P:{"4":0.1243,"5.0-5.4":0.01036,"6.2-6.4":0,"7.2-7.4":0.04143,"8.2":0.01036,"9.2":0.11394,"10.1":0.24861,"11.1":2.51713},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01634,"9":0.01634,"10":0.00545,"11":0.73524,"5.5":0},N:{"10":0.00948,"11":0.02843},J:{"7":0,"10":0.00474},R:{_:"0"},M:{"0":0.1943},O:{"0":0.0853},Q:{"1.2":0.00474},S:{"2.5":0},H:{"0":0.22882},L:{"0":57.35276}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BH.js b/website/www/node_modules/caniuse-lite/data/regions/BH.js new file mode 100644 index 000000000000..2652f0eaea9d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00459,"32":0,"33":0.00459,"34":0,"35":0,"36":0,"37":0,"38":0.00917,"39":0,"40":0,"41":0,"42":0,"43":0.01376,"44":0,"45":0,"46":0,"47":0,"48":0.00459,"49":0.08715,"50":0,"51":0,"52":0,"53":0.00459,"54":0,"55":0,"56":0.00459,"57":0,"58":0.00459,"59":0.00459,"60":0,"61":0,"62":0.00459,"63":0.01835,"64":0,"65":0.04128,"66":0.00459,"67":0.02752,"68":0,"69":0.00917,"70":0.04587,"71":0.00917,"72":0.00917,"73":0.02294,"74":0.02752,"75":0.03211,"76":0.01835,"77":0.04587,"78":0.07798,"79":0.11468,"80":8.752,"81":4.54572,"83":0.02294,"84":0.00459,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01835,"49":0,"50":0,"51":0,"52":0.00917,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00459,"67":0.00459,"68":0.04128,"69":0.00459,"70":0.00459,"71":0.00459,"72":0.02752,"73":0.02294,"74":0.41742,"75":0.63301,"76":0.02752,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00459,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00917,"44":0,"45":0,"46":0.00459,"47":0.00917,"48":0,"49":0,"50":0,"51":0.00459,"52":0,"53":0,"54":0,"55":0,"56":0.00459,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00459,"65":0.01376,"66":0.00917,"67":0.06422,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00221,"3.2":0.00221,"4.0-4.1":0,"4.2-4.3":0.00442,"5.0-5.1":0.02212,"6.0-6.1":0.00664,"7.0-7.1":0.02212,"8.1-8.4":0.03097,"9.0-9.2":0.02654,"9.3":0.31851,"10.0-10.2":0.08184,"10.3":0.28091,"11.0-11.2":0.18138,"11.3-11.4":0.30745,"12.0-12.1":0.38045,"12.2-12.4":2.4928,"13.0-13.1":0.53085,"13.2":0.25879,"13.3":14.49232,"13.4":2.68524},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01835,"10":0.00459,"11":0.06422,"12":0.08257,"13":1.32106,_:"0","3.1":0,"3.2":0,"5.1":0.01376,"6.1":0,"7.1":0,"9.1":0.01376,"10.1":0.09633,"11.1":0.16055,"12.1":0.48164,"13.1":1.16051},I:{"3":0.00038,"4":0.00341,_:"81","2.1":0,"2.2":0.00114,"2.3":0.00038,"4.1":0.00758,"4.2-4.3":0.01592,"4.4":0,"4.4.3-4.4.4":0.10954},B:{"12":0.01376,"13":0.00917,"14":0.00917,"15":0.01376,"16":0.02294,"17":0.09633,"18":1.13758,_:"79 80 81"},P:{"4":0.33572,"5.0-5.4":0.04069,"6.2-6.4":0.01017,"7.2-7.4":0.11191,"8.2":0.11191,"9.2":0.27468,"10.1":0.59005,"11.1":3.41823},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01468,"9":0.00979,"10":0.00489,"11":0.3376,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.07578},O:{"0":4.0814},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.3536},L:{"0":43.15371}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BI.js b/website/www/node_modules/caniuse-lite/data/regions/BI.js new file mode 100644 index 000000000000..a8897764e58d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01423,"12":0,"13":0,"14":0,"15":0,"16":0.00474,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00474,"27":0,"28":0,"29":0,"30":0.00474,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00474,"39":0,"40":0.01423,"41":0,"42":0.00474,"43":0.02845,"44":0,"45":0,"46":0.00474,"47":0,"48":0.00474,"49":0.04268,"50":0,"51":0.00474,"52":0,"53":0,"54":0,"55":0.01423,"56":0,"57":0,"58":0.03319,"59":0,"60":0.00474,"61":0,"62":0,"63":0.07587,"64":0.00474,"65":0,"66":0,"67":0.00474,"68":0.00948,"69":0.21813,"70":0.00474,"71":0,"72":0.00948,"73":0.04268,"74":0.02371,"75":0.03319,"76":0.03319,"77":0.13752,"78":0.03319,"79":0.09484,"80":6.72416,"81":3.69402,"83":0.01423,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00474,"21":0,"22":0,"23":0.00474,"24":0.00948,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00474,"31":0.01423,"32":0,"33":0.00474,"34":0.00948,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00474,"41":0,"42":0,"43":0.01897,"44":0.00948,"45":0.01423,"46":0,"47":0.02845,"48":0.08061,"49":0.00474,"50":0.00474,"51":0.00948,"52":0.02371,"53":0,"54":0.00948,"55":0,"56":0.06165,"57":0,"58":0.00474,"59":0,"60":0.01423,"61":0.00474,"62":0,"63":0,"64":0.01897,"65":0.00474,"66":0,"67":0.00474,"68":0.08536,"69":0.00948,"70":0.03319,"71":0.00474,"72":0.06165,"73":0.04268,"74":1.13808,"75":2.1339,"76":0.36039,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00948,"15":0,"16":0,"17":0,"18":0,"19":0.00474,"20":0.00948,"21":0.00474,"22":0,"23":0.02371,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00474,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00474,"37":0,"38":0.01423,"39":0,"40":0,"41":0,"42":0.00948,"43":0,"44":0,"45":0,"46":0.01897,"47":0.02371,"48":0,"49":0,"50":0.00474,"51":0,"52":0,"53":0.00474,"54":0.00948,"55":0,"56":0.00474,"57":0.00474,"58":0.00474,"60":0,"62":0,"63":0.01423,"64":0.00474,"65":0.0569,"66":0.09958,"67":1.05272,"68":0.01897,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.03794},G:{"8":0.00039,"3.2":0.00039,"4.0-4.1":0,"4.2-4.3":0.00078,"5.0-5.1":0.00389,"6.0-6.1":0.00117,"7.0-7.1":0.00389,"8.1-8.4":0.00545,"9.0-9.2":0.00467,"9.3":0.05608,"10.0-10.2":0.01441,"10.3":0.04946,"11.0-11.2":0.03194,"11.3-11.4":0.05414,"12.0-12.1":0.06699,"12.2-12.4":0.43894,"13.0-13.1":0.09347,"13.2":0.04557,"13.3":2.55186,"13.4":0.47283},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.15649,"11":0.20865,"12":0.01897,"13":0.43626,_:"0","3.1":0,"3.2":0,"5.1":0.52162,"6.1":0,"7.1":0,"9.1":0.06639,"10.1":0.00948,"11.1":0.0569,"12.1":0.147,"13.1":0.16123},I:{"3":0.00095,"4":0.00859,_:"81","2.1":0,"2.2":0.00286,"2.3":0.00095,"4.1":0.01909,"4.2-4.3":0.04008,"4.4":0,"4.4.3-4.4.4":0.27582},B:{"12":0.10432,"13":0.0569,"14":0.01423,"15":0.06165,"16":0.02845,"17":0.07587,"18":0.92943,_:"79 80 81"},P:{"4":0.21371,"5.0-5.4":0.01018,"6.2-6.4":0.05088,"7.2-7.4":0.15265,"8.2":0.02035,"9.2":0.07124,"10.1":0.21371,"11.1":0.52919},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01931,"9":0,"10":0.01931,"11":0.22693,"5.5":0},N:{"10":0,"11":0.06835},J:{"7":0,"10":0.02629},R:{_:"0"},M:{"0":0.12093},O:{"0":3.67534},Q:{"1.2":0.00526},S:{"2.5":0},H:{"0":10.24957},L:{"0":51.59618}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BJ.js b/website/www/node_modules/caniuse-lite/data/regions/BJ.js new file mode 100644 index 000000000000..5862a124e210 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BJ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00524,"23":0,"24":0,"25":0,"26":0.00524,"27":0,"28":0.00524,"29":0,"30":0,"31":0,"32":0,"33":0.00524,"34":0,"35":0.01048,"36":0.03667,"37":0.33006,"38":0,"39":0.00524,"40":0.00524,"41":0,"42":0.00524,"43":0.01572,"44":0,"45":0,"46":0,"47":0.01572,"48":0.00524,"49":0.03143,"50":0.00524,"51":0.00524,"52":0.00524,"53":0,"54":0.00524,"55":0.00524,"56":0.00524,"57":0.00524,"58":0.01048,"59":0.00524,"60":0.01048,"61":0,"62":0.01572,"63":0.1205,"64":0.01572,"65":0.00524,"66":0.00524,"67":0.0262,"68":0.01572,"69":0.09954,"70":0.02096,"71":0.17813,"72":0.03143,"73":0.04191,"74":0.12574,"75":0.08382,"76":0.16241,"77":0.13098,"78":0.11002,"79":0.35625,"80":10.42037,"81":5.25996,"83":0.02096,"84":0.04715,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0.00524,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.02096,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00524,"32":0,"33":0,"34":0.00524,"35":0,"36":0,"37":0,"38":0,"39":0.00524,"40":0.01048,"41":0.00524,"42":0.00524,"43":0.02096,"44":0.00524,"45":0.00524,"46":0.00524,"47":0.01572,"48":0.02096,"49":0.00524,"50":0.01572,"51":0.01048,"52":0.02096,"53":0,"54":0.00524,"55":0.00524,"56":0.01048,"57":0.00524,"58":0,"59":0.0262,"60":0.01572,"61":0.00524,"62":0.01048,"63":0.00524,"64":0,"65":0.00524,"66":0.04191,"67":0.02096,"68":0.25147,"69":0.02096,"70":0.03143,"71":0.01048,"72":0.06811,"73":0.05763,"74":1.34118,"75":1.80222,"76":0.03667,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00524,"17":0,"18":0,"19":0,"20":0.01048,"21":0,"22":0,"23":0.06287,"24":0,"25":0,"26":0.01048,"27":0,"28":0.00524,"29":0,"30":0.00524,"31":0.00524,"32":0,"33":0,"34":0,"35":0,"36":0.00524,"37":0.00524,"38":0,"39":0,"40":0.00524,"41":0,"42":0.01048,"43":0,"44":0.00524,"45":0.01048,"46":0.0262,"47":0.03667,"48":0,"49":0,"50":0.03667,"51":0,"52":0.0262,"53":0.00524,"54":0,"55":0,"56":0,"57":0.01048,"58":0.01048,"60":0.00524,"62":0.04191,"63":0,"64":0.00524,"65":0.03143,"66":0.03143,"67":1.22593,"68":0.01048,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.03143},G:{"8":0.00054,"3.2":0.00054,"4.0-4.1":0,"4.2-4.3":0.00108,"5.0-5.1":0.0054,"6.0-6.1":0.00162,"7.0-7.1":0.0054,"8.1-8.4":0.00756,"9.0-9.2":0.00648,"9.3":0.07774,"10.0-10.2":0.01997,"10.3":0.06856,"11.0-11.2":0.04427,"11.3-11.4":0.07504,"12.0-12.1":0.09286,"12.2-12.4":0.60842,"13.0-13.1":0.12957,"13.2":0.06316,"13.3":3.53713,"13.4":0.65538},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0262,"12":0.06287,"13":0.38245,_:"0","3.1":0,"3.2":0,"5.1":0.15717,"6.1":0,"7.1":0,"9.1":0.0262,"10.1":0.00524,"11.1":0.06287,"12.1":0.1886,"13.1":0.57629},I:{"3":0.00085,"4":0.00762,_:"81","2.1":0,"2.2":0.00254,"2.3":0.00085,"4.1":0.01693,"4.2-4.3":0.03556,"4.4":0,"4.4.3-4.4.4":0.2447},B:{"12":0.06811,"13":0.0262,"14":0.01572,"15":0.01048,"16":0.00524,"17":0.05763,"18":0.51866,_:"79 80 81"},P:{"4":0.15858,"5.0-5.4":0.02114,"6.2-6.4":0,"7.2-7.4":0.02114,"8.2":0.03172,"9.2":0.11629,"10.1":0.09515,"11.1":0.27488},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.09849,"9":0.01094,"10":0.03283,"11":0.3502,"5.5":0},N:{"10":0,"11":0.09998},J:{"7":0,"10":0.02381},R:{_:"0"},M:{"0":0.1714},O:{"0":2.09484},Q:{"1.2":0.00952},S:{"2.5":0.01428},H:{"0":3.90341},L:{"0":56.79691}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BM.js b/website/www/node_modules/caniuse-lite/data/regions/BM.js new file mode 100644 index 000000000000..a997e1746d20 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00873,"22":0.00873,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.23566,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00873,"58":0,"59":0.00873,"60":0.00873,"61":0.02618,"62":0,"63":0.02618,"64":0,"65":0.11346,"66":0.05237,"67":0.10474,"68":0.08728,"69":0.03491,"70":0.10474,"71":0.02618,"72":0.00873,"73":0.34039,"74":0.04364,"75":0.11346,"76":0.18329,"77":0.64587,"78":0.44513,"79":0.38403,"80":19.88238,"81":9.8801,"83":0.03491,"84":0.01746,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00873,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.02618,"49":0,"50":0,"51":0,"52":0.09601,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00873,"61":0,"62":0,"63":0,"64":0.00873,"65":0.01746,"66":0,"67":0.00873,"68":0.09601,"69":0,"70":0.00873,"71":0.00873,"72":0.10474,"73":0.04364,"74":0.94262,"75":1.44012,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01746,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.1571,"68":0.00873,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0019,"3.2":0.0019,"4.0-4.1":0,"4.2-4.3":0.00379,"5.0-5.1":0.01897,"6.0-6.1":0.00569,"7.0-7.1":0.01897,"8.1-8.4":0.02655,"9.0-9.2":0.02276,"9.3":0.27312,"10.0-10.2":0.07018,"10.3":0.24087,"11.0-11.2":0.15553,"11.3-11.4":0.26363,"12.0-12.1":0.32622,"12.2-12.4":2.13752,"13.0-13.1":0.4552,"13.2":0.22191,"13.3":12.42684,"13.4":2.30253},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01746,"10":0.02618,"11":0.08728,"12":0.13092,"13":12.52468,_:"0","3.1":0,"3.2":0,"5.1":0.00873,"6.1":0.02618,"7.1":0.03491,"9.1":0.11346,"10.1":0.29675,"11.1":0.67206,"12.1":0.76806,"13.1":4.43382},I:{"3":0.00133,"4":0.01197,_:"81","2.1":0,"2.2":0.00399,"2.3":0.00133,"4.1":0.02659,"4.2-4.3":0.05584,"4.4":0,"4.4.3-4.4.4":0.38425},B:{"12":0.01746,"13":0.01746,"14":0.04364,"15":0.10474,"16":0.18329,"17":0.30548,"18":8.16068,_:"79 80 81"},P:{"4":0.0331,"5.0-5.4":0.01103,"6.2-6.4":0.01103,"7.2-7.4":0.01103,"8.2":0.01103,"9.2":0.04413,"10.1":0.15447,"11.1":1.68813},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00873,"10":0,"11":4.46001,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.01654},R:{_:"0"},M:{"0":0.06233},O:{"0":0.00254},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.00602},L:{"0":7.61354}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BN.js b/website/www/node_modules/caniuse-lite/data/regions/BN.js new file mode 100644 index 000000000000..e4264d7e0d84 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00514,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00514,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01028,"35":0,"36":0,"37":0,"38":0.03085,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.24677,"50":0.00514,"51":0,"52":0,"53":0.02056,"54":0,"55":0.02056,"56":0.01542,"57":0.00514,"58":0.01542,"59":0.00514,"60":0.00514,"61":0.00514,"62":0.00514,"63":0.01028,"64":0.00514,"65":0.02056,"66":0.01028,"67":0.10796,"68":0.00514,"69":0.03085,"70":0.02056,"71":0.01542,"72":0.02056,"73":0.08226,"74":0.03085,"75":0.04627,"76":0.06683,"77":0.05141,"78":0.07712,"79":0.17994,"80":11.72662,"81":5.2284,"83":0.03085,"84":0.00514,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00514,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00514,"33":0.00514,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00514,"44":0,"45":0.01028,"46":0.00514,"47":0.00514,"48":0.02056,"49":0.00514,"50":0,"51":0,"52":0.07712,"53":0,"54":0.00514,"55":0,"56":0.00514,"57":0.00514,"58":0,"59":0,"60":0.00514,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01028,"67":0.00514,"68":0.13367,"69":0.00514,"70":0.01542,"71":0.00514,"72":0.05655,"73":0.03599,"74":0.62206,"75":1.09503,"76":0.07712,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00514,"35":0,"36":0.00514,"37":0.03085,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01028,"47":0.02571,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00514,"54":0,"55":0,"56":0.01542,"57":0.00514,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00514,"66":0.00514,"67":0.50896,"68":0.01028,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00514},G:{"8":0.00179,"3.2":0.00179,"4.0-4.1":0,"4.2-4.3":0.00358,"5.0-5.1":0.0179,"6.0-6.1":0.00537,"7.0-7.1":0.0179,"8.1-8.4":0.02506,"9.0-9.2":0.02148,"9.3":0.25771,"10.0-10.2":0.06622,"10.3":0.22729,"11.0-11.2":0.14675,"11.3-11.4":0.24877,"12.0-12.1":0.30783,"12.2-12.4":2.01698,"13.0-13.1":0.42952,"13.2":0.20939,"13.3":11.72603,"13.4":2.17268},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00514,"9":0.01028,"10":0.03085,"11":0.03085,"12":0.07712,"13":1.21842,_:"0","3.1":0,"3.2":0,"5.1":0.03599,"6.1":0,"7.1":0,"9.1":0.04627,"10.1":0.07197,"11.1":0.14909,"12.1":0.42156,"13.1":0.59636},I:{"3":0.00091,"4":0.00823,_:"81","2.1":0,"2.2":0.00274,"2.3":0.00091,"4.1":0.01829,"4.2-4.3":0.0384,"4.4":0,"4.4.3-4.4.4":0.26424},B:{"12":0.00514,"13":0.00514,"14":0.00514,"15":0.01028,"16":0.05655,"17":0.05655,"18":0.62206,_:"79 80 81"},P:{"4":0.50456,"5.0-5.4":0.01051,"6.2-6.4":0.02102,"7.2-7.4":0.06307,"8.2":0.03153,"9.2":0.22074,"10.1":0.38893,"11.1":1.91312},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01116,"9":0.02231,"10":0.01116,"11":0.5466,"5.5":0},N:{"10":0,"11":0.01944},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.19922},O:{"0":1.89015},Q:{"1.2":0.02915},S:{"2.5":0},H:{"0":1.99188},L:{"0":45.27752}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BO.js b/website/www/node_modules/caniuse-lite/data/regions/BO.js new file mode 100644 index 000000000000..b15a6bb4e93b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00928,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00464,"23":0,"24":0,"25":0,"26":0.00464,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00928,"35":0,"36":0.00464,"37":0,"38":0.01857,"39":0,"40":0.00464,"41":0,"42":0,"43":0,"44":0.00464,"45":0,"46":0,"47":0.00464,"48":0,"49":0.13926,"50":0.00464,"51":0,"52":0,"53":0.01857,"54":0,"55":0.00464,"56":0.00464,"57":0.00464,"58":0.00928,"59":0.00464,"60":0.00464,"61":0.00464,"62":0.01857,"63":0.02321,"64":0.00464,"65":0.03714,"66":0.00928,"67":0.02785,"68":0.00928,"69":0.01393,"70":0.02785,"71":0.03714,"72":0.02785,"73":0.04642,"74":0.04178,"75":0.04642,"76":0.06035,"77":0.04178,"78":0.0557,"79":0.12069,"80":9.36756,"81":5.44507,"83":0.00464,"84":0.00464,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00464,"48":0.01857,"49":0,"50":0,"51":0,"52":0.02785,"53":0,"54":0,"55":0,"56":0.00928,"57":0.00464,"58":0.00464,"59":0,"60":0.00464,"61":0,"62":0.00464,"63":0.00464,"64":0.00464,"65":0.00928,"66":0.00464,"67":0.01857,"68":0.16247,"69":0.01857,"70":0.00928,"71":0.00464,"72":0.02321,"73":0.01393,"74":0.6081,"75":1.1048,"76":0.01857,"77":0.00464,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00464,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00464,"47":0.00928,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00464,"54":0,"55":0,"56":0,"57":0.00464,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00464,"66":0.00464,"67":0.59882,"68":0.01393,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00464},G:{"8":0.00043,"3.2":0.00043,"4.0-4.1":0,"4.2-4.3":0.00085,"5.0-5.1":0.00425,"6.0-6.1":0.00128,"7.0-7.1":0.00425,"8.1-8.4":0.00595,"9.0-9.2":0.0051,"9.3":0.06122,"10.0-10.2":0.01573,"10.3":0.054,"11.0-11.2":0.03486,"11.3-11.4":0.0591,"12.0-12.1":0.07313,"12.2-12.4":0.47916,"13.0-13.1":0.10204,"13.2":0.04974,"13.3":2.78568,"13.4":0.51615},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01393,"12":0.04642,"13":0.26924,_:"0","3.1":0,"3.2":0,"5.1":0.89126,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02785,"11.1":0.06963,"12.1":0.09748,"13.1":0.376},I:{"3":0.001,"4":0.00904,_:"81","2.1":0,"2.2":0.00301,"2.3":0.001,"4.1":0.0201,"4.2-4.3":0.04221,"4.4":0,"4.4.3-4.4.4":0.29042},B:{"12":0.02785,"13":0.00464,"14":0.00464,"15":0.00464,"16":0.00464,"17":0.01857,"18":0.26459,_:"79 80 81"},P:{"4":0.76176,"5.0-5.4":0.03047,"6.2-6.4":0.06094,"7.2-7.4":0.28439,"8.2":0.06094,"9.2":0.34533,"10.1":0.50784,"11.1":2.13293},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01537,"9":0.00512,"10":0.00512,"11":0.12293,"5.5":0},N:{"10":0.0125,"11":0.025},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2679},O:{"0":0.33755},Q:{"1.2":0.00536},S:{"2.5":0},H:{"0":0.38045},L:{"0":66.70689}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BR.js b/website/www/node_modules/caniuse-lite/data/regions/BR.js new file mode 100644 index 000000000000..70b5f6116b1a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01658,"37":0,"38":0.00553,"39":0,"40":0,"41":0.01658,"42":0,"43":0.00553,"44":0,"45":0,"46":0,"47":0,"48":0.00553,"49":0.16028,"50":0,"51":0.00553,"52":0,"53":0.01105,"54":0.01105,"55":0.00553,"56":0.00553,"57":0,"58":0.01658,"59":0.00553,"60":0,"61":0.02211,"62":0.00553,"63":0.02764,"64":0.00553,"65":0.01658,"66":0.01105,"67":0.02211,"68":0.00553,"69":0.02211,"70":0.07185,"71":0.09396,"72":0.07738,"73":0.05527,"74":0.03869,"75":0.04422,"76":0.03869,"77":0.04422,"78":0.11054,"79":0.16581,"80":15.40375,"81":8.75477,"83":0.04974,"84":0.01658,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00553,"48":0.00553,"49":0,"50":0.00553,"51":0,"52":0.01658,"53":0,"54":0,"55":0,"56":0.00553,"57":0,"58":0.00553,"59":0,"60":0.00553,"61":0.00553,"62":0.00553,"63":0.01105,"64":0.01105,"65":0.01105,"66":0.01105,"67":0.00553,"68":0.08291,"69":0.00553,"70":0.00553,"71":0.00553,"72":0.02211,"73":0.01105,"74":0.56375,"75":0.89537,"76":0.01105,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00553,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00553,"58":0.00553,"60":0,"62":0,"63":0,"64":0,"65":0.00553,"66":0.00553,"67":0.93959,"68":0.02211,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00072,"3.2":0.00072,"4.0-4.1":0,"4.2-4.3":0.00144,"5.0-5.1":0.00722,"6.0-6.1":0.00217,"7.0-7.1":0.00722,"8.1-8.4":0.01011,"9.0-9.2":0.00866,"9.3":0.10398,"10.0-10.2":0.02672,"10.3":0.0917,"11.0-11.2":0.05921,"11.3-11.4":0.10037,"12.0-12.1":0.1242,"12.2-12.4":0.81378,"13.0-13.1":0.1733,"13.2":0.08448,"13.3":4.73102,"13.4":0.8766},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00553,"12":0.02211,"13":0.35373,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01658,"11.1":0.03869,"12.1":0.07738,"13.1":0.38136},I:{"3":0.00081,"4":0.00729,_:"81","2.1":0,"2.2":0.00243,"2.3":0.00081,"4.1":0.01621,"4.2-4.3":0.03404,"4.4":0,"4.4.3-4.4.4":0.2342},B:{"12":0.00553,"13":0,"14":0.00553,"15":0.00553,"16":0.00553,"17":0.02211,"18":0.4919,_:"79 80 81"},P:{"4":0.12216,"5.0-5.4":0,"6.2-6.4":0.01018,"7.2-7.4":0.13234,"8.2":0.01018,"9.2":0.08144,"10.1":0.17306,"11.1":1.83239},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02345,"9":0.00586,"10":0.00586,"11":0.15827,"5.5":0},N:{"10":0,"11":0.02684},J:{"7":0,"10":0.00447},R:{_:"0"},M:{"0":0.08946},O:{"0":0.11183},Q:{"1.2":0.00447},S:{"2.5":0},H:{"0":0.10587},L:{"0":57.9021}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BS.js b/website/www/node_modules/caniuse-lite/data/regions/BS.js new file mode 100644 index 000000000000..cd5592d04483 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0119,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.06347,"50":0,"51":0,"52":0,"53":0.0119,"54":0,"55":0.00397,"56":0,"57":0,"58":0.00397,"59":0,"60":0,"61":0,"62":0.00397,"63":0.0119,"64":0.00397,"65":0.01587,"66":0.00793,"67":0.01587,"68":0,"69":0.03967,"70":0.00397,"71":0.01587,"72":0.00793,"73":0.00397,"74":0.0119,"75":0.04364,"76":0.06347,"77":0.0357,"78":0.0476,"79":0.09521,"80":5.07776,"81":2.3326,"83":0.00793,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00397,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01984,"49":0,"50":0,"51":0,"52":0.00397,"53":0.00397,"54":0,"55":0,"56":0.00397,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.04364,"69":0,"70":0,"71":0.00793,"72":0.00793,"73":0.00793,"74":0.25389,"75":0.3729,"76":0.00397,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.09918,"68":0.00397,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00266,"3.2":0.00266,"4.0-4.1":0,"4.2-4.3":0.00531,"5.0-5.1":0.02657,"6.0-6.1":0.00797,"7.0-7.1":0.02657,"8.1-8.4":0.0372,"9.0-9.2":0.03189,"9.3":0.38268,"10.0-10.2":0.09833,"10.3":0.3375,"11.0-11.2":0.21791,"11.3-11.4":0.36939,"12.0-12.1":0.45709,"12.2-12.4":2.995,"13.0-13.1":0.6378,"13.2":0.31093,"13.3":17.4119,"13.4":3.2262},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00397,"9":0,"10":0.00793,"11":0.00397,"12":0.05157,"13":1.44399,_:"0","3.1":0,"3.2":0,"5.1":0.0119,"6.1":0.00397,"7.1":0,"9.1":0.01587,"10.1":0.0357,"11.1":0.06744,"12.1":0.13488,"13.1":0.70216},I:{"3":0.00205,"4":0.01841,_:"81","2.1":0,"2.2":0.00614,"2.3":0.00205,"4.1":0.04091,"4.2-4.3":0.08591,"4.4":0,"4.4.3-4.4.4":0.59116},B:{"12":0.00397,"13":0.02777,"14":0.0119,"15":0.0476,"16":0.04364,"17":0.10314,"18":1.90019,_:"79 80 81"},P:{"4":0.20267,"5.0-5.4":0.02133,"6.2-6.4":0.02133,"7.2-7.4":0.44801,"8.2":0.02133,"9.2":0.55467,"10.1":0.76801,"11.1":6.51743},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00426,"10":0.00426,"11":0.45959,"5.5":0},N:{"10":0,"11":0.01207},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13273},O:{"0":0.01207},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.03427},L:{"0":46.3864}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BT.js b/website/www/node_modules/caniuse-lite/data/regions/BT.js new file mode 100644 index 000000000000..7f88b84f99c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0.0034,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.01019,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.01019,"30":0.0034,"31":0.0034,"32":0,"33":0,"34":0,"35":0,"36":0.0068,"37":0,"38":0,"39":0,"40":0.02039,"41":0,"42":0,"43":0.0034,"44":0,"45":0,"46":0.0034,"47":0,"48":0,"49":0.03738,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.01019,"56":0,"57":0,"58":0.0034,"59":0.0034,"60":0.01019,"61":0,"62":0.04757,"63":0.01019,"64":0,"65":0.0068,"66":0.0034,"67":0.0068,"68":0.01359,"69":0.04417,"70":0.0068,"71":0.0068,"72":0.0068,"73":0.01019,"74":0.01699,"75":0.06796,"76":0.01019,"77":0.03058,"78":0.01699,"79":0.08495,"80":5.65767,"81":2.64704,"83":0.02379,"84":0.0068,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.0034,"31":0,"32":0,"33":0,"34":0,"35":0.0034,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.0034,"44":0,"45":0.0068,"46":0,"47":0.0034,"48":0,"49":0,"50":0,"51":0,"52":0.0068,"53":0,"54":0,"55":0,"56":0.0034,"57":0,"58":0,"59":0,"60":0.0034,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01699,"69":0.0068,"70":0,"71":0,"72":0.01359,"73":0.02039,"74":0.15971,"75":0.40096,"76":0.04078,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01019,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0034,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.0034,"66":0.0034,"67":0.12573,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00089,"3.2":0.00089,"4.0-4.1":0,"4.2-4.3":0.00179,"5.0-5.1":0.00895,"6.0-6.1":0.00268,"7.0-7.1":0.00895,"8.1-8.4":0.01252,"9.0-9.2":0.01073,"9.3":0.12882,"10.0-10.2":0.0331,"10.3":0.11361,"11.0-11.2":0.07336,"11.3-11.4":0.12435,"12.0-12.1":0.15387,"12.2-12.4":1.00819,"13.0-13.1":0.2147,"13.2":0.10467,"13.3":5.86126,"13.4":1.08601},E:{"4":0,"5":0,"6":0.0034,"7":0,"8":0,"9":0,"10":0,"11":0.0068,"12":0.01699,"13":0.26844,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0034,"10.1":0.0068,"11.1":0.04417,"12.1":0.03058,"13.1":0.19369},I:{"3":0.00026,"4":0.0023,_:"81","2.1":0,"2.2":0.00077,"2.3":0.00026,"4.1":0.00512,"4.2-4.3":0.01075,"4.4":0,"4.4.3-4.4.4":0.07395},B:{"12":0.01359,"13":0.07476,"14":0.01359,"15":0.01359,"16":0.02039,"17":0.02718,"18":0.49271,_:"79 80 81"},P:{"4":1.30023,"5.0-5.4":0.06095,"6.2-6.4":0.07111,"7.2-7.4":0.57901,"8.2":0.08126,"9.2":0.58916,"10.1":0.69074,"11.1":1.36117},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04078,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.03961},O:{"0":3.41323},Q:{"1.2":0.0132},S:{"2.5":0},H:{"0":0.38127},L:{"0":68.05666}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BW.js b/website/www/node_modules/caniuse-lite/data/regions/BW.js new file mode 100644 index 000000000000..7d3a0675c91f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00484,"30":0.00484,"31":0.01452,"32":0,"33":0.00484,"34":0,"35":0,"36":0.00968,"37":0,"38":0,"39":0.00968,"40":0.02904,"41":0,"42":0,"43":0.0242,"44":0,"45":0,"46":0.00968,"47":0,"48":0,"49":0.19844,"50":0.00484,"51":0.00484,"52":0,"53":0.00968,"54":0,"55":0,"56":0.00484,"57":0.00484,"58":0.01936,"59":0.00484,"60":0.01452,"61":0,"62":0.00484,"63":0.07744,"64":0.00484,"65":0.17908,"66":0.01452,"67":0.04356,"68":0.01452,"69":0.03388,"70":0.0242,"71":0.02904,"72":0.01936,"73":0.05808,"74":0.10648,"75":0.03388,"76":0.13068,"77":0.11616,"78":0.121,"79":0.32912,"80":7.78272,"81":4.11884,"83":0.0242,"84":0.00968,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.00484,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00968,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00484,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.01452,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00484,"39":0.00484,"40":0.00484,"41":0,"42":0,"43":0.00968,"44":0.00968,"45":0.00484,"46":0,"47":0.02904,"48":0.00968,"49":0.00484,"50":0.00484,"51":0,"52":0.01452,"53":0,"54":0,"55":0,"56":0.00968,"57":0.00484,"58":0,"59":0,"60":0.00968,"61":0.00968,"62":0,"63":0,"64":0.00484,"65":0,"66":0,"67":0.00484,"68":0.11132,"69":0.00484,"70":0.00968,"71":0.00968,"72":0.04356,"73":0.01936,"74":0.75988,"75":1.29228,"76":0.0726,"77":0.00484,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00484,"18":0,"19":0,"20":0,"21":0,"22":0.00484,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00484,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00484,"43":0,"44":0.00484,"45":0,"46":0.00968,"47":0.00968,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00484,"55":0,"56":0.00484,"57":0,"58":0,"60":0,"62":0.00484,"63":0.00484,"64":0.00968,"65":0.0242,"66":0.03388,"67":0.60984,"68":0.0242,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00484},G:{"8":0.00082,"3.2":0.00082,"4.0-4.1":0,"4.2-4.3":0.00163,"5.0-5.1":0.00816,"6.0-6.1":0.00245,"7.0-7.1":0.00816,"8.1-8.4":0.01143,"9.0-9.2":0.00979,"9.3":0.11753,"10.0-10.2":0.0302,"10.3":0.10365,"11.0-11.2":0.06692,"11.3-11.4":0.11345,"12.0-12.1":0.14038,"12.2-12.4":0.91981,"13.0-13.1":0.19588,"13.2":0.09549,"13.3":5.34744,"13.4":0.99081},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00484,"10":0.01936,"11":0.03388,"12":0.0242,"13":0.5082,_:"0","3.1":0,"3.2":0,"5.1":0.12584,"6.1":0,"7.1":0,"9.1":0.00484,"10.1":0.06292,"11.1":0.04356,"12.1":0.12584,"13.1":0.30492},I:{"3":0.00166,"4":0.01497,_:"81","2.1":0,"2.2":0.00499,"2.3":0.00166,"4.1":0.03326,"4.2-4.3":0.06986,"4.4":0,"4.4.3-4.4.4":0.48067},B:{"12":0.05808,"13":0.07744,"14":0.05324,"15":0.05808,"16":0.08228,"17":0.26136,"18":1.26324,_:"79 80 81"},P:{"4":0.38501,"5.0-5.4":0,"6.2-6.4":0.01041,"7.2-7.4":0.32258,"8.2":0.06243,"9.2":0.1873,"10.1":0.47867,"11.1":2.31008},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01049,"9":0.01049,"10":0.03146,"11":1.20597,"5.5":0},N:{"10":0.01106,"11":0.06634},J:{"7":0,"10":0.35604},R:{_:"0"},M:{"0":0.21672},O:{"0":1.85244},Q:{"1.2":0.11352},S:{"2.5":0.01548},H:{"0":0.67415},L:{"0":58.72864}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BY.js b/website/www/node_modules/caniuse-lite/data/regions/BY.js new file mode 100644 index 000000000000..09191422488e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00708,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00708,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.02125,"37":0.00708,"38":0.00708,"39":0,"40":0.00708,"41":0,"42":0.02125,"43":0.00708,"44":0,"45":0.00708,"46":0,"47":0,"48":0.00708,"49":0.55247,"50":0,"51":0.01417,"52":0,"53":0.01417,"54":0,"55":0.00708,"56":0.02125,"57":0.01417,"58":0.01417,"59":0.02125,"60":0.00708,"61":0.07791,"62":0.01417,"63":0.02125,"64":0.02125,"65":0.0425,"66":0.02125,"67":0.02833,"68":0.04958,"69":0.0425,"70":0.14166,"71":0.11333,"72":0.12749,"73":0.16999,"74":0.06375,"75":0.07791,"76":0.11333,"77":0.085,"78":0.14874,"79":0.31165,"80":20.90902,"81":9.23623,"83":0.02833,"84":0.02125,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00708,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00708,"39":0,"40":0,"41":0,"42":0.00708,"43":0,"44":0,"45":0.00708,"46":0,"47":0.00708,"48":0.00708,"49":0,"50":0.01417,"51":0.04958,"52":0.11333,"53":0.00708,"54":0.0425,"55":0.00708,"56":0.01417,"57":0.01417,"58":0.02125,"59":0.00708,"60":0.01417,"61":0.00708,"62":0.00708,"63":0.01417,"64":0.02125,"65":0.00708,"66":0.02833,"67":0.00708,"68":0.13458,"69":0.30457,"70":0.00708,"71":0.01417,"72":0.04958,"73":0.12041,"74":0.93496,"75":1.32452,"76":0.02833,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.15583,"37":0.01417,"38":0.00708,"39":0,"40":0,"41":0,"42":0.00708,"43":0.00708,"44":0,"45":0.00708,"46":0.00708,"47":0.02125,"48":0.00708,"49":0.00708,"50":0,"51":0,"52":0.00708,"53":0.00708,"54":0,"55":0.02125,"56":0.04958,"57":0.01417,"58":0.02833,"60":0.01417,"62":0.02125,"63":0.01417,"64":0.00708,"65":0.03542,"66":0.04958,"67":5.49641,"68":0.11333,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.03542},G:{"8":0.00065,"3.2":0.00065,"4.0-4.1":0,"4.2-4.3":0.00129,"5.0-5.1":0.00646,"6.0-6.1":0.00194,"7.0-7.1":0.00646,"8.1-8.4":0.00904,"9.0-9.2":0.00775,"9.3":0.093,"10.0-10.2":0.02389,"10.3":0.08202,"11.0-11.2":0.05296,"11.3-11.4":0.08977,"12.0-12.1":0.11108,"12.2-12.4":0.72783,"13.0-13.1":0.15499,"13.2":0.07556,"13.3":4.23134,"13.4":0.78401},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00708,"9":0,"10":0,"11":0.00708,"12":0.14166,"13":1.16161,_:"0","3.1":0,"3.2":0,"5.1":0.04958,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02833,"11.1":0.03542,"12.1":0.2904,"13.1":0.70122},I:{"3":0.0008,"4":0.00723,_:"81","2.1":0,"2.2":0.00241,"2.3":0.0008,"4.1":0.01607,"4.2-4.3":0.03375,"4.4":0,"4.4.3-4.4.4":0.23226},B:{"12":0,"13":0.00708,"14":0.02125,"15":0.01417,"16":0.00708,"17":0.02833,"18":0.46748,_:"79 80 81"},P:{"4":0.09194,"5.0-5.4":0,"6.2-6.4":0.08172,"7.2-7.4":0.02043,"8.2":0.01022,"9.2":0.08172,"10.1":0.11237,"11.1":2.26775},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.07437,"9":0.01653,"10":0.00826,"11":0.24791,"5.5":0},N:{"10":0.01167,"11":0.035},J:{"7":0,"10":0.01167},R:{_:"0"},M:{"0":0.07293},O:{"0":0.22461},Q:{"1.2":0.1371},S:{"2.5":0},H:{"0":0.77326},L:{"0":35.26333}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/BZ.js b/website/www/node_modules/caniuse-lite/data/regions/BZ.js new file mode 100644 index 000000000000..7068c1a071ee --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/BZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00479,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01438,"37":0,"38":0.00479,"39":0,"40":0.26362,"41":0,"42":0.0719,"43":0.00479,"44":0.00479,"45":0,"46":0,"47":0,"48":0,"49":0.22048,"50":0.00479,"51":0,"52":0,"53":0.01438,"54":0,"55":0.00479,"56":0.00479,"57":0,"58":0,"59":0,"60":0.01438,"61":0.00479,"62":0.00479,"63":0.00959,"64":0,"65":0.01917,"66":0,"67":0.02876,"68":0.00959,"69":0.01438,"70":0.00959,"71":0.02876,"72":0.02876,"73":1.20784,"74":0.03834,"75":0.10545,"76":0.02876,"77":0.11503,"78":0.02397,"79":0.07669,"80":6.56162,"81":3.61392,"83":0.01917,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00959,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00479,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00959,"39":0,"40":0,"41":0,"42":0.00479,"43":0,"44":0,"45":0.08627,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.05272,"53":0,"54":0,"55":0,"56":0.00479,"57":0.00959,"58":0,"59":0,"60":0.14379,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00479,"67":0.02876,"68":2.30064,"69":0.04793,"70":0.00959,"71":0.00479,"72":0.0719,"73":0.02397,"74":0.60392,"75":1.15032,"76":0.0671,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00959,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00479,"67":0.29717,"68":0.00959,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00165,"3.2":0.00165,"4.0-4.1":0,"4.2-4.3":0.00329,"5.0-5.1":0.01646,"6.0-6.1":0.00494,"7.0-7.1":0.01646,"8.1-8.4":0.02305,"9.0-9.2":0.01975,"9.3":0.23705,"10.0-10.2":0.06091,"10.3":0.20907,"11.0-11.2":0.13499,"11.3-11.4":0.22882,"12.0-12.1":0.28315,"12.2-12.4":1.85526,"13.0-13.1":0.39509,"13.2":0.19261,"13.3":10.78589,"13.4":1.99848},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01917,"12":0.00959,"13":0.8915,_:"0","3.1":0,"3.2":0,"5.1":0.10545,"6.1":0,"7.1":0,"9.1":0.00479,"10.1":0.05272,"11.1":0.07669,"12.1":0.08627,"13.1":0.33551},I:{"3":0.00453,"4":0.04075,_:"81","2.1":0,"2.2":0.01358,"2.3":0.00453,"4.1":0.09055,"4.2-4.3":0.19015,"4.4":0,"4.4.3-4.4.4":1.30838},B:{"12":0.08627,"13":0.00479,"14":0.01917,"15":0.00959,"16":0.01438,"17":0.06231,"18":1.24618,_:"79 80 81"},P:{"4":0.42047,"5.0-5.4":0.01078,"6.2-6.4":0.01078,"7.2-7.4":0.37734,"8.2":0.1725,"9.2":0.11859,"10.1":0.20484,"11.1":2.96484},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00495,"11":0.14363,"5.5":0},N:{"10":0.01822,"11":0.01822},J:{"7":0,"10":0.01041},R:{_:"0"},M:{"0":0.41656},O:{"0":0.41135},Q:{"1.2":0.00521},S:{"2.5":0.00521},H:{"0":0.0838},L:{"0":53.30097}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CA.js b/website/www/node_modules/caniuse-lite/data/regions/CA.js new file mode 100644 index 000000000000..1e0930a134a4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.01097,"26":0.00548,"27":0,"28":0,"29":0.00548,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00548,"36":0,"37":0,"38":0.00548,"39":0,"40":0.01097,"41":0.00548,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00548,"49":0.21936,"50":0,"51":0.00548,"52":0,"53":0.01097,"54":0,"55":0.00548,"56":0.00548,"57":0.01097,"58":0.01097,"59":0.01097,"60":0.00548,"61":0.02194,"62":0.00548,"63":0.01645,"64":0.01097,"65":0.02742,"66":0.01645,"67":0.04936,"68":0.01645,"69":0.0329,"70":0.10968,"71":0.04387,"72":0.04936,"73":0.07129,"74":0.04387,"75":0.08774,"76":0.07678,"77":0.08774,"78":0.12065,"79":0.31259,"80":10.27702,"81":4.9356,"83":0.01645,"84":0.00548,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00548,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00548,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00548,"46":0,"47":0.00548,"48":0.02194,"49":0,"50":0.00548,"51":0,"52":0.05484,"53":0,"54":0.00548,"55":0,"56":0.00548,"57":0,"58":0.01097,"59":0,"60":0.01097,"61":0,"62":0.00548,"63":0.07129,"64":0.00548,"65":0.01097,"66":0.01097,"67":0.01097,"68":0.17,"69":0.00548,"70":0.01097,"71":0.01097,"72":0.03839,"73":0.02742,"74":0.73486,"75":1.30519,"76":0.01097,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00548,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00548,"67":0.22484,"68":0.00548,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00364,"3.2":0.00364,"4.0-4.1":0,"4.2-4.3":0.00728,"5.0-5.1":0.03641,"6.0-6.1":0.01092,"7.0-7.1":0.03641,"8.1-8.4":0.05097,"9.0-9.2":0.04369,"9.3":0.52423,"10.0-10.2":0.1347,"10.3":0.46235,"11.0-11.2":0.29852,"11.3-11.4":0.50603,"12.0-12.1":0.62617,"12.2-12.4":4.10286,"13.0-13.1":0.87372,"13.2":0.42594,"13.3":23.85266,"13.4":4.41959},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00548,"9":0,"10":0.01097,"11":0.02194,"12":0.05484,"13":2.23747,_:"0","3.1":0,"3.2":0,"5.1":0.00548,"6.1":0.00548,"7.1":0,"9.1":0.02742,"10.1":0.09323,"11.1":0.16452,"12.1":0.28517,"13.1":1.201},I:{"3":0.00133,"4":0.01196,_:"81","2.1":0,"2.2":0.00399,"2.3":0.00133,"4.1":0.02658,"4.2-4.3":0.05583,"4.4":0,"4.4.3-4.4.4":0.38414},B:{"12":0,"13":0.00548,"14":0.01097,"15":0.00548,"16":0.02194,"17":0.12065,"18":2.35812,_:"79 80 81"},P:{"4":0.09702,"5.0-5.4":0.01078,"6.2-6.4":0,"7.2-7.4":0.02156,"8.2":0.01078,"9.2":0.07546,"10.1":0.14014,"11.1":3.79447},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.06271,"7":0,"8":0.02508,"9":0.03136,"10":0.00627,"11":1.18525,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.0271},R:{_:"0"},M:{"0":0.30257},O:{"0":0.21225},Q:{"1.2":0.03161},S:{"2.5":0},H:{"0":0.09834},L:{"0":27.48035}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CD.js b/website/www/node_modules/caniuse-lite/data/regions/CD.js new file mode 100644 index 000000000000..aa9a388d8ff9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CD.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.01886,"29":0.00314,"33":0.01258,"34":0.00314,"38":0.00629,"40":0.11633,"42":0.00629,"43":0.07231,"46":0.00629,"48":0.01258,"49":0.14148,"50":0.00629,"53":0.00943,"55":0.00943,"56":0.00629,"57":0.05345,"58":0.03458,"59":0.00314,"60":0.00629,"63":0.14462,"64":0.0283,"65":0.01572,"66":0.00629,"67":0.00629,"68":0.00943,"69":0.0503,"70":0.01886,"71":0.01258,"72":0.01258,"73":0.03458,"74":0.08174,"75":0.03773,"76":0.0503,"77":0.04716,"78":0.1572,"79":0.44959,"80":7.69022,"81":3.93629,"83":0.03773,"84":0.01886,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 35 36 37 39 41 44 45 47 51 52 54 61 62 85"},C:{"3":0.01572,"17":0.00314,"20":0.00314,"21":0.00629,"27":0.00943,"29":0.00943,"30":0.00629,"32":0.00314,"35":0.00629,"37":0.00314,"38":0.00629,"40":0.00629,"41":0.01572,"42":0.01572,"43":0.02515,"44":0.00629,"45":0.00943,"46":0.00314,"47":0.03773,"48":0.04087,"49":0.03144,"50":0.00314,"52":0.01258,"54":0.00629,"56":0.01886,"57":0.00314,"58":0.00314,"59":0.00314,"60":0.04716,"61":0.00314,"62":0.00314,"63":0.00943,"64":0.00943,"65":0.00314,"66":0.00629,"67":0.00629,"68":0.23894,"69":0.00943,"70":0.00629,"71":0.01258,"72":0.20122,"73":0.07546,"74":1.60344,"75":2.46804,"76":0.04402,_:"2 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 22 23 24 25 26 28 31 33 34 36 39 51 53 55 77 78 3.5 3.6"},F:{"19":0.01886,"21":0.00629,"34":0.00943,"36":0.00943,"37":0.00943,"38":0.00943,"40":0.00314,"42":0.03773,"45":0.00629,"56":0.00629,"57":0.00314,"58":0.00629,"62":0.00943,"63":0.01258,"64":0.01886,"65":0.18235,"66":0.10061,"67":2.93964,"68":0.11004,_:"9 11 12 15 16 17 18 20 22 23 24 25 26 27 28 29 30 31 32 33 35 39 41 43 44 46 47 48 49 50 51 52 53 54 55 60 9.5-9.6 10.5 10.6 11.1 11.6","10.0-10.1":0,"11.5":0.00629,"12.1":0.01258},G:{"8":0.00056,"3.2":0.00056,"4.0-4.1":0,"4.2-4.3":0.00111,"5.0-5.1":0.00556,"6.0-6.1":0.00167,"7.0-7.1":0.00556,"8.1-8.4":0.00779,"9.0-9.2":0.00668,"9.3":0.08013,"10.0-10.2":0.02059,"10.3":0.07067,"11.0-11.2":0.04563,"11.3-11.4":0.07735,"12.0-12.1":0.09572,"12.2-12.4":0.62716,"13.0-13.1":0.13356,"13.2":0.06511,"13.3":3.64609,"13.4":0.67557},E:{"4":0,"8":0.05659,"10":0.00629,"11":0.19178,"12":0.31126,"13":1.11612,_:"0 5 6 7 9 3.1 3.2 6.1 7.1","5.1":0.22322,"9.1":0.00629,"10.1":0.05659,"11.1":0.06917,"12.1":0.25781,"13.1":0.71369},I:{"3":0.00359,"4":0.03229,_:"81","2.1":0,"2.2":0.01076,"2.3":0.00359,"4.1":0.07175,"4.2-4.3":0.15068,"4.4":0,"4.4.3-4.4.4":1.03683},B:{"12":0.32383,"13":0.08489,"14":0.08803,"15":0.12576,"16":0.0503,"17":0.27038,"18":1.0218,_:"79 80 81"},P:{"4":0.57529,"5.0-5.4":0.04109,"6.2-6.4":0.06164,"7.2-7.4":0.30819,"8.2":0.03082,"9.2":0.33901,"10.1":0.6883,"11.1":1.19168},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.36453,"9":0.11599,"10":0.28168,"11":0.98587,_:"6 7 5.5"},N:{"10":0.02867,"11":0.12902},J:{"7":0,"10":0.04114},R:{_:"0"},M:{"0":0.3428},O:{"0":3.54455},Q:{"1.2":0.2331},S:{"2.5":0.04799},H:{"0":14.99379},L:{"0":39.86284}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CF.js b/website/www/node_modules/caniuse-lite/data/regions/CF.js new file mode 100644 index 000000000000..71d0ea35afa5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00232,"12":0,"13":0,"14":0,"15":0,"16":0.00232,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00232,"35":0,"36":0,"37":0,"38":0.00696,"39":0,"40":0,"41":0,"42":0,"43":0.00232,"44":0,"45":0,"46":0.00232,"47":0,"48":0,"49":0.00232,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00232,"61":0,"62":0,"63":0.00232,"64":0.01161,"65":0.00696,"66":0.00232,"67":0,"68":0.02089,"69":0.00232,"70":0,"71":0,"72":0.02553,"73":0,"74":0.00928,"75":0.00232,"76":0.00464,"77":0.02785,"78":0.02089,"79":0.01625,"80":1.30208,"81":0.42242,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0.00464,"17":0,"18":0,"19":0.00232,"20":0,"21":0,"22":0.00232,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00696,"31":0.01625,"32":0.00232,"33":0,"34":0,"35":0.00232,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00928,"43":0.00696,"44":0.01625,"45":0.01857,"46":0,"47":0,"48":0.00232,"49":0,"50":0,"51":0.00232,"52":0.25763,"53":0,"54":0,"55":0.01161,"56":0.01161,"57":0,"58":0,"59":0,"60":0.02321,"61":0,"62":0,"63":0,"64":0,"65":0.00232,"66":0.00232,"67":0.00232,"68":0.2878,"69":0,"70":0,"71":0,"72":0.04642,"73":0.00696,"74":0.48277,"75":0.59418,"76":0,"77":0,"78":0,"3.5":0.00696,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00464,"22":0,"23":0.00928,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01625,"47":0.00464,"48":0,"49":0.00232,"50":0,"51":0,"52":0,"53":0.00464,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00232,"66":0.03714,"67":0.0882,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02553},G:{"8":0.00039,"3.2":0.00039,"4.0-4.1":0,"4.2-4.3":0.00077,"5.0-5.1":0.00386,"6.0-6.1":0.00116,"7.0-7.1":0.00386,"8.1-8.4":0.0054,"9.0-9.2":0.00463,"9.3":0.05552,"10.0-10.2":0.01426,"10.3":0.04896,"11.0-11.2":0.03161,"11.3-11.4":0.05359,"12.0-12.1":0.06631,"12.2-12.4":0.43449,"13.0-13.1":0.09253,"13.2":0.04511,"13.3":2.52597,"13.4":0.46803},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00232,"12":0,"13":0.08588,_:"0","3.1":0,"3.2":0,"5.1":0.00232,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00928,"11.1":0.01161,"12.1":0.01161,"13.1":0.00232},I:{"3":0.00155,"4":0.01391,_:"81","2.1":0,"2.2":0.00464,"2.3":0.00155,"4.1":0.03091,"4.2-4.3":0.06491,"4.4":0,"4.4.3-4.4.4":0.44664},B:{"12":0.03946,"13":0.00232,"14":0.01393,"15":0.13926,"16":0.00232,"17":0.00696,"18":0.14854,_:"79 80 81"},P:{"4":0.35699,"5.0-5.4":0,"6.2-6.4":0.0102,"7.2-7.4":0.0408,"8.2":0.0102,"9.2":0.35699,"10.1":9.863,"11.1":5.39558},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01857,"9":0,"10":0.01161,"11":0.0998,"5.5":0},N:{"10":0.02234,"11":0.10053},J:{"7":0,"10":0.20733},R:{_:"0"},M:{"0":1.0981},O:{"0":0.49146},Q:{"1.2":0.02304},S:{"2.5":0.16894},H:{"0":3.0025},L:{"0":64.75191}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CG.js b/website/www/node_modules/caniuse-lite/data/regions/CG.js new file mode 100644 index 000000000000..34946580cfe2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CG.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.03121,"19":0.0104,"23":0.00694,"33":0.00347,"36":0.00694,"39":0.00347,"40":0.70747,"42":0.00347,"43":0.0104,"46":0.00694,"48":0.0104,"49":0.03468,"53":0.00694,"58":0.02774,"63":0.0867,"64":0.00694,"65":0.00694,"66":0.00694,"67":0.0104,"68":0.01734,"69":0.04162,"70":0.02081,"71":0.01387,"72":0.00694,"73":0.03815,"74":0.30172,"75":0.04855,"76":0.03121,"77":0.10404,"78":0.0763,"79":0.11444,"80":9.75548,"81":5.53146,"83":0.00694,"84":0.02774,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 20 21 22 24 25 26 27 28 29 30 31 32 34 35 37 38 41 44 45 47 50 51 52 54 55 56 57 59 60 61 62 85"},C:{"3":0.0971,"32":0.00694,"38":0.00347,"39":0.00694,"40":0.00694,"43":0.02081,"44":0.01734,"45":0.00694,"46":0.02774,"47":0.0104,"50":0.02081,"52":0.12485,"59":0.01387,"60":0.01387,"61":0.12138,"62":0.00694,"64":0.00694,"66":0.01387,"68":0.12832,"69":0.0104,"70":0.02081,"72":0.12138,"73":0.04855,"74":1.16525,"75":2.68423,"76":0.01387,"77":0.01387,_:"2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 37 41 42 48 49 51 53 54 55 56 57 58 63 65 67 71 78 3.5 3.6"},F:{"36":0.00347,"37":0.00347,"42":0.0104,"47":0.03468,"53":0.00347,"56":0.02774,"65":0.07283,"66":0.0763,"67":2.10161,"68":0.05202,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 38 39 40 41 43 44 45 46 48 49 50 51 52 54 55 57 58 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.0104},G:{"8":0.00045,"3.2":0.00045,"4.0-4.1":0,"4.2-4.3":0.0009,"5.0-5.1":0.00452,"6.0-6.1":0.00136,"7.0-7.1":0.00452,"8.1-8.4":0.00633,"9.0-9.2":0.00543,"9.3":0.06516,"10.0-10.2":0.01674,"10.3":0.05747,"11.0-11.2":0.0371,"11.3-11.4":0.0629,"12.0-12.1":0.07783,"12.2-12.4":0.50995,"13.0-13.1":0.1086,"13.2":0.05294,"13.3":2.96469,"13.4":0.54932},E:{"4":0,"7":0.0104,"8":0.00347,"11":0.48552,"12":0.0104,"13":0.23236,_:"0 5 6 9 10 3.1 3.2 6.1","5.1":0.47858,"7.1":0.02081,"9.1":0.00694,"10.1":0.00694,"11.1":0.02774,"12.1":0.0867,"13.1":0.21155},I:{"3":0.00753,"4":0.06781,_:"81","2.1":0,"2.2":0.0226,"2.3":0.00753,"4.1":0.15068,"4.2-4.3":0.31644,"4.4":0,"4.4.3-4.4.4":2.17738},B:{"12":0.06936,"13":0.05549,"14":0.03121,"15":0.03815,"16":0.04855,"17":0.14566,"18":1.61262,_:"79 80 81"},P:{"4":0.85645,"5.0-5.4":0.04078,"6.2-6.4":0.06117,"7.2-7.4":0.14274,"8.2":0.0102,"9.2":0.2345,"10.1":0.77488,"11.1":1.06036},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.14572,"9":0.00857,"10":0.14572,"11":1.20858,_:"6 7 5.5"},N:{"10":0.02867,"11":0.08492},J:{"7":0,"10":0.15024},R:{_:"0"},M:{"0":0.3462},O:{"0":3.42277},Q:{"1.2":0.09798},S:{"2.5":0.22862},H:{"0":2.64678},L:{"0":51.82618}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CH.js b/website/www/node_modules/caniuse-lite/data/regions/CH.js new file mode 100644 index 000000000000..d96270f407a4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00594,"28":0.01187,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00594,"37":0,"38":0.01187,"39":0,"40":0.02374,"41":0.00594,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.19586,"50":0,"51":0,"52":0.01187,"53":0.01187,"54":0,"55":0,"56":0,"57":0.00594,"58":0.00594,"59":0.01781,"60":0.07122,"61":0.01187,"62":0.00594,"63":0.01781,"64":0.00594,"65":0.01187,"66":0.03561,"67":0.02374,"68":0.01187,"69":0.01781,"70":0.02374,"71":0.03561,"72":0.02374,"73":0.04748,"74":0.02968,"75":0.04155,"76":0.04155,"77":0.07122,"78":0.08903,"79":0.28488,"80":9.03307,"81":4.45125,"83":0.01187,"84":0.00594,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00594,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00594,"46":0,"47":0.00594,"48":0.04155,"49":0,"50":0.02374,"51":0,"52":0.04748,"53":0,"54":0.00594,"55":0,"56":0.01187,"57":0.00594,"58":0.00594,"59":0,"60":0.04748,"61":0.00594,"62":0.00594,"63":0.00594,"64":0.00594,"65":0.01781,"66":0.01187,"67":0.01187,"68":0.42139,"69":0.01187,"70":0.02374,"71":0.01781,"72":0.08309,"73":0.07716,"74":1.59652,"75":2.84287,"76":0.02374,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01187,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00594,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00594,"66":0.00594,"67":0.65879,"68":0.01781,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00329,"3.2":0.00329,"4.0-4.1":0,"4.2-4.3":0.00658,"5.0-5.1":0.03291,"6.0-6.1":0.00987,"7.0-7.1":0.03291,"8.1-8.4":0.04608,"9.0-9.2":0.0395,"9.3":0.47397,"10.0-10.2":0.12178,"10.3":0.41802,"11.0-11.2":0.2699,"11.3-11.4":0.45751,"12.0-12.1":0.56613,"12.2-12.4":3.70949,"13.0-13.1":0.78995,"13.2":0.3851,"13.3":21.56571,"13.4":3.99584},E:{"4":0,"5":0,"6":0,"7":0,"8":0.02374,"9":0.08309,"10":0.02968,"11":0.04748,"12":0.12464,"13":3.16336,_:"0","3.1":0,"3.2":0,"5.1":0.01187,"6.1":0.00594,"7.1":0,"9.1":0.04748,"10.1":0.16618,"11.1":0.30862,"12.1":0.55196,"13.1":2.56986},I:{"3":0.00061,"4":0.00552,_:"81","2.1":0,"2.2":0.00184,"2.3":0.00061,"4.1":0.01226,"4.2-4.3":0.02575,"4.4":0,"4.4.3-4.4.4":0.17715},B:{"12":0,"13":0.00594,"14":0.01187,"15":0.01187,"16":0.05342,"17":0.13057,"18":2.93783,_:"79 80 81"},P:{"4":0.13759,"5.0-5.4":0.01058,"6.2-6.4":0,"7.2-7.4":0.04234,"8.2":0.02117,"9.2":0.13759,"10.1":0.39161,"11.1":3.85257},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00604,"10":0.00604,"11":1.72688,"5.5":0},N:{"10":0,"11":0.00813},J:{"7":0,"10":0.00407},R:{_:"0"},M:{"0":0.47967},O:{"0":0.06098},Q:{"1.2":0.02439},S:{"2.5":0},H:{"0":0.15394},L:{"0":24.82828}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CI.js b/website/www/node_modules/caniuse-lite/data/regions/CI.js new file mode 100644 index 000000000000..b093a0aee7b1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00456,"29":0.00456,"30":0,"31":0,"32":0,"33":0.00456,"34":0,"35":0,"36":0.00456,"37":0,"38":0,"39":0,"40":0.01368,"41":0.00456,"42":0,"43":0.01368,"44":0,"45":0,"46":0.00456,"47":0,"48":0.00456,"49":0.17788,"50":0.00912,"51":0.00456,"52":0,"53":0.00912,"54":0,"55":0.00912,"56":0.00456,"57":0.00912,"58":0.00912,"59":0.00456,"60":0,"61":0.00456,"62":0.00912,"63":0.04105,"64":0.02737,"65":0.05473,"66":0.00912,"67":0.04105,"68":0.00912,"69":0.1049,"70":0.02737,"71":0.02281,"72":0.03193,"73":0.07298,"74":0.09122,"75":0.09578,"76":0.06842,"77":0.09578,"78":0.11859,"79":0.2691,"80":8.8529,"81":3.99088,"83":0.01368,"84":0.02737,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00456,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00456,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00456,"44":0.00456,"45":0.00456,"46":0,"47":0.00912,"48":0.00912,"49":0.00456,"50":0,"51":0,"52":0.02281,"53":0,"54":0,"55":0.00456,"56":0.00456,"57":0,"58":0,"59":0,"60":0.00912,"61":0,"62":0,"63":0.00456,"64":0,"65":0.00912,"66":0.00912,"67":0.00456,"68":0.10946,"69":0.00456,"70":0.00456,"71":0.00912,"72":0.04105,"73":0.02737,"74":0.86659,"75":1.14025,"76":0.02737,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00456,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00456,"47":0.00912,"48":0,"49":0.00456,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00456,"58":0,"60":0.00456,"62":0,"63":0.00912,"64":0,"65":0.02281,"66":0.03193,"67":0.88483,"68":0.03649,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00456},G:{"8":0.00102,"3.2":0.00102,"4.0-4.1":0,"4.2-4.3":0.00203,"5.0-5.1":0.01016,"6.0-6.1":0.00305,"7.0-7.1":0.01016,"8.1-8.4":0.01422,"9.0-9.2":0.01219,"9.3":0.14628,"10.0-10.2":0.03758,"10.3":0.12901,"11.0-11.2":0.0833,"11.3-11.4":0.1412,"12.0-12.1":0.17472,"12.2-12.4":1.14481,"13.0-13.1":0.24379,"13.2":0.11885,"13.3":6.65555,"13.4":1.23319},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01824,"9":0,"10":0.00456,"11":0.01824,"12":0.04561,"13":0.38312,_:"0","3.1":0,"3.2":0,"5.1":0.05473,"6.1":0,"7.1":0,"9.1":0.00456,"10.1":0.03193,"11.1":0.04105,"12.1":0.11859,"13.1":0.40593},I:{"3":0.00124,"4":0.01117,_:"81","2.1":0,"2.2":0.00372,"2.3":0.00124,"4.1":0.02481,"4.2-4.3":0.0521,"4.4":0,"4.4.3-4.4.4":0.35852},B:{"12":0.01368,"13":0.01824,"14":0.04561,"15":0.01368,"16":0.01824,"17":0.05017,"18":0.50171,_:"79 80 81"},P:{"4":0.14141,"5.0-5.4":0.0202,"6.2-6.4":0.0404,"7.2-7.4":0.12121,"8.2":0.0101,"9.2":0.22222,"10.1":0.40404,"11.1":0.94949},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02223,"9":0,"10":0.00741,"11":0.14823,"5.5":0},N:{"10":0,"11":0.04351},J:{"7":0,"10":0.05983},R:{_:"0"},M:{"0":0.16317},O:{"0":0.68531},Q:{"1.2":0.03263},S:{"2.5":0.01088},H:{"0":1.40061},L:{"0":62.89916}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CK.js b/website/www/node_modules/caniuse-lite/data/regions/CK.js new file mode 100644 index 000000000000..d78b02e55c07 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00704,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00704,"45":0,"46":6.61384,"47":0,"48":0,"49":0.0985,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01407,"64":0,"65":0.01407,"66":0,"67":0.02111,"68":0.05629,"69":0,"70":0.00704,"71":0,"72":0,"73":0,"74":0.03518,"75":0.00704,"76":0.00704,"77":0,"78":3.48986,"79":0.37291,"80":20.31293,"81":5.63584,"83":0.00704,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.01407,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02111,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02814,"69":0,"70":0.00704,"71":0,"72":0,"73":0.01407,"74":0.64028,"75":0.63324,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01407,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.04925,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.0985,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00132,"3.2":0.00132,"4.0-4.1":0,"4.2-4.3":0.00264,"5.0-5.1":0.01318,"6.0-6.1":0.00395,"7.0-7.1":0.01318,"8.1-8.4":0.01845,"9.0-9.2":0.01581,"9.3":0.18977,"10.0-10.2":0.04876,"10.3":0.16737,"11.0-11.2":0.10806,"11.3-11.4":0.18318,"12.0-12.1":0.22667,"12.2-12.4":1.48521,"13.0-13.1":0.31628,"13.2":0.15419,"13.3":8.63452,"13.4":1.59986},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00704,"11":0,"12":0,"13":0.52066,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01407,"10.1":0,"11.1":0.07036,"12.1":0.03518,"13.1":0.05629},I:{"3":0.00065,"4":0.00587,_:"81","2.1":0,"2.2":0.00196,"2.3":0.00065,"4.1":0.01305,"4.2-4.3":0.0274,"4.4":0,"4.4.3-4.4.4":0.18856},B:{"12":0.02814,"13":0.03518,"14":0.00704,"15":0.07036,"16":0.01407,"17":0.02814,"18":2.48371,_:"79 80 81"},P:{"4":0.12196,"5.0-5.4":0.03049,"6.2-6.4":0.06098,"7.2-7.4":0,"8.2":0,"9.2":0.17278,"10.1":2.06322,"11.1":0.77244},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":6.43794,"5.5":0},N:{"10":0,"11":0.00889},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.06521},O:{"0":0.16302},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.14592},L:{"0":31.15672}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CL.js b/website/www/node_modules/caniuse-lite/data/regions/CL.js new file mode 100644 index 000000000000..b338ce31219e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00539,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00539,"35":0,"36":0.00539,"37":0,"38":0.04315,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00539,"46":0.00539,"47":0,"48":0,"49":0.1834,"50":0,"51":0.00539,"52":0,"53":0.03236,"54":0,"55":0.00539,"56":0.00539,"57":0.00539,"58":0.01079,"59":0.00539,"60":0,"61":0.00539,"62":0.00539,"63":0.01618,"64":0.00539,"65":0.03236,"66":0.00539,"67":0.04855,"68":0.00539,"69":0.01618,"70":0.03776,"71":0.04855,"72":0.04315,"73":0.04315,"74":0.03236,"75":0.04855,"76":0.04855,"77":0.04315,"78":0.08091,"79":0.15643,"80":14.04058,"81":7.54081,"83":0.00539,"84":0.00539,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00539,"48":0.01079,"49":0,"50":0,"51":0,"52":0.01618,"53":0,"54":0,"55":0,"56":0.01079,"57":0,"58":0.00539,"59":0,"60":0.00539,"61":0,"62":0,"63":0,"64":0,"65":0.00539,"66":0.00539,"67":0.00539,"68":0.08091,"69":0.00539,"70":0.01079,"71":0.00539,"72":0.01618,"73":0.01618,"74":0.57176,"75":0.97631,"76":0.01079,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00539,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00539,"58":0.00539,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00539,"67":0.84146,"68":0.01618,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0011,"3.2":0.0011,"4.0-4.1":0,"4.2-4.3":0.0022,"5.0-5.1":0.011,"6.0-6.1":0.0033,"7.0-7.1":0.011,"8.1-8.4":0.01539,"9.0-9.2":0.0132,"9.3":0.15834,"10.0-10.2":0.04069,"10.3":0.13965,"11.0-11.2":0.09017,"11.3-11.4":0.15284,"12.0-12.1":0.18913,"12.2-12.4":1.23925,"13.0-13.1":0.2639,"13.2":0.12865,"13.3":7.20457,"13.4":1.33491},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00539,"11":0.02697,"12":0.0863,"13":0.73358,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01079,"10.1":0.06473,"11.1":0.11867,"12.1":0.24812,"13.1":0.76595},I:{"3":0.00041,"4":0.00368,_:"81","2.1":0,"2.2":0.00123,"2.3":0.00041,"4.1":0.00818,"4.2-4.3":0.01717,"4.4":0,"4.4.3-4.4.4":0.11814},B:{"12":0,"13":0.00539,"14":0.00539,"15":0.00539,"16":0.01079,"17":0.03236,"18":0.50164,_:"79 80 81"},P:{"4":0.23401,"5.0-5.4":0,"6.2-6.4":0.01017,"7.2-7.4":0.07122,"8.2":0.02035,"9.2":0.17296,"10.1":0.24418,"11.1":1.5363},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01179,"9":0.0059,"10":0.0059,"11":0.22993,"5.5":0},N:{"10":0,"11":0.00921},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.11515},O:{"0":0.03224},Q:{"1.2":0.00461},S:{"2.5":0},H:{"0":0.10902},L:{"0":56.08041}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CM.js b/website/www/node_modules/caniuse-lite/data/regions/CM.js new file mode 100644 index 000000000000..6f201a4021b4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00439,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00877,"34":0.00439,"35":0,"36":0.00439,"37":0,"38":0,"39":0.00877,"40":0.00877,"41":0,"42":0.00439,"43":0.2193,"44":0,"45":0,"46":0.00439,"47":0,"48":0,"49":0.13158,"50":0.01754,"51":0.00877,"52":0,"53":0,"54":0,"55":0.01754,"56":0.00877,"57":0.00439,"58":0.01316,"59":0,"60":0.00439,"61":0.00877,"62":0.00877,"63":0.06579,"64":0.01316,"65":0.01754,"66":0.00439,"67":0.01316,"68":0.01754,"69":0.0307,"70":0.01316,"71":0.02632,"72":0.10526,"73":0.02193,"74":0.0614,"75":0.02193,"76":0.0614,"77":0.07456,"78":0.03947,"79":0.13597,"80":5.38601,"81":2.49563,"83":0.01316,"84":0.00877,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00439,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00439,"23":0,"24":0.00439,"25":0.00439,"26":0,"27":0,"28":0,"29":0,"30":0.00877,"31":0.00439,"32":0.00439,"33":0.00439,"34":0,"35":0.00439,"36":0,"37":0.00439,"38":0.00439,"39":0,"40":0.00439,"41":0.00439,"42":0.00877,"43":0.02632,"44":0.00439,"45":0.00877,"46":0.00439,"47":0.03509,"48":0.03947,"49":0.01316,"50":0.00439,"51":0.00439,"52":0.11404,"53":0.00439,"54":0.00439,"55":0.00439,"56":0.01754,"57":0.00439,"58":0.00439,"59":0.01316,"60":0.02193,"61":0.00877,"62":0.00439,"63":0.00439,"64":0.00439,"65":0.00877,"66":0.01316,"67":0.02632,"68":0.27632,"69":0.02193,"70":0.02193,"71":0.02632,"72":0.12719,"73":0.05263,"74":1.36843,"75":2.05265,"76":0.08772,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0.00439,"20":0.00877,"21":0,"22":0,"23":0.00439,"24":0,"25":0,"26":0,"27":0,"28":0.00439,"29":0.00439,"30":0,"31":0,"32":0,"33":0.00439,"34":0.00439,"35":0,"36":0,"37":0.00439,"38":0,"39":0,"40":0,"41":0,"42":0.00877,"43":0,"44":0,"45":0,"46":0.02193,"47":0.02193,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00439,"54":0,"55":0,"56":0.00877,"57":0.00439,"58":0.00439,"60":0,"62":0,"63":0.00439,"64":0.00439,"65":0.05263,"66":0.04386,"67":1.53949,"68":0.02193,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02193},G:{"8":0.00045,"3.2":0.00045,"4.0-4.1":0,"4.2-4.3":0.0009,"5.0-5.1":0.00452,"6.0-6.1":0.00136,"7.0-7.1":0.00452,"8.1-8.4":0.00632,"9.0-9.2":0.00542,"9.3":0.06505,"10.0-10.2":0.01671,"10.3":0.05737,"11.0-11.2":0.03704,"11.3-11.4":0.06279,"12.0-12.1":0.0777,"12.2-12.4":0.5091,"13.0-13.1":0.10842,"13.2":0.05285,"13.3":2.95974,"13.4":0.5484},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03947,"12":0.00439,"13":0.14035,_:"0","3.1":0,"3.2":0,"5.1":0.28509,"6.1":0,"7.1":0,"9.1":0.00439,"10.1":0.05263,"11.1":0.02632,"12.1":0.04825,"13.1":0.09211},I:{"3":0.00263,"4":0.02368,_:"81","2.1":0,"2.2":0.00789,"2.3":0.00263,"4.1":0.05263,"4.2-4.3":0.11053,"4.4":0,"4.4.3-4.4.4":0.76053},B:{"12":0.05702,"13":0.03509,"14":0.08333,"15":0.07456,"16":0.02632,"17":0.07456,"18":0.44299,_:"79 80 81"},P:{"4":0.35409,"5.0-5.4":0.14164,"6.2-6.4":0.03035,"7.2-7.4":0.14164,"8.2":0.02023,"9.2":0.24281,"10.1":0.28327,"11.1":0.72842},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03582,"9":0,"10":0.01535,"11":0.22515,"5.5":0},N:{"10":0.01263,"11":0.08842},J:{"7":0,"10":0.03368},R:{_:"0"},M:{"0":0.41544},O:{"0":2.16139},Q:{"1.2":0.06175},S:{"2.5":0.05053},H:{"0":3.07737},L:{"0":65.39884}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CN.js b/website/www/node_modules/caniuse-lite/data/regions/CN.js new file mode 100644 index 000000000000..33b07bce497d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0122,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00407,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00407,"28":0,"29":0,"30":0,"31":0.00813,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00407,"40":0.03253,"41":0.00813,"42":0.00813,"43":0.00407,"44":0.00407,"45":0.09758,"46":0,"47":0.10572,"48":0.2277,"49":0.11385,"50":0.00813,"51":0.00407,"52":0,"53":0.00407,"54":0.01626,"55":0.08945,"56":0.0244,"57":0.1789,"58":0.01626,"59":0.02033,"60":0.02033,"61":0.0122,"62":0.11385,"63":0.09352,"64":0.00813,"65":0.05286,"66":0.0122,"67":0.05692,"68":0.02846,"69":0.59364,"70":0.08132,"71":0.06912,"72":0.52451,"73":0.08539,"74":0.52045,"75":0.17484,"76":0.09758,"77":0.09758,"78":0.29682,"79":0.20737,"80":1.46376,"81":0.58957,"83":0.00813,"84":0.00407,_:"85"},C:{"2":0,"3":0.00407,"4":0.00407,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.0244,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00407,"31":0.00407,"32":0,"33":0.29275,"34":0,"35":0,"36":0.01626,"37":0,"38":0,"39":0,"40":0.00407,"41":0,"42":0,"43":0.19517,"44":0,"45":0.00813,"46":0,"47":0.00813,"48":0.00813,"49":0.00407,"50":0.00813,"51":0.00813,"52":0.04066,"53":0.02846,"54":0.03253,"55":0.0244,"56":0.02846,"57":0.02846,"58":0.02033,"59":0.0244,"60":0.02033,"61":0.01626,"62":0.0122,"63":0.0122,"64":0.0122,"65":0.0122,"66":0.0122,"67":0.0122,"68":0.04879,"69":0.0122,"70":0.0122,"71":0.0122,"72":0.01626,"73":0.01626,"74":0.2155,"75":0.21956,"76":0,"77":0,"78":0,"3.5":0,"3.6":0.00407},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00407,"66":0.00407,"67":0.03253,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00813},G:{"8":0.00098,"3.2":0.00098,"4.0-4.1":0,"4.2-4.3":0.00197,"5.0-5.1":0.00983,"6.0-6.1":0.00295,"7.0-7.1":0.00983,"8.1-8.4":0.01376,"9.0-9.2":0.0118,"9.3":0.14154,"10.0-10.2":0.03637,"10.3":0.12483,"11.0-11.2":0.0806,"11.3-11.4":0.13663,"12.0-12.1":0.16906,"12.2-12.4":1.10775,"13.0-13.1":0.2359,"13.2":0.115,"13.3":6.44011,"13.4":1.19327},E:{"4":0.00813,"5":0.00407,"6":0.14638,"7":0,"8":0.00407,"9":0.00407,"10":0.0122,"11":0.02033,"12":0.03659,"13":0.26429,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00813,"10.1":0.02033,"11.1":0.02846,"12.1":0.08945,"13.1":0.14231},I:{"3":0.00751,"4":0.06761,_:"81","2.1":0,"2.2":0.02254,"2.3":0.00751,"4.1":0.15025,"4.2-4.3":0.31553,"4.4":0,"4.4.3-4.4.4":2.17113},B:{"12":0.00407,"13":0.00407,"14":0.00407,"15":0.00407,"16":0.0122,"17":0.04473,"18":0.62616,_:"79 80 81"},P:{"4":0.03229,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.12917,"10.1":0.1184,"11.1":0.18299},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.03568,"7":0.03568,"8":0.74925,"9":0.64221,"10":0.33895,"11":3.58569,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00593},R:{_:"0"},M:{"0":0.08308},O:{"0":12.26558},Q:{"1.2":7.30475},S:{"2.5":0},H:{"0":0.05618},L:{"0":42.71821}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CO.js b/website/www/node_modules/caniuse-lite/data/regions/CO.js new file mode 100644 index 000000000000..0a8857c5f21b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01969,"23":0,"24":0,"25":0,"26":0.00656,"27":0,"28":0,"29":0,"30":0,"31":0.00656,"32":0,"33":0,"34":0.00656,"35":0,"36":0.00656,"37":0,"38":0.05907,"39":0.00656,"40":0,"41":0,"42":0.00656,"43":0,"44":0,"45":0,"46":0.00656,"47":0,"48":0,"49":0.15751,"50":0,"51":0.00656,"52":0,"53":0.06563,"54":0,"55":0.00656,"56":0.00656,"57":0.00656,"58":0.01969,"59":0.00656,"60":0.00656,"61":0.00656,"62":0.02625,"63":0.03282,"64":0.01313,"65":0.0525,"66":0.03282,"67":0.05907,"68":0.01313,"69":0.02625,"70":0.07219,"71":0.10501,"72":0.09188,"73":0.09845,"74":0.07876,"75":0.08532,"76":0.09188,"77":0.10501,"78":0.13782,"79":0.25596,"80":20.98847,"81":13.67729,"83":0.01969,"84":0.00656,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00656,"48":0.00656,"49":0,"50":0.01313,"51":0.00656,"52":0.01313,"53":0,"54":0,"55":0,"56":0.00656,"57":0,"58":0,"59":0.00656,"60":0,"61":0,"62":0,"63":0.00656,"64":0.00656,"65":0.01969,"66":0.01313,"67":0,"68":0.05907,"69":0.00656,"70":0.00656,"71":0.00656,"72":0.01969,"73":0.01313,"74":0.51848,"75":0.94507,"76":0.01969,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00656,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.80069,"68":0.01969,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00067,"3.2":0.00067,"4.0-4.1":0,"4.2-4.3":0.00133,"5.0-5.1":0.00665,"6.0-6.1":0.002,"7.0-7.1":0.00665,"8.1-8.4":0.00931,"9.0-9.2":0.00798,"9.3":0.0958,"10.0-10.2":0.02461,"10.3":0.08449,"11.0-11.2":0.05455,"11.3-11.4":0.09247,"12.0-12.1":0.11443,"12.2-12.4":0.74975,"13.0-13.1":0.15966,"13.2":0.07784,"13.3":4.35882,"13.4":0.80763},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00656,"9":0.00656,"10":0.01313,"11":0.02625,"12":0.08532,"13":0.781,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00656,"10.1":0.05907,"11.1":0.1247,"12.1":0.28221,"13.1":0.95164},I:{"3":0.00063,"4":0.0057,_:"81","2.1":0,"2.2":0.0019,"2.3":0.00063,"4.1":0.01267,"4.2-4.3":0.02661,"4.4":0,"4.4.3-4.4.4":0.18309},B:{"12":0.00656,"13":0.00656,"14":0.00656,"15":0.00656,"16":0.01313,"17":0.03282,"18":0.40034,_:"79 80 81"},P:{"4":0.36542,"5.0-5.4":0,"6.2-6.4":0.01015,"7.2-7.4":0.05075,"8.2":0.01015,"9.2":0.05075,"10.1":0.11166,"11.1":0.92371},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02067,"9":0.00689,"10":0.00689,"11":0.10337,"5.5":0},N:{"10":0,"11":0.02406},J:{"7":0,"10":0.00344},R:{_:"0"},M:{"0":0.06874},O:{"0":0.03781},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.05532},L:{"0":47.76789}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CR.js b/website/www/node_modules/caniuse-lite/data/regions/CR.js new file mode 100644 index 000000000000..6e07add1ba16 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00576,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.2015,"50":0,"51":0,"52":0,"53":0.00576,"54":0.00576,"55":0,"56":0,"57":0.01151,"58":0.00576,"59":0,"60":0.00576,"61":0,"62":0.00576,"63":0.04606,"64":0.00576,"65":0.02879,"66":0.01151,"67":0.03454,"68":0.00576,"69":0.02303,"70":0.01151,"71":0.04606,"72":0.02879,"73":0.06333,"74":0.02879,"75":0.05757,"76":0.04606,"77":0.05181,"78":0.10363,"79":0.18422,"80":14.30615,"81":7.96193,"83":0.01151,"84":0.00576,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01151,"49":0,"50":0,"51":0.00576,"52":0.03454,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.02879,"67":0.07484,"68":0.11514,"69":0.00576,"70":0.00576,"71":0.00576,"72":0.02879,"73":0.04606,"74":0.7772,"75":1.41047,"76":0.01727,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00576,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.42602,"68":0.00576,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00135,"3.2":0.00135,"4.0-4.1":0,"4.2-4.3":0.0027,"5.0-5.1":0.0135,"6.0-6.1":0.00405,"7.0-7.1":0.0135,"8.1-8.4":0.0189,"9.0-9.2":0.0162,"9.3":0.19439,"10.0-10.2":0.04995,"10.3":0.17144,"11.0-11.2":0.11069,"11.3-11.4":0.18764,"12.0-12.1":0.23218,"12.2-12.4":1.52135,"13.0-13.1":0.32398,"13.2":0.15794,"13.3":8.84461,"13.4":1.63879},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00576,"11":0.02879,"12":0.14393,"13":1.46228,_:"0","3.1":0,"3.2":0,"5.1":0.37421,"6.1":0,"7.1":0,"9.1":0.02303,"10.1":0.07484,"11.1":0.19574,"12.1":0.48935,"13.1":1.6062},I:{"3":0.00091,"4":0.00815,_:"81","2.1":0,"2.2":0.00272,"2.3":0.00091,"4.1":0.01811,"4.2-4.3":0.03804,"4.4":0,"4.4.3-4.4.4":0.26176},B:{"12":0.00576,"13":0.00576,"14":0.00576,"15":0.00576,"16":0.01151,"17":0.04606,"18":0.74841,_:"79 80 81"},P:{"4":0.12388,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05162,"8.2":0.02065,"9.2":0.14452,"10.1":0.21678,"11.1":2.13686},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02539,"9":0.00635,"10":0,"11":0.21581,"5.5":0},N:{"10":0,"11":0.01273},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.18245},O:{"0":0.03394},Q:{"1.2":0.00424},S:{"2.5":0},H:{"0":0.10444},L:{"0":49.06}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CU.js b/website/www/node_modules/caniuse-lite/data/regions/CU.js new file mode 100644 index 000000000000..7846fef36bcd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00396,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.02769,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00396,"47":0,"48":0,"49":0.01187,"50":0,"51":0.00396,"52":0.00791,"53":0.00396,"54":0.00791,"55":0.00396,"56":0.00396,"57":0,"58":0.00396,"59":0.00396,"60":0.00791,"61":0.00396,"62":0.01582,"63":0.03164,"64":0.01187,"65":0,"66":0.00396,"67":0.01187,"68":0.03164,"69":0.00791,"70":0.01582,"71":0.01978,"72":0.04351,"73":0.03164,"74":0.09097,"75":0.05933,"76":0.02769,"77":0.04746,"78":0.03955,"79":0.1147,"80":2.75664,"81":1.21023,"83":0.00396,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00396,"18":0.03164,"19":0,"20":0.00396,"21":0.00396,"22":0.00396,"23":0.00791,"24":0.00396,"25":0.00396,"26":0.01187,"27":0,"28":0.00396,"29":0.00396,"30":0.00396,"31":0.00396,"32":0.00791,"33":0.01582,"34":0.06328,"35":0.00791,"36":0.00791,"37":0.01187,"38":0.03955,"39":0.01582,"40":0.03164,"41":0.01582,"42":0.01582,"43":0.0356,"44":0.01582,"45":0.03955,"46":0.02769,"47":0.06328,"48":0.0356,"49":0.03164,"50":0.13447,"51":0.04746,"52":0.18589,"53":0.10283,"54":0.13052,"55":0.0356,"56":0.13052,"57":0.22148,"58":0.05537,"59":0.06724,"60":0.17007,"61":0.09097,"62":0.05933,"63":0.09097,"64":0.09492,"65":0.07119,"66":0.24126,"67":0.13447,"68":0.56952,"69":0.36782,"70":0.13447,"71":0.17402,"72":0.36782,"73":0.31245,"74":1.93004,"75":2.09615,"76":0.03955,"77":0.01582,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00396,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00396,"30":0,"31":0,"32":0,"33":0,"34":0.00396,"35":0,"36":0,"37":0.00396,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00791,"44":0,"45":0.01187,"46":0.01978,"47":0.00791,"48":0,"49":0.00791,"50":0,"51":0,"52":0,"53":0.00396,"54":0.00396,"55":0.01978,"56":0.00396,"57":0.00791,"58":0,"60":0,"62":0,"63":0.00396,"64":0.00396,"65":0.01978,"66":0.02373,"67":0.29267,"68":0.01582,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00396,"12.1":0.00396},G:{"8":0.00089,"3.2":0.00089,"4.0-4.1":0,"4.2-4.3":0.00179,"5.0-5.1":0.00895,"6.0-6.1":0.00268,"7.0-7.1":0.00895,"8.1-8.4":0.01253,"9.0-9.2":0.01074,"9.3":0.12885,"10.0-10.2":0.03311,"10.3":0.11364,"11.0-11.2":0.07338,"11.3-11.4":0.12438,"12.0-12.1":0.15391,"12.2-12.4":1.00846,"13.0-13.1":0.21476,"13.2":0.10469,"13.3":5.86287,"13.4":1.08631},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00791,"12":0.01187,"13":0.0791,_:"0","3.1":0,"3.2":0,"5.1":0.95711,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01582,"11.1":0.00396,"12.1":0.01978,"13.1":0.01978},I:{"3":0.00193,"4":0.01736,_:"81","2.1":0,"2.2":0.00579,"2.3":0.00193,"4.1":0.03859,"4.2-4.3":0.08103,"4.4":0,"4.4.3-4.4.4":0.55756},B:{"12":0.01187,"13":0.02373,"14":0.02373,"15":0.01978,"16":0.01978,"17":0.0356,"18":0.17007,_:"79 80 81"},P:{"4":0.5771,"5.0-5.4":0.07087,"6.2-6.4":0.11137,"7.2-7.4":0.44548,"8.2":0.12149,"9.2":0.66822,"10.1":0.76947,"11.1":0.94158},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05933,"9":0,"10":0.00396,"11":0.08701,"5.5":0},N:{"10":0,"11":0.01209},J:{"7":0,"10":0.00605},R:{_:"0"},M:{"0":1.3964},O:{"0":0.53196},Q:{"1.2":0.02418},S:{"2.5":0},H:{"0":0.9443},L:{"0":65.85478}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CV.js b/website/www/node_modules/caniuse-lite/data/regions/CV.js new file mode 100644 index 000000000000..7733b8ff301d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CV.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00895,"23":0,"24":0,"25":0,"26":0.01342,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00447,"34":0,"35":0,"36":0.01342,"37":0,"38":0.02684,"39":0,"40":0.03579,"41":0,"42":0.00447,"43":0.06264,"44":0,"45":0,"46":0.03132,"47":0,"48":0.00447,"49":0.14317,"50":0,"51":0,"52":0,"53":0.00895,"54":0,"55":0.08948,"56":0.00447,"57":0,"58":0.00447,"59":0,"60":0.00895,"61":0,"62":0.00447,"63":0.03132,"64":0.00895,"65":0.10738,"66":0,"67":0.00895,"68":0.04474,"69":0.01342,"70":0.04027,"71":0.02684,"72":0.04027,"73":0.03579,"74":0.05369,"75":0.07606,"76":0.04921,"77":0.07158,"78":0.1029,"79":0.14764,"80":8.33954,"81":4.17872,"83":0.01342,"84":0.00447,_:"85"},C:{"2":0,"3":0,"4":0.00895,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00895,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00447,"51":0,"52":0.00447,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00447,"64":0,"65":0,"66":0,"67":0.05816,"68":0.03132,"69":0,"70":0,"71":0.00447,"72":0.00895,"73":0.01342,"74":0.4474,"75":0.75163,"76":0.00447,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0179,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00447,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00447,"64":0,"65":0,"66":0,"67":0.5682,"68":0.01342,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0008,"3.2":0.0008,"4.0-4.1":0,"4.2-4.3":0.0016,"5.0-5.1":0.00802,"6.0-6.1":0.00241,"7.0-7.1":0.00802,"8.1-8.4":0.01123,"9.0-9.2":0.00963,"9.3":0.11556,"10.0-10.2":0.02969,"10.3":0.10192,"11.0-11.2":0.0658,"11.3-11.4":0.11155,"12.0-12.1":0.13803,"12.2-12.4":0.9044,"13.0-13.1":0.1926,"13.2":0.09389,"13.3":5.25789,"13.4":0.97422},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00895,"11":0,"12":0.00447,"13":1.10508,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.08053,"11.1":0.1029,"12.1":0.22817,"13.1":0.39819},I:{"3":0.00183,"4":0.01645,_:"81","2.1":0,"2.2":0.00548,"2.3":0.00183,"4.1":0.03655,"4.2-4.3":0.07676,"4.4":0,"4.4.3-4.4.4":0.52821},B:{"12":0.02684,"13":0.02684,"14":0.02684,"15":0.03132,"16":0.04027,"17":0.03132,"18":0.689,_:"79 80 81"},P:{"4":0.44234,"5.0-5.4":0.04115,"6.2-6.4":0.02057,"7.2-7.4":0.2366,"8.2":0.03086,"9.2":0.48348,"10.1":0.37033,"11.1":1.04926},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00447,"9":0,"10":0,"11":0.13869,"5.5":0},N:{"10":0.01105,"11":0.03316},J:{"7":0,"10":0.00553},R:{_:"0"},M:{"0":0.06079},O:{"0":0.23209},Q:{"1.2":0.0221},S:{"2.5":0},H:{"0":0.38714},L:{"0":67.02881}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CX.js b/website/www/node_modules/caniuse-lite/data/regions/CX.js new file mode 100644 index 000000000000..1531299a7a4f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CX.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":1.58408,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":3.178,"67":0,"68":14.28623,"69":0,"70":0.79696,"71":43.63597,"72":0,"73":0,"74":0,"75":3.96512,"76":0,"77":0,"78":0,"79":0,"80":0,"81":3.96512,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":3.178,"75":22.21646,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.4":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0},I:{"3":0,"4":0,_:"81","2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":3.19408}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CY.js b/website/www/node_modules/caniuse-lite/data/regions/CY.js new file mode 100644 index 000000000000..d6725d5b0d8a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00483,"37":0,"38":0.01449,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.17388,"50":0,"51":0,"52":0,"53":0.02415,"54":0,"55":0,"56":0,"57":0.00483,"58":0.00483,"59":0.01449,"60":0,"61":0,"62":0.00483,"63":0.00966,"64":0,"65":0.01932,"66":0,"67":0.00483,"68":0.00966,"69":0.00966,"70":0.01449,"71":0.02415,"72":0.0483,"73":0.02415,"74":0.01449,"75":0.01449,"76":0.02415,"77":0.02898,"78":0.03864,"79":0.0966,"80":10.44729,"81":5.27919,"83":0.01449,"84":0.00483,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00483,"49":0,"50":0.07245,"51":0,"52":0.11109,"53":0,"54":0,"55":0.00483,"56":0.00483,"57":0,"58":0.22218,"59":0,"60":0,"61":0,"62":0,"63":0.00483,"64":0,"65":0,"66":0.00483,"67":0,"68":0.08694,"69":0.00483,"70":0.00483,"71":0,"72":0.00966,"73":0.00966,"74":0.483,"75":0.79695,"76":0.01449,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00483,"46":0,"47":0.00966,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.3864,"68":0.00966,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00176,"3.2":0.00176,"4.0-4.1":0,"4.2-4.3":0.00352,"5.0-5.1":0.01759,"6.0-6.1":0.00528,"7.0-7.1":0.01759,"8.1-8.4":0.02462,"9.0-9.2":0.02111,"9.3":0.25326,"10.0-10.2":0.06507,"10.3":0.22337,"11.0-11.2":0.14422,"11.3-11.4":0.24447,"12.0-12.1":0.30251,"12.2-12.4":1.98215,"13.0-13.1":0.42211,"13.2":0.20578,"13.3":11.52353,"13.4":2.13516},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01932,"12":0.02898,"13":0.97566,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00966,"10.1":0.10626,"11.1":0.06762,"12.1":0.18837,"13.1":0.80178},I:{"3":0.00113,"4":0.01013,_:"81","2.1":0,"2.2":0.00338,"2.3":0.00113,"4.1":0.02251,"4.2-4.3":0.04726,"4.4":0,"4.4.3-4.4.4":0.32522},B:{"12":0.00483,"13":0.00483,"14":0.00966,"15":0.04347,"16":0.00966,"17":0.03864,"18":0.95151,_:"79 80 81"},P:{"4":0.09317,"5.0-5.4":0,"6.2-6.4":0.01035,"7.2-7.4":0.03106,"8.2":0.02071,"9.2":0.08282,"10.1":0.22776,"11.1":3.78904},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00977,"9":0.00488,"10":0.00488,"11":0.42966,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00517},R:{_:"0"},M:{"0":0.12408},O:{"0":1.70093},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.22026},L:{"0":49.89529}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/CZ.js b/website/www/node_modules/caniuse-lite/data/regions/CZ.js new file mode 100644 index 000000000000..53b12ca32565 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/CZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00615,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00615,"32":0,"33":0.0123,"34":0.00615,"35":0,"36":0,"37":0,"38":0.00615,"39":0,"40":0,"41":0.00615,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.53496,"50":0.00615,"51":0,"52":0,"53":0.0246,"54":0,"55":0.00615,"56":0.0123,"57":0.00615,"58":0.0123,"59":0,"60":0.0123,"61":0.17832,"62":0.00615,"63":0.01845,"64":0.00615,"65":0.0123,"66":0.00615,"67":0.0246,"68":0.0123,"69":0.03689,"70":0.05534,"71":0.07994,"72":0.11683,"73":0.06764,"74":0.03689,"75":0.07994,"76":0.03689,"77":0.06149,"78":0.06764,"79":0.17832,"80":14.55468,"81":6.96682,"83":0.0123,"84":0.00615,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00615,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00615,"44":0,"45":0.00615,"46":0,"47":0.00615,"48":0.01845,"49":0,"50":0.00615,"51":0.00615,"52":0.14143,"53":0.00615,"54":0.00615,"55":0.00615,"56":0.04304,"57":0.0123,"58":0.0123,"59":0.00615,"60":0.01845,"61":0.00615,"62":0.00615,"63":0.01845,"64":0.0123,"65":0.03689,"66":0.01845,"67":0.0123,"68":0.29515,"69":0.0123,"70":0.01845,"71":0.0246,"72":0.06149,"73":0.04919,"74":1.8324,"75":3.05605,"76":0.01845,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0123,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00615,"48":0,"49":0,"50":0,"51":0,"52":0.00615,"53":0.00615,"54":0,"55":0,"56":0,"57":0.00615,"58":0.00615,"60":0,"62":0,"63":0.00615,"64":0,"65":0.00615,"66":0.0123,"67":1.74632,"68":0.04919,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0246},G:{"8":0.00129,"3.2":0.00129,"4.0-4.1":0,"4.2-4.3":0.00257,"5.0-5.1":0.01285,"6.0-6.1":0.00386,"7.0-7.1":0.01285,"8.1-8.4":0.01799,"9.0-9.2":0.01542,"9.3":0.18507,"10.0-10.2":0.04755,"10.3":0.16322,"11.0-11.2":0.10539,"11.3-11.4":0.17865,"12.0-12.1":0.22106,"12.2-12.4":1.44846,"13.0-13.1":0.30846,"13.2":0.15037,"13.3":8.42084,"13.4":1.56027},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0123,"9":0,"10":0.00615,"11":0.00615,"12":0.03689,"13":1.03918,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00615,"10.1":0.04304,"11.1":0.06764,"12.1":0.14143,"13.1":0.80552},I:{"3":0.00104,"4":0.00935,_:"81","2.1":0,"2.2":0.00312,"2.3":0.00104,"4.1":0.02078,"4.2-4.3":0.04365,"4.4":0,"4.4.3-4.4.4":0.30034},B:{"12":0.00615,"13":0.00615,"14":0.01845,"15":0.0246,"16":0.0246,"17":0.07994,"18":2.19519,_:"79 80 81"},P:{"4":0.08227,"5.0-5.4":0,"6.2-6.4":0.01028,"7.2-7.4":0.02057,"8.2":0.01028,"9.2":0.08227,"10.1":0.20568,"11.1":2.27278},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00635,"9":0.00635,"10":0.00635,"11":1.17387,"5.5":0},N:{"10":0,"11":0.01926},J:{"7":0,"10":0.0077},R:{_:"0"},M:{"0":0.26957},O:{"0":0.24261},Q:{"1.2":0.01155},S:{"2.5":0},H:{"0":0.36094},L:{"0":43.67266}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DE.js b/website/www/node_modules/caniuse-lite/data/regions/DE.js new file mode 100644 index 000000000000..b91ebe066448 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0108,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0054,"35":0,"36":0,"37":0,"38":0.0108,"39":0.0054,"40":0.0054,"41":0.0054,"42":0,"43":0.0054,"44":0,"45":0,"46":0,"47":0.0054,"48":0.0108,"49":0.2754,"50":0.0054,"51":0.0108,"52":0,"53":0.0108,"54":0.0054,"55":0.0054,"56":0.0162,"57":0.0108,"58":0.0108,"59":0.0054,"60":0.0162,"61":0.0162,"62":0.0054,"63":0.027,"64":0.0054,"65":0.1242,"66":0.0324,"67":0.0162,"68":0.0108,"69":0.0324,"70":0.1512,"71":0.2052,"72":0.1728,"73":0.135,"74":0.0378,"75":0.0594,"76":0.0486,"77":0.0432,"78":0.0972,"79":0.162,"80":7.1388,"81":3.6828,"83":0.0108,"84":0.0054,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.0054,"24":0.0054,"25":0,"26":0.027,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.1566,"39":0,"40":0,"41":0.0054,"42":0.0054,"43":0.0054,"44":0,"45":0.0108,"46":0,"47":0.0108,"48":0.027,"49":0.0054,"50":0.0108,"51":0.0162,"52":0.1296,"53":0,"54":0.0108,"55":0.0054,"56":0.0162,"57":0.0054,"58":0.0108,"59":0.0054,"60":0.0432,"61":0.0108,"62":0.0054,"63":0.027,"64":0.027,"65":0.0324,"66":0.027,"67":0.0162,"68":0.6048,"69":0.0162,"70":0.0756,"71":0.0216,"72":0.081,"73":0.0648,"74":1.917,"75":3.5478,"76":0.0162,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0054,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0054,"47":0.0054,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0108,"57":0.0108,"58":0.0162,"60":0,"62":0,"63":0,"64":0,"65":0.0054,"66":0.0054,"67":1.0746,"68":0.0162,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0108},G:{"8":0.00207,"3.2":0.00207,"4.0-4.1":0,"4.2-4.3":0.00414,"5.0-5.1":0.02072,"6.0-6.1":0.00621,"7.0-7.1":0.02072,"8.1-8.4":0.029,"9.0-9.2":0.02486,"9.3":0.29831,"10.0-10.2":0.07665,"10.3":0.26309,"11.0-11.2":0.16987,"11.3-11.4":0.28795,"12.0-12.1":0.35631,"12.2-12.4":2.33468,"13.0-13.1":0.49718,"13.2":0.24238,"13.3":13.57307,"13.4":2.51491},E:{"4":0,"5":0,"6":0,"7":0.0054,"8":0.0054,"9":0,"10":0.0108,"11":0.0162,"12":0.0594,"13":1.5552,_:"0","3.1":0,"3.2":0,"5.1":0.0162,"6.1":0.0054,"7.1":0,"9.1":0.0162,"10.1":0.0486,"11.1":0.1134,"12.1":0.1944,"13.1":1.1178},I:{"3":0.00158,"4":0.01418,_:"81","2.1":0,"2.2":0.00473,"2.3":0.00158,"4.1":0.03151,"4.2-4.3":0.06616,"4.4":0,"4.4.3-4.4.4":0.45527},B:{"12":0.0324,"13":0.0054,"14":0.0108,"15":0.0162,"16":0.027,"17":0.0918,"18":2.1006,_:"79 80 81"},P:{"4":0.2834,"5.0-5.4":0.03149,"6.2-6.4":0.0105,"7.2-7.4":0.05248,"8.2":0.03149,"9.2":0.16794,"10.1":0.35688,"11.1":5.24822},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.02854,"7":0.02283,"8":0.03425,"9":0.01713,"10":0.02283,"11":1.07321,"5.5":0},N:{"10":0,"11":0.0276},J:{"7":0,"10":0.0092},R:{_:"0"},M:{"0":0.6072},O:{"0":0.2576},Q:{"1.2":0.0138},S:{"2.5":0},H:{"0":0.33969},L:{"0":39.1714}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DJ.js b/website/www/node_modules/caniuse-lite/data/regions/DJ.js new file mode 100644 index 000000000000..9036f4e44743 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DJ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00275,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00275,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00275,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00275,"45":0,"46":0,"47":0,"48":0.00275,"49":0.02203,"50":0.00275,"51":0.00275,"52":0,"53":0.00826,"54":0,"55":0.00275,"56":0.00275,"57":0,"58":0.02203,"59":0,"60":0,"61":0,"62":0,"63":0.01652,"64":0,"65":0.00275,"66":0.01377,"67":0.00275,"68":0.00551,"69":0.00275,"70":0,"71":0,"72":0.00275,"73":0.00551,"74":0.00826,"75":0.01102,"76":0.00551,"77":0.01377,"78":0.04406,"79":0.08262,"80":3.72892,"81":1.77358,"83":0.01928,"84":0.02479,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00275,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00551,"46":0,"47":0.00275,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00275,"57":0.00275,"58":0,"59":0,"60":0.00275,"61":0,"62":0,"63":0,"64":0,"65":0.00826,"66":0.00275,"67":0,"68":0.01928,"69":0,"70":0,"71":0,"72":0.00826,"73":0.08262,"74":0.11291,"75":0.25337,"76":0.00551,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00551,"44":0,"45":0,"46":0,"47":0.01102,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.09914,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00088,"3.2":0.00088,"4.0-4.1":0,"4.2-4.3":0.00177,"5.0-5.1":0.00885,"6.0-6.1":0.00265,"7.0-7.1":0.00885,"8.1-8.4":0.01239,"9.0-9.2":0.01062,"9.3":0.12742,"10.0-10.2":0.03274,"10.3":0.11238,"11.0-11.2":0.07256,"11.3-11.4":0.123,"12.0-12.1":0.1522,"12.2-12.4":0.99725,"13.0-13.1":0.21237,"13.2":0.10353,"13.3":5.79769,"13.4":1.07424},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00551,"13":0.2038,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01377,"10.1":0.00826,"11.1":0.01928,"12.1":0.01377,"13.1":0.05233},I:{"3":0.00139,"4":0.01248,_:"81","2.1":0,"2.2":0.00416,"2.3":0.00139,"4.1":0.02773,"4.2-4.3":0.05824,"4.4":0,"4.4.3-4.4.4":0.40072},B:{"12":0.01652,"13":0.00275,"14":0.00826,"15":0.00551,"16":0.00826,"17":0.00826,"18":0.23134,_:"79 80 81"},P:{"4":1.46882,"5.0-5.4":0.0918,"6.2-6.4":0.2958,"7.2-7.4":1.05061,"8.2":0.0612,"9.2":0.93841,"10.1":1.18322,"11.1":4.19226},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0149,"9":0,"10":0,"11":0.23846,"5.5":0},N:{"10":0.02174,"11":0},J:{"7":0,"10":0.00725},R:{_:"0"},M:{"0":0.08695},O:{"0":1.55789},Q:{"1.2":1.85498},S:{"2.5":0},H:{"0":0.67228},L:{"0":66.04328}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DK.js b/website/www/node_modules/caniuse-lite/data/regions/DK.js new file mode 100644 index 000000000000..5abfbc957ca2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01275,"39":0,"40":0.01912,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.14023,"50":0,"51":0,"52":0.00637,"53":0.01275,"54":0,"55":0,"56":0,"57":0.00637,"58":0.01275,"59":0.0255,"60":0.05099,"61":0,"62":0.00637,"63":0.01275,"64":0.00637,"65":0.01912,"66":0.01912,"67":0.04462,"68":0.01275,"69":0.12748,"70":0.0255,"71":0.03824,"72":0.03187,"73":0.05099,"74":0.03187,"75":0.05099,"76":0.10836,"77":0.05099,"78":0.10198,"79":0.42068,"80":16.75087,"81":8.10135,"83":0.00637,"84":0.00637,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00637,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00637,"49":0,"50":0,"51":0,"52":0.01912,"53":0,"54":0,"55":0,"56":0.03187,"57":0,"58":0.0255,"59":0,"60":0.00637,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00637,"67":0.00637,"68":0.1466,"69":0.00637,"70":0.01275,"71":0.01275,"72":0.0255,"73":0.0255,"74":0.64377,"75":1.17282,"76":0.00637,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.29958,"68":0.00637,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00323,"3.2":0.00323,"4.0-4.1":0,"4.2-4.3":0.00645,"5.0-5.1":0.03227,"6.0-6.1":0.00968,"7.0-7.1":0.03227,"8.1-8.4":0.04518,"9.0-9.2":0.03872,"9.3":0.46468,"10.0-10.2":0.1194,"10.3":0.40982,"11.0-11.2":0.26461,"11.3-11.4":0.44855,"12.0-12.1":0.55503,"12.2-12.4":3.63677,"13.0-13.1":0.77447,"13.2":0.37755,"13.3":21.14293,"13.4":3.91751},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01275,"11":0.03187,"12":0.12111,"13":3.68417,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.00637,"7.1":0,"9.1":0.05099,"10.1":0.08286,"11.1":0.21034,"12.1":0.47168,"13.1":1.86758},I:{"3":0.00048,"4":0.00435,_:"81","2.1":0,"2.2":0.00145,"2.3":0.00048,"4.1":0.00966,"4.2-4.3":0.02028,"4.4":0,"4.4.3-4.4.4":0.13956},B:{"12":0,"13":0.00637,"14":0.00637,"15":0.01275,"16":0.0255,"17":0.08286,"18":2.02693,_:"79 80 81"},P:{"4":0.0421,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02105,"8.2":0.01053,"9.2":0.07368,"10.1":0.14735,"11.1":2.08396},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00645,"8":0.00645,"9":0.00645,"10":0.0129,"11":1.08321,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24657},O:{"0":0.05802},Q:{"1.2":0.01813},S:{"2.5":0},H:{"0":0.07552},L:{"0":23.9415}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DM.js b/website/www/node_modules/caniuse-lite/data/regions/DM.js new file mode 100644 index 000000000000..83bfd9c7a615 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.03893,"39":0.00433,"40":0,"41":0,"42":0.00865,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03893,"50":0.00865,"51":0,"52":0,"53":0.01298,"54":0,"55":0.02163,"56":0.00433,"57":0.00865,"58":0.00433,"59":0,"60":0.00433,"61":0.173,"62":0,"63":0.01298,"64":0,"65":0.02595,"66":0.00433,"67":0,"68":0.02595,"69":0.00865,"70":0.0173,"71":0.01298,"72":0.03028,"73":0.12543,"74":0.0173,"75":0.0692,"76":0.15138,"77":0.01298,"78":0.02163,"79":0.04758,"80":7.10598,"81":3.81898,"83":0.00865,"84":0.0346,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00433,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.07785,"69":0,"70":0,"71":0,"72":0.00433,"73":0,"74":0.12975,"75":0.26383,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.02163,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.0346,"67":0.26383,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00102,"3.2":0.00102,"4.0-4.1":0,"4.2-4.3":0.00204,"5.0-5.1":0.01019,"6.0-6.1":0.00306,"7.0-7.1":0.01019,"8.1-8.4":0.01427,"9.0-9.2":0.01223,"9.3":0.14679,"10.0-10.2":0.03772,"10.3":0.12946,"11.0-11.2":0.08359,"11.3-11.4":0.14169,"12.0-12.1":0.17533,"12.2-12.4":1.14881,"13.0-13.1":0.24465,"13.2":0.11926,"13.3":6.67881,"13.4":1.2375},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.66173,_:"0","3.1":0,"3.2":0,"5.1":0.09948,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01298,"11.1":0.00433,"12.1":0.09515,"13.1":0.22923},I:{"3":0.00291,"4":0.02621,_:"81","2.1":0,"2.2":0.00874,"2.3":0.00291,"4.1":0.05825,"4.2-4.3":0.12233,"4.4":0,"4.4.3-4.4.4":0.84174},B:{"12":0.00433,"13":0.00433,"14":0.01298,"15":0.03028,"16":0.02163,"17":0.04325,"18":1.5397,_:"79 80 81"},P:{"4":0.09563,"5.0-5.4":0,"6.2-6.4":0.11688,"7.2-7.4":0.31877,"8.2":0.01063,"9.2":0.24439,"10.1":0.49941,"11.1":3.79341},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.73093,"5.5":0},N:{"10":0,"11":0.08513},J:{"7":0,"10":0.1589},R:{_:"0"},M:{"0":0.16458},O:{"0":0.1589},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.10745},L:{"0":64.21868}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DO.js b/website/www/node_modules/caniuse-lite/data/regions/DO.js new file mode 100644 index 000000000000..a40ed4b2a4d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.0051,"36":0.0102,"37":0,"38":0.03059,"39":0,"40":0,"41":0,"42":0.0051,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.0102,"49":0.5048,"50":0,"51":0,"52":0,"53":0.0153,"54":0,"55":0.0051,"56":0.0051,"57":0,"58":0.0051,"59":0,"60":0,"61":0.04589,"62":0.0051,"63":0.0204,"64":0.0051,"65":0.03059,"66":0.0051,"67":0.0153,"68":0.0153,"69":0.0153,"70":0.13767,"71":0.25495,"72":0.16827,"73":0.17337,"74":0.03059,"75":0.07139,"76":0.05609,"77":0.06119,"78":0.06629,"79":0.16317,"80":11.41156,"81":5.79756,"83":0.0255,"84":0.0051,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.0051,"49":0,"50":0,"51":0,"52":0.0102,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.0102,"63":0.04589,"64":0.0255,"65":0.0153,"66":0.0255,"67":0,"68":0.08158,"69":0,"70":0.0051,"71":0.0051,"72":0.0153,"73":0.03569,"74":0.33144,"75":0.5201,"76":0.0153,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0051,"57":0.0102,"58":0.0204,"60":0,"62":0,"63":0,"64":0,"65":0.0051,"66":0.0051,"67":0.70876,"68":0.0102,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.002,"3.2":0.002,"4.0-4.1":0,"4.2-4.3":0.00399,"5.0-5.1":0.01997,"6.0-6.1":0.00599,"7.0-7.1":0.01997,"8.1-8.4":0.02796,"9.0-9.2":0.02396,"9.3":0.28756,"10.0-10.2":0.07389,"10.3":0.25361,"11.0-11.2":0.16375,"11.3-11.4":0.27758,"12.0-12.1":0.34348,"12.2-12.4":2.25056,"13.0-13.1":0.47927,"13.2":0.23364,"13.3":13.08402,"13.4":2.4243},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0051,"11":0.0153,"12":0.09178,"13":0.84643,_:"0","3.1":0,"3.2":0,"5.1":0.5048,"6.1":0,"7.1":0,"9.1":0,"10.1":0.04079,"11.1":0.08668,"12.1":0.28045,"13.1":0.71896},I:{"3":0.00243,"4":0.02188,_:"81","2.1":0,"2.2":0.00729,"2.3":0.00243,"4.1":0.04861,"4.2-4.3":0.10209,"4.4":0,"4.4.3-4.4.4":0.70245},B:{"12":0.0051,"13":0.0051,"14":0.0051,"15":0.0051,"16":0.0102,"17":0.07139,"18":0.5201,_:"79 80 81"},P:{"4":0.21905,"5.0-5.4":0.01043,"6.2-6.4":0.02086,"7.2-7.4":0.06259,"8.2":0.01043,"9.2":0.10431,"10.1":0.17733,"11.1":1.3456},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03523,"9":0.00587,"10":0.01174,"11":0.14092,"5.5":0},N:{"10":0,"11":0.03431},J:{"7":0,"10":0.0049},R:{_:"0"},M:{"0":0.13233},O:{"0":0.10292},Q:{"1.2":0.0049},S:{"2.5":0},H:{"0":0.0928},L:{"0":50.58934}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/DZ.js b/website/www/node_modules/caniuse-lite/data/regions/DZ.js new file mode 100644 index 000000000000..3d19a2f28de0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/DZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00968,"12":0,"13":0.00484,"14":0,"15":0,"16":0,"17":0,"18":0.00484,"19":0,"20":0,"21":0,"22":0.00484,"23":0,"24":0,"25":0,"26":0.00968,"27":0,"28":0.00484,"29":0.00484,"30":0.00484,"31":0.00484,"32":0.00484,"33":0.02419,"34":0.00484,"35":0.00484,"36":0.00484,"37":0,"38":0.00968,"39":0.00484,"40":0.03387,"41":0,"42":0.00968,"43":0.2419,"44":0.00484,"45":0.00484,"46":0.00484,"47":0.00484,"48":0.01451,"49":0.33382,"50":0.01451,"51":0.01451,"52":0.00484,"53":0.00968,"54":0.00484,"55":0.00484,"56":0.01935,"57":0.00968,"58":0.02419,"59":0.00484,"60":0.00968,"61":0.04354,"62":0.01451,"63":0.08225,"64":0.00968,"65":0.02903,"66":0.00968,"67":0.01935,"68":0.01451,"69":0.04838,"70":0.05322,"71":0.09192,"72":0.06773,"73":0.08708,"74":0.09192,"75":0.05322,"76":0.06289,"77":0.05806,"78":0.10644,"79":0.2806,"80":8.94546,"81":4.68318,"83":0.01935,"84":0.00968,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00484,"27":0,"28":0,"29":0,"30":0.00484,"31":0,"32":0,"33":0.00484,"34":0.00484,"35":0,"36":0.00484,"37":0,"38":0.00484,"39":0,"40":0,"41":0.00484,"42":0,"43":0.01451,"44":0.00484,"45":0.00484,"46":0,"47":0.02419,"48":0.00968,"49":0.00484,"50":0.00484,"51":0,"52":0.12095,"53":0,"54":0,"55":0.00484,"56":0.00968,"57":0.00484,"58":0.00484,"59":0,"60":0.00484,"61":0.00968,"62":0,"63":0.00484,"64":0.00484,"65":0.00968,"66":0.00968,"67":0.00484,"68":0.1403,"69":0.00968,"70":0.01451,"71":0.01451,"72":0.04354,"73":0.02419,"74":0.79343,"75":1.35948,"76":0.04838,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00484,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00484,"37":0.01935,"38":0,"39":0,"40":0,"41":0,"42":0.00484,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00484,"57":0.00484,"58":0,"60":0,"62":0,"63":0.00484,"64":0,"65":0.01451,"66":0.01451,"67":1.18047,"68":0.02903,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00029,"3.2":0.00029,"4.0-4.1":0,"4.2-4.3":0.00059,"5.0-5.1":0.00294,"6.0-6.1":0.00088,"7.0-7.1":0.00294,"8.1-8.4":0.00411,"9.0-9.2":0.00353,"9.3":0.04231,"10.0-10.2":0.01087,"10.3":0.03732,"11.0-11.2":0.02409,"11.3-11.4":0.04084,"12.0-12.1":0.05054,"12.2-12.4":0.33114,"13.0-13.1":0.07052,"13.2":0.03438,"13.3":1.92515,"13.4":0.35671},E:{"4":0.00484,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00968,"12":0.01935,"13":0.1016,_:"0","3.1":0,"3.2":0,"5.1":0.00484,"6.1":0,"7.1":0,"9.1":0.00484,"10.1":0.01451,"11.1":0.02419,"12.1":0.04354,"13.1":0.07257},I:{"3":0.00196,"4":0.01767,_:"81","2.1":0,"2.2":0.00589,"2.3":0.00196,"4.1":0.03926,"4.2-4.3":0.08244,"4.4":0,"4.4.3-4.4.4":0.56726},B:{"12":0.01451,"13":0.00968,"14":0.01451,"15":0.00968,"16":0.00968,"17":0.02903,"18":0.21287,_:"79 80 81"},P:{"4":0.23614,"5.0-5.4":0.05133,"6.2-6.4":0.05133,"7.2-7.4":0.1848,"8.2":0.04107,"9.2":0.25667,"10.1":0.36961,"11.1":1.59136},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.11728,"9":0.02199,"10":0.02199,"11":0.27122,"5.5":0},N:{"10":0,"11":0.05162},J:{"7":0,"10":0.00516},R:{_:"0"},M:{"0":0.19099},O:{"0":0.94465},Q:{"1.2":0.05162},S:{"2.5":0},H:{"0":0.53758},L:{"0":68.06981}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/EC.js b/website/www/node_modules/caniuse-lite/data/regions/EC.js new file mode 100644 index 000000000000..50fbeb84f370 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/EC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.02525,"23":0,"24":0,"25":0,"26":0.01262,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00631,"35":0,"36":0.00631,"37":0,"38":0.11362,"39":0,"40":0,"41":0,"42":0.00631,"43":0,"44":0,"45":0,"46":0,"47":0.01262,"48":0.00631,"49":0.2083,"50":0,"51":0.00631,"52":0.00631,"53":0.07574,"54":0,"55":0.00631,"56":0.00631,"57":0.01262,"58":0.01262,"59":0,"60":0.00631,"61":0.00631,"62":0.01262,"63":0.03156,"64":0.00631,"65":0.0505,"66":0.02525,"67":0.04418,"68":0.01262,"69":0.02525,"70":0.08837,"71":0.07574,"72":0.07574,"73":0.07574,"74":0.07574,"75":0.10099,"76":0.07574,"77":0.06943,"78":0.13255,"79":0.22723,"80":17.04871,"81":10.77458,"83":0.01262,"84":0.01262,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00631,"48":0.01262,"49":0,"50":0,"51":0.00631,"52":0.02525,"53":0,"54":0,"55":0,"56":0.01262,"57":0.00631,"58":0,"59":0,"60":0.01262,"61":0.00631,"62":0,"63":0.01262,"64":0.01894,"65":0.00631,"66":0.02525,"67":0.00631,"68":0.1073,"69":0.01262,"70":0.01262,"71":0.01262,"72":0.03787,"73":0.03787,"74":1.14247,"75":2.12083,"76":0.03156,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00631,"67":0.9973,"68":0.01894,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00073,"3.2":0.00073,"4.0-4.1":0,"4.2-4.3":0.00146,"5.0-5.1":0.0073,"6.0-6.1":0.00219,"7.0-7.1":0.0073,"8.1-8.4":0.01021,"9.0-9.2":0.00876,"9.3":0.10507,"10.0-10.2":0.027,"10.3":0.09266,"11.0-11.2":0.05983,"11.3-11.4":0.10142,"12.0-12.1":0.1255,"12.2-12.4":0.82229,"13.0-13.1":0.17511,"13.2":0.08537,"13.3":4.78051,"13.4":0.88577},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00631,"9":0,"10":0.01262,"11":0.03156,"12":0.15149,"13":0.93418,_:"0","3.1":0,"3.2":0,"5.1":0.78269,"6.1":0,"7.1":0,"9.1":0.01894,"10.1":0.08837,"11.1":0.16411,"12.1":0.37241,"13.1":1.17403},I:{"3":0.00122,"4":0.01097,_:"81","2.1":0,"2.2":0.00366,"2.3":0.00122,"4.1":0.02437,"4.2-4.3":0.05118,"4.4":0,"4.4.3-4.4.4":0.35215},B:{"12":0.00631,"13":0.00631,"14":0.00631,"15":0.00631,"16":0.00631,"17":0.02525,"18":0.44184,_:"79 80 81"},P:{"4":0.40821,"5.0-5.4":0,"6.2-6.4":0.01021,"7.2-7.4":0.08164,"8.2":0.03062,"9.2":0.10205,"10.1":0.24492,"11.1":2.10226},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0247,"9":0.00823,"10":0.00823,"11":0.14819,"5.5":0},N:{"10":0,"11":0.04057},J:{"7":0,"10":0.00738},R:{_:"0"},M:{"0":0.14383},O:{"0":0.07007},Q:{"1.2":0.00369},S:{"2.5":0},H:{"0":0.08729},L:{"0":47.45255}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/EE.js b/website/www/node_modules/caniuse-lite/data/regions/EE.js new file mode 100644 index 000000000000..e221ff972824 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/EE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.027,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00675,"37":0,"38":0.00675,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.18222,"50":0,"51":0,"52":0,"53":0.0135,"54":0,"55":0,"56":0.00675,"57":0,"58":0.04049,"59":0.0135,"60":0.0135,"61":0.00675,"62":0,"63":0.00675,"64":0.00675,"65":0.02025,"66":0.00675,"67":0.03375,"68":0.0135,"69":0.49268,"70":0.03375,"71":0.10798,"72":0.18222,"73":0.08774,"74":0.05399,"75":0.07424,"76":0.07424,"77":0.05399,"78":0.16198,"79":0.32395,"80":20.07153,"81":8.89518,"83":0.027,"84":0.00675,_:"85"},C:{"2":0,"3":0,"4":0.00675,"5":0.00675,"6":0.00675,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00675,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00675,"39":0,"40":0,"41":0.0135,"42":0,"43":0,"44":0,"45":0.0135,"46":0.00675,"47":0.00675,"48":0.0135,"49":0.00675,"50":0.00675,"51":0.00675,"52":0.13498,"53":0.00675,"54":0.00675,"55":0.00675,"56":0.03375,"57":0,"58":0.00675,"59":0,"60":0.06074,"61":0.00675,"62":0,"63":0,"64":0.00675,"65":0.02025,"66":0.027,"67":0.04724,"68":0.25646,"69":0.02025,"70":0.027,"71":0.02025,"72":0.06749,"73":0.04049,"74":1.44429,"75":2.40939,"76":0.02025,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00675,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00675,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00675,"67":1.46453,"68":0.02025,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00185,"3.2":0.00185,"4.0-4.1":0,"4.2-4.3":0.00369,"5.0-5.1":0.01847,"6.0-6.1":0.00554,"7.0-7.1":0.01847,"8.1-8.4":0.02585,"9.0-9.2":0.02216,"9.3":0.26591,"10.0-10.2":0.06832,"10.3":0.23451,"11.0-11.2":0.15142,"11.3-11.4":0.25667,"12.0-12.1":0.31761,"12.2-12.4":2.08108,"13.0-13.1":0.44318,"13.2":0.21605,"13.3":12.09869,"13.4":2.24173},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00675,"11":0.027,"12":0.12148,"13":1.86947,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00675,"10.1":0.04724,"11.1":0.17547,"12.1":0.39144,"13.1":1.57252},I:{"3":0.0004,"4":0.00361,_:"81","2.1":0,"2.2":0.0012,"2.3":0.0004,"4.1":0.00801,"4.2-4.3":0.01683,"4.4":0,"4.4.3-4.4.4":0.1158},B:{"12":0,"13":0.00675,"14":0.00675,"15":0.0135,"16":0.03375,"17":0.07424,"18":1.35655,_:"79 80 81"},P:{"4":0.06154,"5.0-5.4":0.01026,"6.2-6.4":0,"7.2-7.4":0.03077,"8.2":0.01026,"9.2":0.11282,"10.1":0.31794,"11.1":2.17427},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00684,"9":0.00684,"10":0.00684,"11":1.01883,"5.5":0},N:{"10":0,"11":0.01626},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.26983},O:{"0":0.01951},Q:{"1.2":0.00325},S:{"2.5":0},H:{"0":0.10772},L:{"0":31.16042}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/EG.js b/website/www/node_modules/caniuse-lite/data/regions/EG.js new file mode 100644 index 000000000000..de3755cc6ee4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/EG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.00727,"20":0,"21":0,"22":0,"23":0,"24":0.02181,"25":0,"26":0.02545,"27":0,"28":0,"29":0,"30":0.09451,"31":0.00364,"32":0,"33":0.02545,"34":0,"35":0.01818,"36":0.00364,"37":0,"38":0.00364,"39":0,"40":0.01818,"41":0,"42":0.00364,"43":0.12723,"44":0,"45":0,"46":0.00727,"47":0.00364,"48":0.00364,"49":0.09451,"50":0,"51":0.00727,"52":0,"53":0.01091,"54":0.00727,"55":0.02908,"56":0.03999,"57":0.00364,"58":0.01091,"59":0.00364,"60":0.00364,"61":0.00727,"62":0.00727,"63":0.03999,"64":0.00364,"65":0.00364,"66":0.00364,"67":0.07634,"68":0.00727,"69":0.01091,"70":0.02908,"71":0.04726,"72":0.02545,"73":0.03635,"74":0.08361,"75":0.04726,"76":0.06907,"77":0.0618,"78":0.05816,"79":0.13813,"80":5.91051,"81":2.44999,"83":0.00727,"84":0.00364,_:"85"},C:{"2":0.00727,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00727,"16":0,"17":0,"18":0.00727,"19":0,"20":0,"21":0.00727,"22":0,"23":0.00727,"24":0,"25":0.01454,"26":0,"27":0,"28":0,"29":0,"30":0.00727,"31":0,"32":0.00364,"33":0,"34":0.00364,"35":0,"36":0,"37":0,"38":0.00364,"39":0,"40":0.00364,"41":0.00364,"42":0,"43":0.00364,"44":0,"45":0.00364,"46":0,"47":0.00727,"48":0.01454,"49":0.00364,"50":0.00364,"51":0.01091,"52":0.11269,"53":0,"54":0,"55":0,"56":0.00727,"57":0.00364,"58":0.00364,"59":0,"60":0.00364,"61":0.00364,"62":0.00364,"63":0.00364,"64":0.00364,"65":0.00364,"66":0.00727,"67":0.00364,"68":0.05816,"69":0.00364,"70":0.00364,"71":0.00364,"72":0.02545,"73":0.00727,"74":0.53071,"75":0.77789,"76":0.01818,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00727,"22":0.00364,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00727,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00727,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00364,"52":0,"53":0,"54":0,"55":0,"56":0.01091,"57":0.00364,"58":0,"60":0.00364,"62":0.01091,"63":0.01091,"64":0.01091,"65":0.03635,"66":0.08361,"67":0.22174,"68":0.00364,"9.5-9.6":0,"10.0-10.1":0.00727,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00127,"3.2":0.00127,"4.0-4.1":0,"4.2-4.3":0.00255,"5.0-5.1":0.01274,"6.0-6.1":0.00382,"7.0-7.1":0.01274,"8.1-8.4":0.01783,"9.0-9.2":0.01529,"9.3":0.18343,"10.0-10.2":0.04713,"10.3":0.16178,"11.0-11.2":0.10445,"11.3-11.4":0.17706,"12.0-12.1":0.2191,"12.2-12.4":1.4356,"13.0-13.1":0.30572,"13.2":0.14904,"13.3":8.34608,"13.4":1.54642},E:{"4":0,"5":0.00727,"6":0,"7":0,"8":0.00364,"9":0.00364,"10":0.00364,"11":0.00727,"12":0.01454,"13":0.12723,_:"0","3.1":0,"3.2":0,"5.1":0.2072,"6.1":0,"7.1":0,"9.1":0.00364,"10.1":0.01091,"11.1":0.06543,"12.1":0.05089,"13.1":0.08724},I:{"3":0.00219,"4":0.01968,_:"81","2.1":0,"2.2":0.00656,"2.3":0.00219,"4.1":0.04374,"4.2-4.3":0.09185,"4.4":0,"4.4.3-4.4.4":0.63199},B:{"12":0.00364,"13":0.00364,"14":0.00727,"15":0.00727,"16":0.00727,"17":0.01818,"18":0.14904,_:"79 80 81"},P:{"4":0.29049,"5.0-5.4":0.01037,"6.2-6.4":0.03112,"7.2-7.4":0.10375,"8.2":0.02075,"9.2":0.15562,"10.1":0.26974,"11.1":1.4732},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.04962,"9":0.01908,"10":0.01908,"11":0.06488,"5.5":0},N:{"10":0.01273,"11":0.03819},J:{"7":0,"10":0.00637},R:{_:"0"},M:{"0":0.09548},O:{"0":0.46465},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.58452},L:{"0":68.56306}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ER.js b/website/www/node_modules/caniuse-lite/data/regions/ER.js new file mode 100644 index 000000000000..e450854cd4e2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ER.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.44659,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.33722,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.10937,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.21874,"67":1.00254,"68":0.83849,"69":0.05468,"70":0.28253,"71":0,"72":0,"73":0,"74":0.16405,"75":0.21874,"76":0.16405,"77":0.05468,"78":0,"79":3.94636,"80":11.41073,"81":2.00508,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":2.72509,"8":0,"9":0,"10":0.28253,"11":0,"12":0,"13":0,"14":0,"15":0.21874,"16":0,"17":0,"18":0.21874,"19":0,"20":0.50127,"21":0,"22":0,"23":0.21874,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.10937,"32":0,"33":0.3919,"34":0,"35":0,"36":0.3919,"37":0.05468,"38":0.21874,"39":0,"40":1.50381,"41":0,"42":0.3919,"43":2.95294,"44":0,"45":1.22128,"46":0.10937,"47":1.89571,"48":0.10937,"49":0.3919,"50":0.21874,"51":1.16659,"52":0.55595,"53":0,"54":0.33722,"55":0.05468,"56":0.66532,"57":1.9504,"58":0.10937,"59":0.28253,"60":0.3919,"61":0.28253,"62":2.11445,"63":0,"64":0.89317,"65":0.3919,"66":0.10937,"67":0.21874,"68":3.72763,"69":0.66532,"70":8.84969,"71":0.16405,"72":2.22382,"73":0.61064,"74":4.33826,"75":4.06484,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.21874,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":8.23906,"68":0.33722,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00005,"3.2":0.00005,"4.0-4.1":0,"4.2-4.3":0.0001,"5.0-5.1":0.00052,"6.0-6.1":0.00016,"7.0-7.1":0.00052,"8.1-8.4":0.00072,"9.0-9.2":0.00062,"9.3":0.00746,"10.0-10.2":0.00192,"10.3":0.00658,"11.0-11.2":0.00425,"11.3-11.4":0.0072,"12.0-12.1":0.00891,"12.2-12.4":0.05835,"13.0-13.1":0.01243,"13.2":0.00606,"13.3":0.33923,"13.4":0.06285},E:{"4":0,"5":0,"6":0,"7":0,"8":0.05468,"9":0,"10":0.16405,"11":0,"12":0,"13":0.21874,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0},I:{"3":0,"4":0,_:"81","2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},B:{"12":0.50127,"13":0,"14":0.10937,"15":0.05468,"16":0.72001,"17":0,"18":0.94786,_:"79 80 81"},P:{"4":0.18025,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.12017,"8.2":0,"9.2":0.4306,"10.1":0,"11.1":1.65232},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.50127,"8":0,"9":0,"10":0,"11":0.83849,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.06113},O:{"0":0.48907},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":10.85956}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ES.js b/website/www/node_modules/caniuse-lite/data/regions/ES.js new file mode 100644 index 000000000000..08f68b7515ec --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ES.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00523,"35":0,"36":0,"37":0,"38":0.01046,"39":0,"40":0.00523,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00523,"47":0,"48":0,"49":0.32936,"50":0,"51":0.00523,"52":0,"53":0.02091,"54":0.02091,"55":0,"56":0.00523,"57":0.00523,"58":0.01046,"59":0.00523,"60":0,"61":0.00523,"62":0.00523,"63":0.02091,"64":0.00523,"65":0.02091,"66":0.01046,"67":0.03137,"68":0.01046,"69":0.01568,"70":0.04182,"71":0.06796,"72":0.04705,"73":0.04182,"74":0.02614,"75":0.04705,"76":0.0366,"77":0.04182,"78":0.06796,"79":0.11502,"80":10.91084,"81":6.3102,"83":0.01046,"84":0.00523,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00523,"46":0,"47":0.00523,"48":0.01568,"49":0.00523,"50":0,"51":0,"52":0.07319,"53":0,"54":0,"55":0.00523,"56":0.01046,"57":0.00523,"58":0.00523,"59":0.00523,"60":0.01568,"61":0.00523,"62":0.00523,"63":0.00523,"64":0.01046,"65":0.01046,"66":0.01568,"67":0.01046,"68":0.18821,"69":0.01568,"70":0.00523,"71":0.00523,"72":0.03137,"73":0.02091,"74":0.79988,"75":1.57363,"76":0.01046,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00523,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00523,"56":0.00523,"57":0.00523,"58":0.00523,"60":0,"62":0,"63":0,"64":0.01046,"65":0,"66":0,"67":0.43392,"68":0.01046,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00156,"3.2":0.00156,"4.0-4.1":0,"4.2-4.3":0.00312,"5.0-5.1":0.01559,"6.0-6.1":0.00468,"7.0-7.1":0.01559,"8.1-8.4":0.02183,"9.0-9.2":0.01871,"9.3":0.22453,"10.0-10.2":0.05769,"10.3":0.19803,"11.0-11.2":0.12786,"11.3-11.4":0.21674,"12.0-12.1":0.26819,"12.2-12.4":1.75729,"13.0-13.1":0.37422,"13.2":0.18243,"13.3":10.21632,"13.4":1.89295},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00523,"9":0.00523,"10":0.00523,"11":0.02091,"12":0.05228,"13":1.1397,_:"0","3.1":0,"3.2":0,"5.1":0.01568,"6.1":0,"7.1":0,"9.1":0.01046,"10.1":0.05228,"11.1":0.11502,"12.1":0.19866,"13.1":0.89399},I:{"3":0.00083,"4":0.00748,_:"81","2.1":0,"2.2":0.00249,"2.3":0.00083,"4.1":0.01661,"4.2-4.3":0.03489,"4.4":0,"4.4.3-4.4.4":0.24006},B:{"12":0.00523,"13":0.00523,"14":0.00523,"15":0.00523,"16":0.01046,"17":0.04182,"18":1.12925,_:"79 80 81"},P:{"4":0.11392,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03107,"8.2":0.01036,"9.2":0.08285,"10.1":0.15534,"11.1":2.04018},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01654,"9":0.01654,"10":0.00551,"11":0.66718,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2386},O:{"0":0.05726},Q:{"1.2":0.01432},S:{"2.5":0},H:{"0":0.18071},L:{"0":53.06697}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ET.js b/website/www/node_modules/caniuse-lite/data/regions/ET.js new file mode 100644 index 000000000000..5f535a969ba0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ET.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03507,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.0039,"24":0,"25":0.0039,"26":0.01169,"27":0,"28":0.0039,"29":0,"30":0.0039,"31":0.0039,"32":0,"33":0.05846,"34":0.0039,"35":0,"36":0.01169,"37":0.0039,"38":0.0039,"39":0.0039,"40":0.06235,"41":0,"42":0,"43":0.2572,"44":0.0039,"45":0,"46":0.0039,"47":0,"48":0.0039,"49":0.01949,"50":0.01559,"51":0.00779,"52":0,"53":0.01559,"54":0.0039,"55":0.01169,"56":0.00779,"57":0.00779,"58":0.01169,"59":0.01559,"60":0.00779,"61":0.02338,"62":0.0039,"63":0.08573,"64":0.00779,"65":0.01559,"66":0.0039,"67":0.04676,"68":0.00779,"69":0.04676,"70":0.02728,"71":0.01559,"72":0.01559,"73":0.03897,"74":0.09353,"75":0.03118,"76":0.03118,"77":0.05456,"78":0.07015,"79":0.21434,"80":4.23604,"81":2.54084,"83":0.01949,"84":0.00779,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0.0039,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0039,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.0039,"21":0,"22":0,"23":0.0039,"24":0.0039,"25":0.0039,"26":0.0039,"27":0.0039,"28":0,"29":0.00779,"30":0.00779,"31":0.00779,"32":0.0039,"33":0.00779,"34":0.00779,"35":0.01169,"36":0.0039,"37":0.00779,"38":0.00779,"39":0.0039,"40":0.0039,"41":0.0039,"42":0.01169,"43":0.02728,"44":0.01949,"45":0.00779,"46":0.00779,"47":0.04676,"48":0.01559,"49":0.01169,"50":0.0039,"51":0.0039,"52":0.05066,"53":0.0039,"54":0.0039,"55":0.0039,"56":0.01949,"57":0.00779,"58":0.00779,"59":0.00779,"60":0.01559,"61":0.0039,"62":0.0039,"63":0.0039,"64":0.00779,"65":0.00779,"66":0.03118,"67":0.00779,"68":0.12081,"69":0.01949,"70":0.01559,"71":0.01559,"72":0.05846,"73":0.05456,"74":0.62742,"75":1.34447,"76":0.17537,"77":0.0039,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.0039,"15":0.0039,"16":0.0039,"17":0,"18":0.0039,"19":0.00779,"20":0.03897,"21":0.0039,"22":0,"23":0.01949,"24":0.0039,"25":0,"26":0,"27":0,"28":0.01169,"29":0.00779,"30":0.00779,"31":0,"32":0.00779,"33":0.0039,"34":0.0039,"35":0.0039,"36":0.0039,"37":0.0039,"38":0.0039,"39":0,"40":0.0039,"41":0,"42":0.01169,"43":0.0039,"44":0,"45":0.01169,"46":0.03118,"47":0.05066,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.02338,"54":0.01169,"55":0,"56":0.0039,"57":0.00779,"58":0.0039,"60":0,"62":0.0039,"63":0.00779,"64":0.0039,"65":0.07015,"66":0.02728,"67":0.93138,"68":0.04287,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.08184},G:{"8":0.00036,"3.2":0.00036,"4.0-4.1":0,"4.2-4.3":0.00071,"5.0-5.1":0.00356,"6.0-6.1":0.00107,"7.0-7.1":0.00356,"8.1-8.4":0.00498,"9.0-9.2":0.00427,"9.3":0.05126,"10.0-10.2":0.01317,"10.3":0.04521,"11.0-11.2":0.02919,"11.3-11.4":0.04948,"12.0-12.1":0.06122,"12.2-12.4":0.40116,"13.0-13.1":0.08543,"13.2":0.04165,"13.3":2.33221,"13.4":0.43213},E:{"4":0,"5":0,"6":0,"7":0.01169,"8":0,"9":0,"10":0.00779,"11":0.01169,"12":0.06625,"13":0.20264,_:"0","3.1":0,"3.2":0,"5.1":0.0039,"6.1":0,"7.1":0,"9.1":0.0039,"10.1":0.00779,"11.1":0.03118,"12.1":0.03507,"13.1":0.08963},I:{"3":0.00252,"4":0.0227,_:"81","2.1":0,"2.2":0.00757,"2.3":0.00252,"4.1":0.05044,"4.2-4.3":0.10592,"4.4":0,"4.4.3-4.4.4":0.72885},B:{"12":0.08573,"13":0.03507,"14":0.01949,"15":0.01949,"16":0.03118,"17":0.06235,"18":0.54948,_:"79 80 81"},P:{"4":0.69465,"5.0-5.4":0.15323,"6.2-6.4":0.08172,"7.2-7.4":0.41883,"8.2":0.05108,"9.2":0.43927,"10.1":0.48013,"11.1":1.00112},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02858,"9":0.00572,"10":0.01143,"11":0.29721,"5.5":0},N:{"10":0.01526,"11":0.04577},J:{"7":0,"10":0.0061},R:{_:"0"},M:{"0":0.2075},O:{"0":5.62086},Q:{"1.2":0.06103},S:{"2.5":0},H:{"0":17.92313},L:{"0":41.73474}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FI.js b/website/www/node_modules/caniuse-lite/data/regions/FI.js new file mode 100644 index 000000000000..4a97a57923ae --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00591,"34":0,"35":0,"36":0,"37":0,"38":0.01181,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00591,"49":0.20671,"50":0.00591,"51":0.00591,"52":0.01181,"53":0.01772,"54":0,"55":0.00591,"56":0.02362,"57":0.00591,"58":0.00591,"59":0.03544,"60":0.12993,"61":0.00591,"62":0.00591,"63":0.03544,"64":0.07087,"65":0.01181,"66":0.04725,"67":0.02362,"68":0.01181,"69":0.14765,"70":0.31302,"71":0.2953,"72":0.30121,"73":0.18899,"74":0.02362,"75":0.03544,"76":0.08268,"77":0.05315,"78":0.07678,"79":0.37798,"80":13.05226,"81":5.97687,"83":0.01181,"84":0.00591,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00591,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01772,"38":0,"39":0,"40":0,"41":0,"42":0.00591,"43":0,"44":0.00591,"45":0,"46":0,"47":0.00591,"48":0.01181,"49":0,"50":0.03544,"51":0,"52":0.08268,"53":0,"54":0,"55":0.01772,"56":0.01181,"57":0,"58":0.07678,"59":0.01181,"60":0.01772,"61":0,"62":0.01181,"63":0.02362,"64":0.04134,"65":0.05906,"66":0.01181,"67":0.00591,"68":0.46067,"69":0.00591,"70":0.00591,"71":0.01181,"72":0.05315,"73":0.05315,"74":1.571,"75":2.87032,"76":0.01772,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00591,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00591,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.01181,"57":0.04134,"58":0.01181,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00591,"67":0.56698,"68":0.01181,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00179,"3.2":0.00179,"4.0-4.1":0,"4.2-4.3":0.00358,"5.0-5.1":0.0179,"6.0-6.1":0.00537,"7.0-7.1":0.0179,"8.1-8.4":0.02506,"9.0-9.2":0.02148,"9.3":0.25776,"10.0-10.2":0.06623,"10.3":0.22733,"11.0-11.2":0.14678,"11.3-11.4":0.24881,"12.0-12.1":0.30788,"12.2-12.4":2.01732,"13.0-13.1":0.4296,"13.2":0.20943,"13.3":11.72799,"13.4":2.17304},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00591,"9":0,"10":0.00591,"11":0.03544,"12":0.04725,"13":1.62415,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01181,"10.1":0.05906,"11.1":0.12993,"12.1":0.2008,"13.1":1.05717},I:{"3":0.00062,"4":0.00558,_:"81","2.1":0,"2.2":0.00186,"2.3":0.00062,"4.1":0.0124,"4.2-4.3":0.02605,"4.4":0,"4.4.3-4.4.4":0.17924},B:{"12":0,"13":0,"14":0.01181,"15":0.01181,"16":0.02362,"17":0.07087,"18":1.54147,_:"79 80 81"},P:{"4":0.07341,"5.0-5.4":0.02097,"6.2-6.4":0.01049,"7.2-7.4":0.08389,"8.2":0.03146,"9.2":0.23071,"10.1":0.44044,"11.1":2.26511},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03653,"9":0.00609,"10":0.01218,"11":0.73661,"5.5":0},N:{"10":0,"11":0.02047},J:{"7":0,"10":0.00409},R:{_:"0"},M:{"0":0.45034},O:{"0":0.12282},Q:{"1.2":0.00819},S:{"2.5":0.00819},H:{"0":0.3062},L:{"0":41.39828}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FJ.js b/website/www/node_modules/caniuse-lite/data/regions/FJ.js new file mode 100644 index 000000000000..ada3bc70dbfe --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FJ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00793,"19":0,"20":0,"21":0.00397,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00793,"37":0,"38":0.00397,"39":0.0238,"40":0.00793,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01586,"49":0.04759,"50":0.00397,"51":0,"52":0,"53":0.00397,"54":0,"55":0,"56":0,"57":0,"58":0.0119,"59":0,"60":0.0119,"61":0,"62":0,"63":0.00793,"64":0.00397,"65":0.07932,"66":0.00397,"67":0.00397,"68":0.0119,"69":0.0238,"70":0.05156,"71":0,"72":0.00793,"73":0.01586,"74":0.01983,"75":0.03569,"76":0.03173,"77":0.0119,"78":0.04759,"79":0.23003,"80":6.69857,"81":2.98243,"83":0.00397,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00397,"30":0.00793,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00397,"44":0.00397,"45":0.00397,"46":0,"47":0.00397,"48":0.00397,"49":0,"50":0,"51":0,"52":0.03966,"53":0,"54":0,"55":0,"56":0.00793,"57":0,"58":0.00793,"59":0,"60":0.0119,"61":0.00397,"62":0,"63":0,"64":0,"65":0.00397,"66":0.00397,"67":0.00397,"68":0.07535,"69":0.00397,"70":0.00397,"71":0.01983,"72":0.04759,"73":0.03569,"74":0.46006,"75":0.70595,"76":0.04363,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00397,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00793,"67":0.2102,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00062,"3.2":0.00062,"4.0-4.1":0,"4.2-4.3":0.00123,"5.0-5.1":0.00617,"6.0-6.1":0.00185,"7.0-7.1":0.00617,"8.1-8.4":0.00863,"9.0-9.2":0.0074,"9.3":0.08879,"10.0-10.2":0.02282,"10.3":0.07831,"11.0-11.2":0.05056,"11.3-11.4":0.08571,"12.0-12.1":0.10606,"12.2-12.4":0.69494,"13.0-13.1":0.14799,"13.2":0.07215,"13.3":4.04013,"13.4":0.74858},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00397,"11":0.13484,"12":0.11501,"13":0.45609,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00397,"10.1":0.00793,"11.1":0.02776,"12.1":0.06742,"13.1":0.26176},I:{"3":0.00078,"4":0.00699,_:"81","2.1":0,"2.2":0.00233,"2.3":0.00078,"4.1":0.01554,"4.2-4.3":0.03264,"4.4":0,"4.4.3-4.4.4":0.22457},B:{"12":0.00793,"13":0.01586,"14":0.0119,"15":0.03173,"16":0.0238,"17":0.07535,"18":0.64646,_:"79 80 81"},P:{"4":1.18716,"5.0-5.4":0.04094,"6.2-6.4":0.22515,"7.2-7.4":1.01318,"8.2":0.08187,"9.2":1.08482,"10.1":1.2588,"11.1":13.66262},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00959,"9":0.00959,"10":0.04797,"11":0.64276,"5.5":0},N:{"10":0.00905,"11":0.00905},J:{"7":0,"10":0.00603},R:{_:"0"},M:{"0":0.16895},O:{"0":1.38179},Q:{"1.2":0.0362},S:{"2.5":0},H:{"0":0.2742},L:{"0":50.1646}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FK.js b/website/www/node_modules/caniuse-lite/data/regions/FK.js new file mode 100644 index 000000000000..89c59fc37aaa --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0177,"50":0,"51":0,"52":0,"53":0.39374,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00885,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.07521,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.21235,"76":0,"77":0.96001,"78":0,"79":0,"80":3.69846,"81":2.69422,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00885,"49":0,"50":0,"51":0,"52":0.00885,"53":0.00885,"54":0,"55":0,"56":0.40258,"57":0,"58":0,"59":0.00885,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00885,"67":0,"68":0.2035,"69":0.03097,"70":0,"71":0,"72":0.00885,"73":0,"74":0.77862,"75":2.84906,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.2212,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00241,"3.2":0.00241,"4.0-4.1":0,"4.2-4.3":0.00482,"5.0-5.1":0.02411,"6.0-6.1":0.00723,"7.0-7.1":0.02411,"8.1-8.4":0.03375,"9.0-9.2":0.02893,"9.3":0.34716,"10.0-10.2":0.0892,"10.3":0.30618,"11.0-11.2":0.19769,"11.3-11.4":0.33511,"12.0-12.1":0.41467,"12.2-12.4":2.71703,"13.0-13.1":0.5786,"13.2":0.28207,"13.3":15.79591,"13.4":2.92678},E:{"4":0,"5":0,"6":0,"7":0,"8":0.12387,"9":0.13272,"10":0,"11":0.00885,"12":0.0177,"13":1.08388,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0177,"10.1":0.00885,"11.1":0.03097,"12.1":0.08848,"13.1":0.6636},I:{"3":0.00239,"4":0.02147,_:"81","2.1":0,"2.2":0.00716,"2.3":0.00239,"4.1":0.04772,"4.2-4.3":0.10021,"4.4":0,"4.4.3-4.4.4":0.68955},B:{"12":0,"13":0,"14":0.07521,"15":0.00885,"16":0.0177,"17":0.07521,"18":2.36684,_:"79 80 81"},P:{"4":0.07554,"5.0-5.4":0.07554,"6.2-6.4":0,"7.2-7.4":0.02158,"8.2":0.09713,"9.2":0.56117,"10.1":1.26263,"11.1":7.75921},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.74766,"5.5":0},N:{"10":0,"11":0.09479},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.37359},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.02112},L:{"0":42.2953}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FM.js b/website/www/node_modules/caniuse-lite/data/regions/FM.js new file mode 100644 index 000000000000..6b275f96829e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FM.js @@ -0,0 +1 @@ +module.exports={D:{"35":0.01405,"40":0.02809,"49":0.09364,"50":0.02341,"55":0.2341,"60":0.07023,"62":0.01405,"69":0.02341,"70":0.00936,"71":0.89894,"73":0.04682,"75":0.01405,"77":0.01405,"78":0.12641,"79":0.10769,"80":20.49311,"81":8.27309,"83":0.00936,"84":0.01873,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 41 42 43 44 45 46 47 48 51 52 53 54 56 57 58 59 61 63 64 65 66 67 68 72 74 76 85"},C:{"10":0.00936,"43":0.00936,"47":0.00936,"52":0.04214,"59":0.03746,"64":0.02809,"66":0.00936,"68":0.03277,"71":0.0515,"72":0.29965,"73":0.07023,"74":0.8849,"75":2.36909,_:"2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 48 49 50 51 53 54 55 56 57 58 60 61 62 63 65 67 69 70 76 77 78 3.5 3.6"},F:{"22":0.03277,"67":0.29028,_:"9 11 12 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 68 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00084,"3.2":0.00084,"4.0-4.1":0,"4.2-4.3":0.00169,"5.0-5.1":0.00844,"6.0-6.1":0.00253,"7.0-7.1":0.00844,"8.1-8.4":0.01181,"9.0-9.2":0.01012,"9.3":0.12148,"10.0-10.2":0.03121,"10.3":0.10714,"11.0-11.2":0.06918,"11.3-11.4":0.11726,"12.0-12.1":0.1451,"12.2-12.4":0.95077,"13.0-13.1":0.20247,"13.2":0.0987,"13.3":5.52746,"13.4":1.02417},E:{"4":0,"5":0.02341,"10":0.00936,"11":0.01873,"12":0.04214,"13":2.14904,_:"0 6 7 8 9 3.1 3.2 5.1 6.1 7.1","9.1":0.01405,"10.1":0.103,"11.1":0.12173,"12.1":0.20601,"13.1":0.09364},I:{"3":0.00054,"4":0.00485,_:"81","2.1":0,"2.2":0.00162,"2.3":0.00054,"4.1":0.01078,"4.2-4.3":0.02264,"4.4":0,"4.4.3-4.4.4":0.1558},B:{"12":0.30433,"13":0.08428,"14":0.08428,"15":0.01405,"16":0.11237,"17":0.2856,"18":2.32695,_:"79 80 81"},P:{"4":0.1158,"5.0-5.4":0.01053,"6.2-6.4":0.01031,"7.2-7.4":0.06316,"8.2":0.01031,"9.2":0.12633,"10.1":0.17897,"11.1":3.11613},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"10":0.10044,"11":2.08137,_:"6 7 8 9 5.5"},N:{"10":0,"11":0.03081},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.09572},O:{"0":0.66475},Q:{"1.2":0.06913},S:{"2.5":0},H:{"0":0.39774},L:{"0":42.61258}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FO.js b/website/www/node_modules/caniuse-lite/data/regions/FO.js new file mode 100644 index 000000000000..f8291ab6a23d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00512,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00512,"35":0,"36":0,"37":0,"38":0.01537,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.15884,"50":0,"51":0,"52":0,"53":0.01537,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00512,"61":0.00512,"62":0,"63":0,"64":0,"65":0.00512,"66":0.01537,"67":0.03587,"68":0,"69":0,"70":0.01025,"71":0.0205,"72":0,"73":0,"74":0,"75":0.11273,"76":0.01025,"77":0.07174,"78":0.03587,"79":0.08198,"80":6.35376,"81":3.11027,"83":0.00512,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00512,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01025,"49":0,"50":0.01537,"51":0,"52":0.0205,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00512,"63":0.00512,"64":0,"65":0,"66":0,"67":0,"68":0.2562,"69":0.01025,"70":0.00512,"71":0,"72":0.0205,"73":0.01537,"74":0.52265,"75":0.94794,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.06661,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00467,"3.2":0.00467,"4.0-4.1":0,"4.2-4.3":0.00935,"5.0-5.1":0.04673,"6.0-6.1":0.01402,"7.0-7.1":0.04673,"8.1-8.4":0.06542,"9.0-9.2":0.05607,"9.3":0.67285,"10.0-10.2":0.17288,"10.3":0.59341,"11.0-11.2":0.38315,"11.3-11.4":0.64948,"12.0-12.1":0.80368,"12.2-12.4":5.26596,"13.0-13.1":1.12141,"13.2":0.54669,"13.3":30.61452,"13.4":5.67247},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01025,"9":0,"10":0,"11":0.01537,"12":0.03074,"13":4.15556,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.00512,"7.1":0,"9.1":0.06661,"10.1":0.11273,"11.1":0.15884,"12.1":0.13322,"13.1":0.95306},I:{"3":0.00016,"4":0.00148,_:"81","2.1":0,"2.2":0.00049,"2.3":0.00016,"4.1":0.00329,"4.2-4.3":0.0069,"4.4":0,"4.4.3-4.4.4":0.04751},B:{"12":0,"13":0,"14":0.02562,"15":0.02562,"16":0.01025,"17":0.03587,"18":3.25374,_:"79 80 81"},P:{"4":0.07902,"5.0-5.4":0.01129,"6.2-6.4":0.02258,"7.2-7.4":0.04516,"8.2":0,"9.2":0.28222,"10.1":0.46285,"11.1":6.15246},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00512,"9":0.00512,"10":0.00512,"11":2.17258,"5.5":0},N:{"10":0,"11":0.01463},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24868},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.06463},L:{"0":18.88466}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/FR.js b/website/www/node_modules/caniuse-lite/data/regions/FR.js new file mode 100644 index 000000000000..b557a7956457 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/FR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.0059,"30":0,"31":0,"32":0,"33":0.0059,"34":0,"35":0,"36":0.0059,"37":0,"38":0.0059,"39":0.0059,"40":0.0059,"41":0.0118,"42":0,"43":0.0059,"44":0,"45":0,"46":0.0059,"47":0.0059,"48":0.0118,"49":0.5783,"50":0.0059,"51":0.0059,"52":0.0059,"53":0.0059,"54":0.13572,"55":0.0059,"56":0.0118,"57":0.0118,"58":0.0177,"59":0.0118,"60":0.0118,"61":0.0118,"62":0.0118,"63":0.04131,"64":0.0118,"65":0.02951,"66":0.03541,"67":0.04721,"68":0.02951,"69":0.04721,"70":0.24194,"71":0.34816,"72":0.34226,"73":0.43667,"74":0.04721,"75":0.10032,"76":0.05901,"77":0.05901,"78":0.11802,"79":0.24194,"80":11.04077,"81":5.38171,"83":0.0118,"84":0.0059,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0177,"12":0.0118,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.0059,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0059,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0177,"46":0.0059,"47":0.0059,"48":0.04131,"49":0.0059,"50":0.0059,"51":0.0059,"52":0.11802,"53":0.0059,"54":0.0059,"55":0.0059,"56":0.02951,"57":0.0059,"58":0.0118,"59":0.0118,"60":0.05901,"61":0.0059,"62":0.0118,"63":0.04131,"64":0.04131,"65":0.05901,"66":0.04131,"67":0.0236,"68":0.38947,"69":0.0236,"70":0.0177,"71":0.0177,"72":0.06491,"73":0.04721,"74":1.58737,"75":2.70266,"76":0.0177,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0059,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0059,"47":0.0059,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0177,"57":0.0177,"58":0.02951,"60":0,"62":0,"63":0.0059,"64":0,"65":0.0118,"66":0.0059,"67":0.63731,"68":0.0118,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0059},G:{"8":0.00205,"3.2":0.00205,"4.0-4.1":0,"4.2-4.3":0.00411,"5.0-5.1":0.02054,"6.0-6.1":0.00616,"7.0-7.1":0.02054,"8.1-8.4":0.02876,"9.0-9.2":0.02465,"9.3":0.2958,"10.0-10.2":0.076,"10.3":0.26088,"11.0-11.2":0.16844,"11.3-11.4":0.28553,"12.0-12.1":0.35331,"12.2-12.4":2.31502,"13.0-13.1":0.49299,"13.2":0.24033,"13.3":13.45876,"13.4":2.49373},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0059,"9":0.0059,"10":0.0118,"11":0.02951,"12":0.11802,"13":1.81751,_:"0","3.1":0,"3.2":0,"5.1":0.0118,"6.1":0.0059,"7.1":0,"9.1":0.0236,"10.1":0.09442,"11.1":0.21834,"12.1":0.41897,"13.1":1.35133},I:{"3":0.00101,"4":0.00911,_:"81","2.1":0,"2.2":0.00304,"2.3":0.00101,"4.1":0.02025,"4.2-4.3":0.04252,"4.4":0,"4.4.3-4.4.4":0.29257},B:{"12":0.0059,"13":0.0059,"14":0.0177,"15":0.0177,"16":0.02951,"17":0.09442,"18":1.7821,_:"79 80 81"},P:{"4":0.11552,"5.0-5.4":0.03151,"6.2-6.4":0.021,"7.2-7.4":0.06301,"8.2":0.03151,"9.2":0.17854,"10.1":0.35708,"11.1":2.91962},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01273,"7":0.00637,"8":0.0573,"9":0.04457,"10":0.02547,"11":0.82133,"5.5":0},N:{"10":0,"11":0.0205},J:{"7":0,"10":0.02459},R:{_:"0"},M:{"0":0.35251},O:{"0":0.56156},Q:{"1.2":0.02869},S:{"2.5":0},H:{"0":0.32986},L:{"0":37.59904}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GA.js b/website/www/node_modules/caniuse-lite/data/regions/GA.js new file mode 100644 index 000000000000..45fc24b341ef --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.012,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.004,"39":0,"40":0.016,"41":0,"42":0.004,"43":0,"44":0,"45":0,"46":0.05601,"47":0,"48":0,"49":0.14004,"50":0.004,"51":0,"52":0,"53":0.012,"54":0,"55":0,"56":0.02001,"57":0,"58":0.012,"59":0,"60":0,"61":0,"62":0.004,"63":0.04401,"64":0.004,"65":0.02001,"66":0,"67":0.008,"68":0.004,"69":0.18405,"70":0.008,"71":0.012,"72":0.004,"73":0.13203,"74":0.25206,"75":0.016,"76":0.03201,"77":0.07602,"78":0.04401,"79":0.09202,"80":5.45736,"81":2.3926,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.012,"44":0,"45":0,"46":0,"47":0.004,"48":0.13603,"49":0,"50":0,"51":0,"52":0.016,"53":0,"54":0.03201,"55":0,"56":0.004,"57":0,"58":0,"59":0.004,"60":0.008,"61":0,"62":0,"63":0,"64":0,"65":0.004,"66":0,"67":0.008,"68":0.09202,"69":0.004,"70":0.02001,"71":0.004,"72":0.02401,"73":0.016,"74":0.8162,"75":1.05226,"76":0.012,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.004,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.008,"46":0.02401,"47":0.012,"48":0.04001,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.008,"57":0.004,"58":0,"60":0.016,"62":0,"63":0,"64":0,"65":0.03601,"66":0.02801,"67":1.02026,"68":0.02001,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.008},G:{"8":0.00063,"3.2":0.00063,"4.0-4.1":0,"4.2-4.3":0.00126,"5.0-5.1":0.00631,"6.0-6.1":0.00189,"7.0-7.1":0.00631,"8.1-8.4":0.00883,"9.0-9.2":0.00757,"9.3":0.0908,"10.0-10.2":0.02333,"10.3":0.08008,"11.0-11.2":0.0517,"11.3-11.4":0.08764,"12.0-12.1":0.10845,"12.2-12.4":0.7106,"13.0-13.1":0.15133,"13.2":0.07377,"13.3":4.13119,"13.4":0.76546},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.008,"11":0.03601,"12":0.004,"13":0.30408,_:"0","3.1":0,"3.2":0,"5.1":0.04001,"6.1":0.012,"7.1":0,"9.1":0,"10.1":0.16804,"11.1":0.04401,"12.1":0.08002,"13.1":0.32008},I:{"3":0.00227,"4":0.02047,_:"81","2.1":0,"2.2":0.00682,"2.3":0.00227,"4.1":0.04548,"4.2-4.3":0.09551,"4.4":0,"4.4.3-4.4.4":0.65718},B:{"12":0.04401,"13":0.04801,"14":0.02801,"15":0.016,"16":0.04401,"17":0.10003,"18":0.70818,_:"79 80 81"},P:{"4":1.06578,"5.0-5.4":0.09135,"6.2-6.4":0.1827,"7.2-7.4":0.74097,"8.2":0.0609,"9.2":0.53796,"10.1":1.78645,"11.1":3.01463},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01429,"9":0,"10":0.01429,"11":0.2715,"5.5":0},N:{"10":0.01071,"11":0.13926},J:{"7":0,"10":0.08999},R:{_:"0"},M:{"0":0.14998},O:{"0":1.05582},Q:{"1.2":0.03},S:{"2.5":0},H:{"0":3.47583},L:{"0":59.85931}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GB.js b/website/www/node_modules/caniuse-lite/data/regions/GB.js new file mode 100644 index 000000000000..4e28709682a0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GB.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0046,"35":0.0046,"36":0,"37":0.0046,"38":0.00921,"39":0,"40":0.05063,"41":0.0046,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.13349,"50":0,"51":0.0046,"52":0,"53":0.00921,"54":0.03222,"55":0,"56":0.01381,"57":0.0046,"58":0.00921,"59":0.0046,"60":0.00921,"61":0.00921,"62":0.0046,"63":0.02302,"64":0.0046,"65":0.02302,"66":0.02302,"67":0.01841,"68":0.00921,"69":0.03682,"70":0.03682,"71":0.02762,"72":0.02762,"73":0.03222,"74":0.02302,"75":0.04143,"76":0.05063,"77":0.04143,"78":0.07825,"79":0.16111,"80":7.061,"81":3.6778,"83":0.00921,"84":0.0046,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.0046,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0046,"46":0,"47":0.0046,"48":0.00921,"49":0.0046,"50":0.0046,"51":0,"52":0.03222,"53":0,"54":0,"55":0.0046,"56":0.0046,"57":0,"58":0.0046,"59":0.0046,"60":0.0046,"61":0,"62":0,"63":0.0046,"64":0.0046,"65":0.0046,"66":0.0046,"67":0.0046,"68":0.14269,"69":0.0046,"70":0.0046,"71":0.0046,"72":0.01841,"73":0.01381,"74":0.42348,"75":0.78251,"76":0.00921,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0046,"37":0,"38":0,"39":0,"40":0.0046,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0046,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.0046,"67":0.25317,"68":0.0046,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0046},G:{"8":0.00408,"3.2":0.00408,"4.0-4.1":0,"4.2-4.3":0.00816,"5.0-5.1":0.04078,"6.0-6.1":0.01224,"7.0-7.1":0.04078,"8.1-8.4":0.0571,"9.0-9.2":0.04894,"9.3":0.58729,"10.0-10.2":0.1509,"10.3":0.51796,"11.0-11.2":0.33443,"11.3-11.4":0.5669,"12.0-12.1":0.70149,"12.2-12.4":4.59636,"13.0-13.1":0.97882,"13.2":0.47717,"13.3":26.72169,"13.4":4.95118},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0046,"9":0.0046,"10":0.0046,"11":0.01841,"12":0.05984,"13":1.87802,_:"0","3.1":0,"3.2":0,"5.1":0.0046,"6.1":0,"7.1":0,"9.1":0.01381,"10.1":0.05524,"11.1":0.12888,"12.1":0.22555,"13.1":0.98965},I:{"3":0.0017,"4":0.01526,_:"81","2.1":0,"2.2":0.00509,"2.3":0.0017,"4.1":0.03391,"4.2-4.3":0.07121,"4.4":0,"4.4.3-4.4.4":0.49001},B:{"12":0.0046,"13":0.0046,"14":0.01381,"15":0.01841,"16":0.02302,"17":0.07365,"18":1.82279,_:"79 80 81"},P:{"4":0.08616,"5.0-5.4":0.01077,"6.2-6.4":0,"7.2-7.4":0.03231,"8.2":0.01077,"9.2":0.1077,"10.1":0.24771,"11.1":4.31871},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02496,"9":0.00499,"10":0.00499,"11":0.61408,"5.5":0},N:{"10":0,"11":0.02159},J:{"7":0,"10":0.01079},R:{_:"0"},M:{"0":0.26985},O:{"0":0.19429},Q:{"1.2":0.01079},S:{"2.5":0},H:{"0":0.1635},L:{"0":30.55352}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GD.js b/website/www/node_modules/caniuse-lite/data/regions/GD.js new file mode 100644 index 000000000000..de96c4806411 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GD.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.003,"36":0.012,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.018,"50":0,"51":0,"52":0,"53":0.009,"54":0,"55":0,"56":0,"57":0,"58":0.006,"59":0,"60":0,"61":0,"62":0,"63":0.003,"64":0.006,"65":0,"66":0,"67":0.003,"68":0.003,"69":0.003,"70":0.003,"71":0.003,"72":0,"73":0,"74":0.024,"75":0.009,"76":0.024,"77":0.018,"78":0.015,"79":0.024,"80":3.39,"81":1.53,"83":0.006,"84":0.003,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.003,"53":0,"54":0,"55":0,"56":0,"57":0.003,"58":0,"59":0,"60":0.003,"61":0,"62":0,"63":0,"64":0,"65":0.021,"66":0,"67":0,"68":0.03,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.369,"75":0.291,"76":0.006,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.003,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.003,"66":0,"67":0.15,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00105,"3.2":0.00105,"4.0-4.1":0,"4.2-4.3":0.0021,"5.0-5.1":0.01048,"6.0-6.1":0.00314,"7.0-7.1":0.01048,"8.1-8.4":0.01467,"9.0-9.2":0.01257,"9.3":0.15088,"10.0-10.2":0.03877,"10.3":0.13307,"11.0-11.2":0.08592,"11.3-11.4":0.14564,"12.0-12.1":0.18022,"12.2-12.4":1.18085,"13.0-13.1":0.25147,"13.2":0.12259,"13.3":6.86506,"13.4":1.27201},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.024,"11":0,"12":0.003,"13":0.255,_:"0","3.1":0,"3.2":0,"5.1":0.018,"6.1":0,"7.1":0,"9.1":0,"10.1":0.018,"11.1":0.03,"12.1":0.06,"13.1":0.189},I:{"3":0.00247,"4":0.02227,_:"81","2.1":0,"2.2":0.00742,"2.3":0.00247,"4.1":0.04948,"4.2-4.3":0.10391,"4.4":0,"4.4.3-4.4.4":0.71498},B:{"12":0,"13":0.009,"14":0.003,"15":0.015,"16":0.018,"17":0.063,"18":0.867,_:"79 80 81"},P:{"4":0.20188,"5.0-5.4":0,"6.2-6.4":0.02125,"7.2-7.4":0.37188,"8.2":0,"9.2":0.13813,"10.1":0.34,"11.1":3.68688},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.02213,"10":0.00738,"11":0.3245,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.315},R:{_:"0"},M:{"0":0.091},O:{"0":0.077},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.16568},L:{"0":73.494}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GE.js b/website/www/node_modules/caniuse-lite/data/regions/GE.js new file mode 100644 index 000000000000..36f8c7657d0b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00522,"37":0,"38":0.00522,"39":0.00522,"40":0.00522,"41":0.00522,"42":0,"43":0.00522,"44":0,"45":0,"46":0.00522,"47":0.01045,"48":0.00522,"49":0.34472,"50":0.00522,"51":0.00522,"52":0,"53":0.01045,"54":0,"55":0.00522,"56":0.01567,"57":0.01045,"58":0.02089,"59":0.01567,"60":0.00522,"61":0.00522,"62":0.00522,"63":0.03656,"64":0.01045,"65":0.01567,"66":0.00522,"67":0.02089,"68":0.01567,"69":0.01567,"70":0.04178,"71":0.14102,"72":0.0679,"73":0.04701,"74":0.05745,"75":0.05223,"76":0.0679,"77":0.05745,"78":0.14624,"79":0.20892,"80":11.82487,"81":6.0639,"83":0.03656,"84":0.01045,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00522,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01045,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.02089,"64":0,"65":0.00522,"66":0.00522,"67":0,"68":0.05223,"69":0.00522,"70":0,"71":0.02089,"72":0.01045,"73":0.00522,"74":0.22981,"75":0.43873,"76":0.00522,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00522,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00522,"36":0.00522,"37":0,"38":0.00522,"39":0,"40":0.00522,"41":0,"42":0.01045,"43":0.00522,"44":0,"45":0.00522,"46":0.01045,"47":0.00522,"48":0.00522,"49":0,"50":0,"51":0,"52":0,"53":0.00522,"54":0,"55":0,"56":0,"57":0.02089,"58":0.00522,"60":0.00522,"62":0,"63":0.01045,"64":0,"65":0.01567,"66":0.02612,"67":2.58016,"68":0.0679,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00522},G:{"8":0.00117,"3.2":0.00117,"4.0-4.1":0,"4.2-4.3":0.00234,"5.0-5.1":0.01171,"6.0-6.1":0.00351,"7.0-7.1":0.01171,"8.1-8.4":0.0164,"9.0-9.2":0.01406,"9.3":0.16867,"10.0-10.2":0.04334,"10.3":0.14876,"11.0-11.2":0.09605,"11.3-11.4":0.16281,"12.0-12.1":0.20147,"12.2-12.4":1.32007,"13.0-13.1":0.28111,"13.2":0.13704,"13.3":7.67442,"13.4":1.42197},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00522,"12":0.01567,"13":0.23504,_:"0","3.1":0,"3.2":0,"5.1":0.01045,"6.1":0,"7.1":0,"9.1":0.02612,"10.1":0.01045,"11.1":0.02089,"12.1":0.04178,"13.1":0.25593},I:{"3":0.002,"4":0.01802,_:"81","2.1":0,"2.2":0.00601,"2.3":0.002,"4.1":0.04004,"4.2-4.3":0.08408,"4.4":0,"4.4.3-4.4.4":0.57856},B:{"12":0.00522,"13":0.15669,"14":0.33427,"15":0.02089,"16":0.2507,"17":0.04701,"18":0.80957,_:"79 80 81"},P:{"4":0.45556,"5.0-5.4":0,"6.2-6.4":0.01035,"7.2-7.4":0.09318,"8.2":0.02071,"9.2":0.1346,"10.1":0.20707,"11.1":1.42881},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03271,"9":0.00545,"10":0.00545,"11":0.70328,"5.5":0},N:{"10":0,"11":0.06688},J:{"7":0,"10":0.00478},R:{_:"0"},M:{"0":0.0621},O:{"0":0.12898},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.28492},L:{"0":56.21213}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GF.js b/website/www/node_modules/caniuse-lite/data/regions/GF.js new file mode 100644 index 000000000000..b6cb7ed6ec2f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00485,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.10659,"50":0,"51":0.02907,"52":0,"53":0.01938,"54":0,"55":0,"56":0,"57":0.32946,"58":0.00969,"59":0,"60":0,"61":0.01938,"62":0.03392,"63":0.03392,"64":0.00485,"65":0.00485,"66":0,"67":0.10659,"68":0,"69":0,"70":0.08237,"71":0.00485,"72":0.00485,"73":0.05814,"74":0.00485,"75":0.01938,"76":0.00969,"77":0.00485,"78":0.4409,"79":0.05814,"80":6.19191,"81":5.55237,"83":0.00969,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00485,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00485,"43":0,"44":0,"45":0,"46":0,"47":0.00485,"48":0,"49":0.00485,"50":0,"51":0,"52":0.01454,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00485,"61":0,"62":0,"63":0,"64":0.25194,"65":1.05137,"66":0.03876,"67":0,"68":0.28101,"69":0.00485,"70":0.00969,"71":0.00969,"72":0.1938,"73":0.02423,"74":0.57656,"75":1.83626,"76":0.00969,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00969,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.36338,"68":0.01938,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00166,"3.2":0.00166,"4.0-4.1":0,"4.2-4.3":0.00332,"5.0-5.1":0.01662,"6.0-6.1":0.00499,"7.0-7.1":0.01662,"8.1-8.4":0.02327,"9.0-9.2":0.01995,"9.3":0.23938,"10.0-10.2":0.06151,"10.3":0.21112,"11.0-11.2":0.13631,"11.3-11.4":0.23107,"12.0-12.1":0.28593,"12.2-12.4":1.87349,"13.0-13.1":0.39897,"13.2":0.1945,"13.3":10.89183,"13.4":2.01811},E:{"4":0,"5":0.00485,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.04845,"13":0.94478,_:"0","3.1":0,"3.2":0,"5.1":0.00485,"6.1":0,"7.1":0,"9.1":0,"10.1":0.08721,"11.1":0.15504,"12.1":0.2471,"13.1":0.71222},I:{"3":0.0032,"4":0.02876,_:"81","2.1":0,"2.2":0.00959,"2.3":0.0032,"4.1":0.06392,"4.2-4.3":0.13423,"4.4":0,"4.4.3-4.4.4":0.92362},B:{"12":0.00485,"13":0,"14":0.00485,"15":0.00969,"16":0.02907,"17":0.06783,"18":1.43412,_:"79 80 81"},P:{"4":0.05166,"5.0-5.4":0,"6.2-6.4":0.07232,"7.2-7.4":0.09298,"8.2":0.02066,"9.2":0.1343,"10.1":0.42357,"11.1":4.26672},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00523,"10":0,"11":0.45989,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.08764},O:{"0":0.15981},Q:{"1.2":0.31446},S:{"2.5":0},H:{"0":0.03416},L:{"0":51.50638}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GG.js b/website/www/node_modules/caniuse-lite/data/regions/GG.js new file mode 100644 index 000000000000..ed8af19bf1ed --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.12974,"50":0,"51":0,"52":0,"53":0.00564,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01692,"64":0,"65":0.03385,"66":0,"67":0.00564,"68":0,"69":0.00564,"70":0,"71":0,"72":0.00564,"73":0.00564,"74":0,"75":0.01128,"76":0.06769,"77":0.04513,"78":0.03385,"79":0.15231,"80":8.78304,"81":3.26614,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.10718,"49":0.01128,"50":0,"51":0,"52":0.02256,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00564,"61":0,"62":0,"63":0,"64":0.00564,"65":0,"66":0,"67":0,"68":0.15795,"69":0.00564,"70":0,"71":0.00564,"72":0.06769,"73":0.11846,"74":0.75025,"75":1.08307,"76":0.00564,"77":0.00564,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.13538,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0047,"3.2":0.0047,"4.0-4.1":0,"4.2-4.3":0.0094,"5.0-5.1":0.04701,"6.0-6.1":0.0141,"7.0-7.1":0.04701,"8.1-8.4":0.06581,"9.0-9.2":0.05641,"9.3":0.67693,"10.0-10.2":0.17393,"10.3":0.59701,"11.0-11.2":0.38547,"11.3-11.4":0.65342,"12.0-12.1":0.80855,"12.2-12.4":5.29788,"13.0-13.1":1.12821,"13.2":0.55,"13.3":30.8001,"13.4":5.70686},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01128,"9":0.01128,"10":0,"11":0.01128,"12":0.21436,"13":5.95126,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01692,"10.1":0.11846,"11.1":0.29333,"12.1":0.3441,"13.1":1.87845},I:{"3":0.00214,"4":0.01925,_:"81","2.1":0,"2.2":0.00642,"2.3":0.00214,"4.1":0.04278,"4.2-4.3":0.08984,"4.4":0,"4.4.3-4.4.4":0.6182},B:{"12":0,"13":0,"14":0.01128,"15":0.00564,"16":0.03949,"17":0.07897,"18":2.08153,_:"79 80 81"},P:{"4":0.02272,"5.0-5.4":0.01136,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.03408,"10.1":0.28396,"11.1":3.19175},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":1.60204,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2659},O:{"0":0.00436},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.08666},L:{"0":17.77876}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GH.js b/website/www/node_modules/caniuse-lite/data/regions/GH.js new file mode 100644 index 000000000000..ae4d1d7d0d1e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00248,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00248,"34":0.00248,"35":0,"36":0.00248,"37":0.00248,"38":0.00248,"39":0,"40":0.00745,"41":0.00248,"42":0.00248,"43":0.00497,"44":0,"45":0,"46":0.00497,"47":0.00248,"48":0.00248,"49":0.01987,"50":0.01242,"51":0.00248,"52":0.00248,"53":0.00248,"54":0.00248,"55":0.00497,"56":0.00497,"57":0.00248,"58":0.00745,"59":0.00497,"60":0.00745,"61":0.01242,"62":0.01739,"63":0.02981,"64":0.01242,"65":0.00745,"66":0.00745,"67":0.00745,"68":0.00745,"69":0.01987,"70":0.01987,"71":0.00994,"72":0.01242,"73":0.01242,"74":0.03726,"75":0.01739,"76":0.02236,"77":0.02732,"78":0.03478,"79":0.06707,"80":1.57734,"81":0.89176,"83":0.00497,"84":0.00248,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00248,"22":0,"23":0.00248,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00248,"30":0.00248,"31":0.00248,"32":0.00248,"33":0.00248,"34":0.00248,"35":0.00248,"36":0.00248,"37":0.00248,"38":0.00248,"39":0.00248,"40":0.00497,"41":0.00248,"42":0.00497,"43":0.00745,"44":0.00745,"45":0.00745,"46":0.00248,"47":0.00994,"48":0.00745,"49":0.00497,"50":0.00497,"51":0.00248,"52":0.0149,"53":0.00248,"54":0.00248,"55":0.00248,"56":0.01242,"57":0.00994,"58":0.00497,"59":0.00248,"60":0.00497,"61":0.00248,"62":0.00248,"63":0.00248,"64":0.00497,"65":0.00248,"66":0.00248,"67":0.00745,"68":0.10433,"69":0.01242,"70":0.01242,"71":0.00994,"72":0.02981,"73":0.01987,"74":0.25585,"75":0.41234,"76":0.06458,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0.00248,"12":0.00248,"15":0.00248,"16":0.00745,"17":0.00248,"18":0.00248,"19":0.00497,"20":0.02484,"21":0,"22":0.00248,"23":0.03478,"24":0.00248,"25":0,"26":0.00248,"27":0.00248,"28":0.00745,"29":0.00248,"30":0.00745,"31":0,"32":0.00248,"33":0.00248,"34":0.00248,"35":0.00248,"36":0.00248,"37":0.00248,"38":0.00497,"39":0,"40":0,"41":0.00248,"42":0.01242,"43":0.00248,"44":0.00248,"45":0.01739,"46":0.0621,"47":0.10681,"48":0.00248,"49":0.00248,"50":0,"51":0,"52":0.00248,"53":0.00745,"54":0.00497,"55":0.00248,"56":0.00745,"57":0.0149,"58":0.00248,"60":0.00248,"62":0,"63":0.00248,"64":0.00248,"65":0.0149,"66":0.03974,"67":0.50425,"68":0.01242,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0149},G:{"8":0.00111,"3.2":0.00111,"4.0-4.1":0,"4.2-4.3":0.00223,"5.0-5.1":0.01114,"6.0-6.1":0.00334,"7.0-7.1":0.01114,"8.1-8.4":0.0156,"9.0-9.2":0.01337,"9.3":0.16047,"10.0-10.2":0.04123,"10.3":0.14153,"11.0-11.2":0.09138,"11.3-11.4":0.1549,"12.0-12.1":0.19167,"12.2-12.4":1.2559,"13.0-13.1":0.26745,"13.2":0.13038,"13.3":7.3014,"13.4":1.35285},E:{"4":0,"5":0.00248,"6":0,"7":0,"8":0.00248,"9":0.00248,"10":0.00248,"11":0.00994,"12":0.01739,"13":0.09439,_:"0","3.1":0,"3.2":0,"5.1":0.03974,"6.1":0,"7.1":0.00248,"9.1":0.00248,"10.1":0.00745,"11.1":0.01739,"12.1":0.02981,"13.1":0.06955},I:{"3":0.00137,"4":0.01232,_:"81","2.1":0,"2.2":0.00411,"2.3":0.00137,"4.1":0.02739,"4.2-4.3":0.05751,"4.4":0,"4.4.3-4.4.4":0.39574},B:{"12":0.02732,"13":0.01739,"14":0.01739,"15":0.03229,"16":0.0149,"17":0.02236,"18":0.17636,_:"79 80 81"},P:{"4":0.74805,"5.0-5.4":0.07076,"6.2-6.4":0.05054,"7.2-7.4":0.20217,"8.2":0.02022,"9.2":0.27294,"10.1":0.38413,"11.1":0.85924},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00555,"7":0.00278,"8":0.00833,"9":0.00555,"10":0.01388,"11":0.0583,"5.5":0},N:{"10":0.02733,"11":0.42363},J:{"7":0,"10":0.08268},R:{_:"0"},M:{"0":0.34574},O:{"0":5.3063},Q:{"1.2":0.01503},S:{"2.5":0.01503},H:{"0":12.59472},L:{"0":54.95309}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GI.js b/website/www/node_modules/caniuse-lite/data/regions/GI.js new file mode 100644 index 000000000000..55b72c31b9c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0335,"50":0,"51":0,"52":0,"53":0.03909,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00558,"61":0,"62":0,"63":0.00558,"64":0,"65":0,"66":0,"67":0.22336,"68":0.00558,"69":0.00558,"70":0.01117,"71":0,"72":0.20102,"73":0.00558,"74":0.0335,"75":0.01675,"76":0.02234,"77":0.0335,"78":0.03909,"79":0.17869,"80":11.36344,"81":5.85203,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00558,"24":0,"25":0,"26":0,"27":0,"28":0.00558,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00558,"53":0,"54":0,"55":0,"56":0,"57":0.00558,"58":0,"59":0,"60":0,"61":0,"62":0.01117,"63":0,"64":0,"65":0,"66":0.06701,"67":0,"68":0.1061,"69":0.00558,"70":0,"71":0,"72":0.00558,"73":0.01117,"74":0.4188,"75":0.71475,"76":0.01117,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00558,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.08934,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00382,"3.2":0.00382,"4.0-4.1":0,"4.2-4.3":0.00764,"5.0-5.1":0.03819,"6.0-6.1":0.01146,"7.0-7.1":0.03819,"8.1-8.4":0.05347,"9.0-9.2":0.04583,"9.3":0.54999,"10.0-10.2":0.14132,"10.3":0.48506,"11.0-11.2":0.31319,"11.3-11.4":0.53089,"12.0-12.1":0.65693,"12.2-12.4":4.30445,"13.0-13.1":0.91665,"13.2":0.44687,"13.3":25.02463,"13.4":4.63674},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01675,"12":0.02792,"13":4.13216,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01117,"10.1":0.15077,"11.1":0.19544,"12.1":0.51931,"13.1":1.55794},I:{"3":0.0007,"4":0.00627,_:"81","2.1":0,"2.2":0.00209,"2.3":0.0007,"4.1":0.01393,"4.2-4.3":0.02926,"4.4":0,"4.4.3-4.4.4":0.20133},B:{"12":0,"13":0.02234,"14":0,"15":0.01117,"16":0.00558,"17":0.10051,"18":2.70266,_:"79 80 81"},P:{"4":0.05273,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.02109,"10.1":0.16873,"11.1":3.80693},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.34621,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.20314},O:{"0":0.07507},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.12542},L:{"0":24.96192}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GL.js b/website/www/node_modules/caniuse-lite/data/regions/GL.js new file mode 100644 index 000000000000..9f665a51ccde --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00559,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.21782,"50":0,"51":0,"52":0,"53":0.12846,"54":0,"55":0,"56":0,"57":0,"58":0.01676,"59":0,"60":0,"61":0,"62":0,"63":0.01117,"64":0,"65":0,"66":0,"67":0.00559,"68":0.01676,"69":0,"70":0,"71":0.00559,"72":0,"73":0.02234,"74":0,"75":0.01117,"76":0.03351,"77":0.00559,"78":0.01117,"79":0.2234,"80":10.10327,"81":6.49536,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00559,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00559,"51":0,"52":0.00559,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.20665,"69":0.00559,"70":0.00559,"71":0,"72":0.05585,"73":0.04468,"74":0.67579,"75":1.2678,"76":0.02234,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00559,"66":0,"67":0.1117,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00262,"3.2":0.00262,"4.0-4.1":0,"4.2-4.3":0.00524,"5.0-5.1":0.02619,"6.0-6.1":0.00786,"7.0-7.1":0.02619,"8.1-8.4":0.03667,"9.0-9.2":0.03143,"9.3":0.37713,"10.0-10.2":0.0969,"10.3":0.33261,"11.0-11.2":0.21475,"11.3-11.4":0.36403,"12.0-12.1":0.45046,"12.2-12.4":2.95155,"13.0-13.1":0.62855,"13.2":0.30642,"13.3":17.15929,"13.4":3.17939},E:{"4":0,"5":0.03351,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00559,"12":0,"13":3.50738,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00559,"10.1":0.02793,"11.1":0.06144,"12.1":0.15638,"13.1":1.27338},I:{"3":0.00025,"4":0.00227,_:"81","2.1":0,"2.2":0.00076,"2.3":0.00025,"4.1":0.00505,"4.2-4.3":0.01059,"4.4":0,"4.4.3-4.4.4":0.0729},B:{"12":0,"13":0.04468,"14":0.04468,"15":0.04468,"16":0.00559,"17":0.2234,"18":2.07762,_:"79 80 81"},P:{"4":0.02132,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0.01066,"9.2":0.15993,"10.1":0.11728,"11.1":4.70183},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00559,"10":0,"11":1.13934,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.3223},O:{"0":0.51214},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.16719},L:{"0":35.83021}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GM.js b/website/www/node_modules/caniuse-lite/data/regions/GM.js new file mode 100644 index 000000000000..9b428eb76d0b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00578,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00289,"26":0.00289,"27":0,"28":0,"29":0,"30":0,"31":0.00289,"32":0,"33":0,"34":0.00289,"35":0,"36":0.00289,"37":0,"38":0.00578,"39":0,"40":0.00867,"41":0,"42":0.00578,"43":0,"44":0,"45":0,"46":0.00289,"47":0,"48":0.00289,"49":0.02889,"50":0.00289,"51":0.026,"52":0,"53":0,"54":0.00289,"55":0.00867,"56":0.00289,"57":0,"58":0.00289,"59":0.00289,"60":0.00867,"61":0.00289,"62":0,"63":0.02022,"64":0.00867,"65":0.00578,"66":0.00289,"67":0,"68":0.01156,"69":0.04334,"70":0.00578,"71":0.00578,"72":0.02022,"73":0.00289,"74":0.02022,"75":0.02022,"76":0.01445,"77":0.00867,"78":0.02022,"79":0.07223,"80":2.31409,"81":1.25672,"83":0.02889,"84":0.00289,_:"85"},C:{"2":0,"3":0.00289,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.08089,"14":0,"15":0,"16":0,"17":0,"18":0.00289,"19":0.00289,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00289,"30":0,"31":0,"32":0.00578,"33":0.00289,"34":0,"35":0,"36":0.00289,"37":0,"38":0,"39":0,"40":0.00578,"41":0,"42":0.00289,"43":0.00867,"44":0.00578,"45":0.00289,"46":0.00578,"47":0.00578,"48":0.00867,"49":0.00867,"50":0.00867,"51":0,"52":0.01156,"53":0,"54":0.00578,"55":0,"56":0.00578,"57":0.00289,"58":0,"59":0.00289,"60":0.00289,"61":0,"62":0.00578,"63":0,"64":0,"65":0,"66":0.00289,"67":0.00289,"68":0.04622,"69":0.00867,"70":0.00289,"71":0.00578,"72":0.02889,"73":0.01445,"74":0.44202,"75":0.86959,"76":0.18779,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00289,"21":0,"22":0,"23":0.00289,"24":0,"25":0,"26":0,"27":0.02311,"28":0.00289,"29":0,"30":0.00289,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00578,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00867,"46":0.00867,"47":0.00578,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00578,"55":0.00289,"56":0,"57":0,"58":0,"60":0,"62":0.00867,"63":0,"64":0,"65":0.00867,"66":0.00289,"67":0.47669,"68":0.01445,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.026},G:{"8":0.00144,"3.2":0.00144,"4.0-4.1":0,"4.2-4.3":0.00289,"5.0-5.1":0.01443,"6.0-6.1":0.00433,"7.0-7.1":0.01443,"8.1-8.4":0.02021,"9.0-9.2":0.01732,"9.3":0.20783,"10.0-10.2":0.0534,"10.3":0.18329,"11.0-11.2":0.11835,"11.3-11.4":0.20061,"12.0-12.1":0.24824,"12.2-12.4":1.62656,"13.0-13.1":0.34638,"13.2":0.16886,"13.3":9.45626,"13.4":1.75212},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00289,"9":0.00578,"10":0.00289,"11":0.00289,"12":0.00578,"13":0.11556,_:"0","3.1":0,"3.2":0,"5.1":0.08956,"6.1":0,"7.1":0,"9.1":0.00867,"10.1":0,"11.1":0.02311,"12.1":0.05489,"13.1":0.03467},I:{"3":0.00309,"4":0.02785,_:"81","2.1":0,"2.2":0.00928,"2.3":0.00309,"4.1":0.06189,"4.2-4.3":0.12998,"4.4":0,"4.4.3-4.4.4":0.89436},B:{"12":0.01445,"13":0.01445,"14":0.00867,"15":0.052,"16":0.01733,"17":0.02311,"18":0.24845,_:"79 80 81"},P:{"4":0.81434,"5.0-5.4":0.13401,"6.2-6.4":0.10308,"7.2-7.4":0.5154,"8.2":0.02062,"9.2":0.28863,"10.1":0.87619,"11.1":2.36055},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01489,"9":0,"10":0,"11":0.48779,"5.5":0},N:{"10":0,"11":0.12089},J:{"7":0,"10":0.03556},R:{_:"0"},M:{"0":0.09955},O:{"0":2.47463},Q:{"1.2":0.01422},S:{"2.5":0.00711},H:{"0":2.37648},L:{"0":62.96467}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GN.js b/website/www/node_modules/caniuse-lite/data/regions/GN.js new file mode 100644 index 000000000000..e04dfbe643a2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00218,"29":0.00218,"30":0,"31":0,"32":0,"33":0.00435,"34":0,"35":0,"36":0.00218,"37":0.00218,"38":0,"39":0,"40":0.04568,"41":0,"42":0,"43":0.01305,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00653,"50":0,"51":0,"52":0,"53":0.00218,"54":0,"55":0.00218,"56":0.00218,"57":0,"58":0.00218,"59":0.00435,"60":0.00218,"61":0,"62":0,"63":0.01088,"64":0.00435,"65":0.00218,"66":0.00218,"67":0.00435,"68":0.00218,"69":0.04133,"70":0.00218,"71":0.00218,"72":0.02175,"73":0.00435,"74":0.0087,"75":0.00435,"76":0.0435,"77":0.0087,"78":0.00653,"79":0.03698,"80":1.68563,"81":0.62858,"83":0.00435,"84":0.00218,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00218,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00218,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00218,"42":0,"43":0.00218,"44":0,"45":0.00218,"46":0.00435,"47":0.00435,"48":0.00435,"49":0.00218,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00218,"57":0,"58":0,"59":0,"60":0,"61":0.00218,"62":0.01088,"63":0,"64":0,"65":0.00218,"66":0.00218,"67":0.00218,"68":0.01523,"69":0.00218,"70":0.00653,"71":0,"72":0.01958,"73":0.00653,"74":0.28928,"75":0.35453,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00218,"17":0,"18":0,"19":0,"20":0.00435,"21":0,"22":0,"23":0.0174,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00435,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00218,"39":0,"40":0,"41":0,"42":0.00218,"43":0,"44":0,"45":0.00218,"46":0.01088,"47":0.04568,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00435,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00653,"66":0.00435,"67":0.2001,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00435},G:{"8":0.00062,"3.2":0.00062,"4.0-4.1":0,"4.2-4.3":0.00124,"5.0-5.1":0.00621,"6.0-6.1":0.00186,"7.0-7.1":0.00621,"8.1-8.4":0.00869,"9.0-9.2":0.00745,"9.3":0.08936,"10.0-10.2":0.02296,"10.3":0.07881,"11.0-11.2":0.05088,"11.3-11.4":0.08625,"12.0-12.1":0.10673,"12.2-12.4":0.69933,"13.0-13.1":0.14893,"13.2":0.0726,"13.3":4.06569,"13.4":0.75332},E:{"4":0,"5":0,"6":0,"7":0,"8":0.06525,"9":0,"10":0.00435,"11":0.00218,"12":0.0261,"13":0.07613,_:"0","3.1":0,"3.2":0,"5.1":0.00218,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02393,"11.1":0.01305,"12.1":0.01305,"13.1":0.0348},I:{"3":0.00166,"4":0.01494,_:"81","2.1":0,"2.2":0.00498,"2.3":0.00166,"4.1":0.03321,"4.2-4.3":0.06974,"4.4":0,"4.4.3-4.4.4":0.4799},B:{"12":0.0174,"13":0.00653,"14":0.00218,"15":0.0087,"16":0.00653,"17":0.01958,"18":0.1566,_:"79 80 81"},P:{"4":0.37496,"5.0-5.4":0.07094,"6.2-6.4":0.08107,"7.2-7.4":0.36482,"8.2":0.05067,"9.2":0.65871,"10.1":0.5371,"11.1":0.9526},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00664,"9":0,"10":0.01328,"11":0.23238,"5.5":0},N:{"10":0,"11":0.05478},J:{"7":0,"10":0.00783},R:{_:"0"},M:{"0":0.0626},O:{"0":3.11435},Q:{"1.2":0.82163},S:{"2.5":0.00783},H:{"0":3.80041},L:{"0":75.05993}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GP.js b/website/www/node_modules/caniuse-lite/data/regions/GP.js new file mode 100644 index 000000000000..91f28935b059 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GP.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00976,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00488,"47":0,"48":0,"49":0.10244,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00976,"59":0,"60":0,"61":0.00976,"62":0.00488,"63":0.01463,"64":0.00488,"65":0.07317,"66":0.00488,"67":0.00976,"68":0.00488,"69":0,"70":0.00488,"71":0.00976,"72":0.00976,"73":0.00976,"74":0.01951,"75":0.00976,"76":0.00976,"77":0.00976,"78":0.01951,"79":0.05366,"80":5.78043,"81":4.55117,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00488,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00976,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00488,"46":0,"47":0,"48":0.00488,"49":0,"50":0.00488,"51":0,"52":0.01463,"53":0,"54":0,"55":0,"56":0.00976,"57":0,"58":0,"59":0,"60":0.02927,"61":0.00488,"62":0,"63":0,"64":0,"65":0,"66":0.00488,"67":0.00976,"68":0.18536,"69":0,"70":0.04878,"71":0,"72":0.03415,"73":0.00976,"74":0.75121,"75":1.58535,"76":0.00488,"77":0.01951,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00488,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01951,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.01951,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.27317,"68":0.00488,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00244,"3.2":0.00244,"4.0-4.1":0,"4.2-4.3":0.00489,"5.0-5.1":0.02443,"6.0-6.1":0.00733,"7.0-7.1":0.02443,"8.1-8.4":0.0342,"9.0-9.2":0.02932,"9.3":0.35181,"10.0-10.2":0.0904,"10.3":0.31028,"11.0-11.2":0.20034,"11.3-11.4":0.33959,"12.0-12.1":0.42022,"12.2-12.4":2.7534,"13.0-13.1":0.58635,"13.2":0.28585,"13.3":16.00736,"13.4":2.96596},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00488,"9":0,"10":0.01463,"11":0.04878,"12":0.12195,"13":1.38535,_:"0","3.1":0,"3.2":0,"5.1":0.05854,"6.1":0.00488,"7.1":0,"9.1":0.0439,"10.1":0.15122,"11.1":0.18049,"12.1":0.46829,"13.1":1.3756},I:{"3":0.00094,"4":0.00847,_:"81","2.1":0,"2.2":0.00282,"2.3":0.00094,"4.1":0.01882,"4.2-4.3":0.03952,"4.4":0,"4.4.3-4.4.4":0.27191},B:{"12":0.00488,"13":0.00488,"14":0.00488,"15":0.01463,"16":0.40975,"17":0.07317,"18":2.27803,_:"79 80 81"},P:{"4":0.09477,"5.0-5.4":0.01053,"6.2-6.4":0,"7.2-7.4":0.09477,"8.2":0.01053,"9.2":0.32642,"10.1":0.40013,"11.1":3.78021},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":1.27316,"9":0.00488,"10":0,"11":0.4,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.27659},O:{"0":0.02049},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.09698},L:{"0":45.13599}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GQ.js b/website/www/node_modules/caniuse-lite/data/regions/GQ.js new file mode 100644 index 000000000000..2718cad0498b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GQ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.03711,"36":0,"37":0,"38":0.0053,"39":0,"40":0.0053,"41":0,"42":0,"43":0.0106,"44":0,"45":0.31812,"46":0.0053,"47":0.0106,"48":0,"49":0.21738,"50":0,"51":0.02121,"52":0.0053,"53":0.0053,"54":0,"55":0.0053,"56":0,"57":0.0053,"58":0.02121,"59":0.0053,"60":0.09544,"61":0.0053,"62":0.01591,"63":0.44537,"64":0.0053,"65":0.02121,"66":0.0053,"67":0.01591,"68":0.01591,"69":0.05302,"70":0.01591,"71":0.04242,"72":0.02121,"73":1.65953,"74":0.03181,"75":0.19087,"76":0.05302,"77":0.24389,"78":0.13785,"79":0.12725,"80":8.00072,"81":4.85133,"83":0.02121,"84":0.0053,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.05302,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.0053,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.02121,"38":0.0106,"39":0,"40":0,"41":0.0106,"42":0,"43":0.0106,"44":0.0053,"45":0.0053,"46":0,"47":0.0106,"48":0.02651,"49":0,"50":0,"51":0,"52":0.11664,"53":0,"54":0.0106,"55":0,"56":0.0106,"57":0.0053,"58":0,"59":0.0053,"60":0.0053,"61":0,"62":0.0106,"63":0.0053,"64":0,"65":0.0053,"66":0,"67":0,"68":0.04772,"69":0.0053,"70":0.0106,"71":0.0106,"72":0.11134,"73":0.01591,"74":0.99147,"75":1.00208,"76":0.06893,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.0106,"31":0,"32":0.0053,"33":0,"34":0.0053,"35":0,"36":0.02121,"37":0,"38":0,"39":0,"40":0.0053,"41":0,"42":0,"43":0,"44":0.0053,"45":0.0053,"46":0,"47":0.0053,"48":0,"49":0.02121,"50":0.13255,"51":0.02651,"52":0,"53":0.0106,"54":0,"55":0.03711,"56":0,"57":0,"58":0.15376,"60":0.0106,"62":0.01591,"63":0.0053,"64":0,"65":0.0053,"66":0.0053,"67":0.10604,"68":0.0053,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00085,"3.2":0.00085,"4.0-4.1":0,"4.2-4.3":0.0017,"5.0-5.1":0.00849,"6.0-6.1":0.00255,"7.0-7.1":0.00849,"8.1-8.4":0.01189,"9.0-9.2":0.01019,"9.3":0.1223,"10.0-10.2":0.03142,"10.3":0.10786,"11.0-11.2":0.06964,"11.3-11.4":0.11805,"12.0-12.1":0.14608,"12.2-12.4":0.95715,"13.0-13.1":0.20383,"13.2":0.09937,"13.3":5.56456,"13.4":1.03104},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0053,"9":0,"10":0.02651,"11":0.0106,"12":0.0106,"13":0.41886,_:"0","3.1":0,"3.2":0,"5.1":1.16114,"6.1":0,"7.1":0,"9.1":0.05832,"10.1":0.03711,"11.1":0.33933,"12.1":0.32342,"13.1":0.12195},I:{"3":0.00387,"4":0.03485,_:"81","2.1":0,"2.2":0.01162,"2.3":0.00387,"4.1":0.07745,"4.2-4.3":0.16264,"4.4":0,"4.4.3-4.4.4":1.11912},B:{"12":0.08483,"13":0.01591,"14":0.0106,"15":0.03181,"16":0.06362,"17":0.41886,"18":2.28516,_:"79 80 81"},P:{"4":1.34016,"5.0-5.4":0.08184,"6.2-6.4":0.01023,"7.2-7.4":0.07161,"8.2":0.03069,"9.2":0.17391,"10.1":0.32737,"11.1":1.24809},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05857,"9":0,"10":0.1757,"11":1.21318,"5.5":0},N:{"10":0,"11":0.01409},J:{"7":0,"10":0.04228},R:{_:"0"},M:{"0":0.42282},O:{"0":0.84564},Q:{"1.2":0.24899},S:{"2.5":0.0047},H:{"0":1.11639},L:{"0":53.74703}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GR.js b/website/www/node_modules/caniuse-lite/data/regions/GR.js new file mode 100644 index 000000000000..042d4b9e884d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0058,"23":0,"24":0,"25":0,"26":0.0058,"27":0,"28":0,"29":0.0058,"30":0,"31":0,"32":0,"33":0,"34":0.0058,"35":0,"36":0.0058,"37":0,"38":0.0174,"39":0.0058,"40":0.0174,"41":0,"42":0,"43":0.0058,"44":0,"45":0,"46":0,"47":0.0058,"48":0,"49":0.6032,"50":0.0058,"51":0,"52":0.0116,"53":0.029,"54":0,"55":0.0058,"56":0.0058,"57":0.0058,"58":0.0116,"59":0.0174,"60":0.0058,"61":0.1392,"62":0.0058,"63":0.0174,"64":0.0058,"65":0.0174,"66":0.0348,"67":0.0406,"68":0.0116,"69":0.0232,"70":0.0522,"71":0.1102,"72":0.1276,"73":0.0638,"74":0.1392,"75":0.058,"76":0.0348,"77":0.2668,"78":0.0638,"79":0.1334,"80":13.775,"81":6.9368,"83":0.0174,"84":0.0174,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0058,"46":0,"47":0.0058,"48":0.0232,"49":0,"50":0.0058,"51":0.0058,"52":0.2436,"53":0,"54":0,"55":0,"56":0.0116,"57":0,"58":0.0174,"59":0.0058,"60":0.0174,"61":0.0116,"62":0.0058,"63":0.0058,"64":0.0116,"65":0.0116,"66":0.0116,"67":0.0058,"68":0.1682,"69":0.0116,"70":0.0116,"71":0.0058,"72":0.2378,"73":0.029,"74":1.7458,"75":2.9696,"76":0.0232,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0696,"37":0,"38":0,"39":0,"40":0.0058,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0058,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.0058,"54":0,"55":0,"56":0,"57":0.0058,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.0058,"67":0.87,"68":0.0174,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00093,"3.2":0.00093,"4.0-4.1":0,"4.2-4.3":0.00186,"5.0-5.1":0.00928,"6.0-6.1":0.00278,"7.0-7.1":0.00928,"8.1-8.4":0.01299,"9.0-9.2":0.01113,"9.3":0.13362,"10.0-10.2":0.03433,"10.3":0.11784,"11.0-11.2":0.07609,"11.3-11.4":0.12898,"12.0-12.1":0.1596,"12.2-12.4":1.04573,"13.0-13.1":0.22269,"13.2":0.10856,"13.3":6.07953,"13.4":1.12646},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0058,"11":0.0058,"12":0.029,"13":0.5394,_:"0","3.1":0,"3.2":0,"5.1":0.0058,"6.1":0,"7.1":0,"9.1":0.0058,"10.1":0.029,"11.1":0.0928,"12.1":0.0928,"13.1":0.493},I:{"3":0.00177,"4":0.01596,_:"81","2.1":0,"2.2":0.00532,"2.3":0.00177,"4.1":0.03547,"4.2-4.3":0.0745,"4.4":0,"4.4.3-4.4.4":0.5126},B:{"12":0.0174,"13":0.0058,"14":0.0116,"15":0.029,"16":0.0116,"17":0.0348,"18":0.9338,_:"79 80 81"},P:{"4":0.19575,"5.0-5.4":0,"6.2-6.4":0.02061,"7.2-7.4":0.03091,"8.2":0.02061,"9.2":0.09272,"10.1":0.15454,"11.1":1.89567},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01233,"9":0.00617,"10":0.00617,"11":0.46253,"5.5":0},N:{"10":0,"11":0.0714},J:{"7":0,"10":0.0042},R:{_:"0"},M:{"0":0.1806},O:{"0":0.1764},Q:{"1.2":0.0126},S:{"2.5":0},H:{"0":0.22267},L:{"0":52.2944}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GT.js b/website/www/node_modules/caniuse-lite/data/regions/GT.js new file mode 100644 index 000000000000..c005fb15b7f4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00514,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00514,"35":0.00514,"36":0,"37":0,"38":0.02054,"39":0,"40":0.01027,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.15405,"50":0,"51":0,"52":0,"53":0.01541,"54":0,"55":0.01027,"56":0.00514,"57":0,"58":0.00514,"59":0.00514,"60":0,"61":0,"62":0.00514,"63":0.01027,"64":0.00514,"65":0.02054,"66":0.00514,"67":0.03081,"68":0.01027,"69":0.01027,"70":0.02054,"71":0.03595,"72":0.10784,"73":0.02054,"74":0.06162,"75":0.04622,"76":0.04108,"77":0.05135,"78":0.07189,"79":0.1027,"80":11.37403,"81":7.24549,"83":0.01027,"84":0.00514,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01027,"49":0,"50":0,"51":0,"52":0.01541,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00514,"61":0.00514,"62":0,"63":0,"64":0,"65":0,"66":0.02568,"67":0,"68":0.09757,"69":0.00514,"70":0,"71":0.00514,"72":0.02054,"73":0.05649,"74":0.66755,"75":1.02187,"76":0.01541,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00514,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01027,"49":0,"50":0,"51":0,"52":0,"53":0.00514,"54":0,"55":0,"56":0,"57":0.01027,"58":0,"60":0,"62":0,"63":0.00514,"64":0,"65":0,"66":0.00514,"67":0.50323,"68":0.01027,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00094,"3.2":0.00094,"4.0-4.1":0,"4.2-4.3":0.00189,"5.0-5.1":0.00944,"6.0-6.1":0.00283,"7.0-7.1":0.00944,"8.1-8.4":0.01322,"9.0-9.2":0.01133,"9.3":0.13601,"10.0-10.2":0.03495,"10.3":0.11995,"11.0-11.2":0.07745,"11.3-11.4":0.13128,"12.0-12.1":0.16245,"12.2-12.4":1.06444,"13.0-13.1":0.22668,"13.2":0.11051,"13.3":6.18833,"13.4":1.14662},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00514,"9":0.01027,"10":0.01027,"11":0.02054,"12":0.08216,"13":0.79079,_:"0","3.1":0,"3.2":0,"5.1":0.01541,"6.1":0,"7.1":0,"9.1":0.00514,"10.1":0.04622,"11.1":0.13865,"12.1":0.28243,"13.1":0.89863},I:{"3":0.00067,"4":0.00606,_:"81","2.1":0,"2.2":0.00202,"2.3":0.00067,"4.1":0.01346,"4.2-4.3":0.02827,"4.4":0,"4.4.3-4.4.4":0.19452},B:{"12":0.00514,"13":0.00514,"14":0.00514,"15":0.00514,"16":0.00514,"17":0.02568,"18":0.42107,_:"79 80 81"},P:{"4":0.28647,"5.0-5.4":0.02046,"6.2-6.4":0.01023,"7.2-7.4":0.18416,"8.2":0.03069,"9.2":0.23532,"10.1":0.36832,"11.1":2.24064},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01541,"9":0,"10":0.00514,"11":0.10784,"5.5":0},N:{"10":0,"11":0.02433},J:{"7":0,"10":0.00487},R:{_:"0"},M:{"0":0.21406},O:{"0":0.1119},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.17963},L:{"0":58.98432}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GU.js b/website/www/node_modules/caniuse-lite/data/regions/GU.js new file mode 100644 index 000000000000..21898567407c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.004,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02797,"50":0,"51":0.00799,"52":0,"53":0.03996,"54":0.00799,"55":0.004,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00799,"64":0.004,"65":0.03596,"66":0.004,"67":0.01199,"68":0.004,"69":0,"70":0,"71":0.01598,"72":0.004,"73":0.01998,"74":0.004,"75":0.02398,"76":0.13586,"77":0.03197,"78":0.02398,"79":0.0999,"80":6.03796,"81":2.22178,"83":0.004,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.004,"49":0,"50":0,"51":0,"52":0.004,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.01199,"68":0.03996,"69":0.004,"70":0.004,"71":0,"72":0.02398,"73":0.01199,"74":0.35165,"75":0.53946,"76":0.004,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.004,"64":0,"65":0,"66":0,"67":0.16384,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00429,"3.2":0.00429,"4.0-4.1":0,"4.2-4.3":0.00859,"5.0-5.1":0.04294,"6.0-6.1":0.01288,"7.0-7.1":0.04294,"8.1-8.4":0.06011,"9.0-9.2":0.05153,"9.3":0.61832,"10.0-10.2":0.15888,"10.3":0.54533,"11.0-11.2":0.3521,"11.3-11.4":0.59685,"12.0-12.1":0.73855,"12.2-12.4":4.83925,"13.0-13.1":1.03054,"13.2":0.50239,"13.3":28.13377,"13.4":5.21282},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.004,"11":0.00799,"12":0.09191,"13":1.81818,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00799,"10.1":0.04396,"11.1":0.13187,"12.1":0.34765,"13.1":0.62737},I:{"3":0.00104,"4":0.00936,_:"81","2.1":0,"2.2":0.00312,"2.3":0.00104,"4.1":0.02081,"4.2-4.3":0.0437,"4.4":0,"4.4.3-4.4.4":0.3007},B:{"12":0,"13":0.03197,"14":0.004,"15":0,"16":0.04396,"17":0.06793,"18":1.23876,_:"79 80 81"},P:{"4":0.23298,"5.0-5.4":0.02118,"6.2-6.4":0.04236,"7.2-7.4":0.06354,"8.2":0.04236,"9.2":0.45537,"10.1":0.33888,"11.1":4.54314},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.38362,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.12008},O:{"0":0.06004},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.216},L:{"0":32.651}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GW.js b/website/www/node_modules/caniuse-lite/data/regions/GW.js new file mode 100644 index 000000000000..0bca130ce752 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00854,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.18575,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00214,"40":0.00214,"41":0.00214,"42":0,"43":0.01922,"44":0,"45":0,"46":0.00214,"47":0,"48":0,"49":0.07473,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00427,"57":0,"58":0.00214,"59":0.00214,"60":0,"61":0,"62":0,"63":0.01495,"64":0.00214,"65":0,"66":0.00214,"67":0,"68":0.01922,"69":0.04057,"70":0.00641,"71":0.00854,"72":0,"73":0,"74":0,"75":0,"76":0.00854,"77":0.01708,"78":0.00214,"79":0.04911,"80":1.4945,"81":0.58072,"83":0.00214,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00214,"32":0.00214,"33":0,"34":0.00854,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00854,"46":0,"47":0.00214,"48":0.00214,"49":0,"50":0.01495,"51":0,"52":0.00427,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00214,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00214,"67":0,"68":0.03416,"69":0.00427,"70":0.00214,"71":0.00427,"72":0.00214,"73":0,"74":0.44195,"75":0.45049,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.0427,"54":0,"55":0,"56":0,"57":0.00214,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00427,"66":0.00214,"67":0.14945,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0.00641,"11.6":0,"12.1":0.00427},G:{"8":0.00047,"3.2":0.00047,"4.0-4.1":0,"4.2-4.3":0.00093,"5.0-5.1":0.00466,"6.0-6.1":0.0014,"7.0-7.1":0.00466,"8.1-8.4":0.00653,"9.0-9.2":0.0056,"9.3":0.06714,"10.0-10.2":0.01725,"10.3":0.05922,"11.0-11.2":0.03823,"11.3-11.4":0.06481,"12.0-12.1":0.0802,"12.2-12.4":0.52549,"13.0-13.1":0.11191,"13.2":0.05455,"13.3":3.05502,"13.4":0.56606},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00214,"12":0.00214,"13":0.08327,_:"0","3.1":0,"3.2":0,"5.1":0.02776,"6.1":0,"7.1":0,"9.1":0.01495,"10.1":0,"11.1":0.02349,"12.1":0.02776,"13.1":0.01068},I:{"3":0.00113,"4":0.01013,_:"81","2.1":0,"2.2":0.00338,"2.3":0.00113,"4.1":0.0225,"4.2-4.3":0.04726,"4.4":0,"4.4.3-4.4.4":0.32516},B:{"12":0.00854,"13":0.00641,"14":0.00641,"15":0.07259,"16":0.00214,"17":0.00641,"18":0.1217,_:"79 80 81"},P:{"4":0.65849,"5.0-5.4":0.06078,"6.2-6.4":0.11144,"7.2-7.4":0.54705,"8.2":0.06078,"9.2":0.4964,"10.1":0.94215,"11.1":2.04639},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01068,"9":0.00214,"10":0,"11":0.05338,"5.5":0},N:{"10":0,"11":0.03933},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.1809},O:{"0":1.43143},Q:{"1.2":0},S:{"2.5":0.00787},H:{"0":2.58379},L:{"0":79.35096}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/GY.js b/website/www/node_modules/caniuse-lite/data/regions/GY.js new file mode 100644 index 000000000000..6d7062b473e5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/GY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00397,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00397,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00397,"36":0,"37":0,"38":0.00397,"39":0,"40":0,"41":0,"42":0,"43":0.00397,"44":0,"45":0,"46":0.00397,"47":0,"48":0,"49":0.03172,"50":0,"51":0,"52":0,"53":0.00793,"54":0,"55":0.00397,"56":0,"57":0,"58":0.00397,"59":0,"60":0.00397,"61":0.00793,"62":0.00397,"63":0.02379,"64":0.00397,"65":0.01586,"66":0,"67":0.00397,"68":0.0119,"69":0.03965,"70":0.00793,"71":0.10309,"72":0.01983,"73":0.00397,"74":0.02776,"75":0.01586,"76":0.10309,"77":0.00793,"78":0.02776,"79":0.0793,"80":5.69374,"81":2.91031,"83":0.0119,"84":0.00397,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00793,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.03965,"64":0,"65":0.00397,"66":0.00397,"67":0,"68":0.0793,"69":0,"70":0.00793,"71":0.00397,"72":0.03569,"73":0.00397,"74":0.49563,"75":0.47977,"76":0.00793,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00397,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00397,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00397,"48":0,"49":0,"50":0,"51":0,"52":0.00397,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00397,"66":0.01983,"67":0.3291,"68":0.00793,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00397},G:{"8":0.00108,"3.2":0.00108,"4.0-4.1":0,"4.2-4.3":0.00215,"5.0-5.1":0.01076,"6.0-6.1":0.00323,"7.0-7.1":0.01076,"8.1-8.4":0.01506,"9.0-9.2":0.01291,"9.3":0.15493,"10.0-10.2":0.03981,"10.3":0.13664,"11.0-11.2":0.08823,"11.3-11.4":0.14955,"12.0-12.1":0.18506,"12.2-12.4":1.21257,"13.0-13.1":0.25822,"13.2":0.12588,"13.3":7.04948,"13.4":1.30618},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.02776,"13":0.67009,_:"0","3.1":0,"3.2":0,"5.1":0.06344,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00397,"11.1":0.01586,"12.1":0.01586,"13.1":0.15067},I:{"3":0.00814,"4":0.07324,_:"81","2.1":0,"2.2":0.02441,"2.3":0.00814,"4.1":0.16275,"4.2-4.3":0.34178,"4.4":0,"4.4.3-4.4.4":2.35179},B:{"12":0.00397,"13":0.0119,"14":0.00793,"15":0.0119,"16":0.03172,"17":0.0912,"18":0.97936,_:"79 80 81"},P:{"4":0.22178,"5.0-5.4":0.03327,"6.2-6.4":0.03327,"7.2-7.4":0.18852,"8.2":0.05545,"9.2":0.32159,"10.1":0.38812,"11.1":4.55765},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00831,"9":0,"10":0.01663,"11":0.23278,"5.5":0},N:{"10":0,"11":0.01207},J:{"7":0,"10":0.00604},R:{_:"0"},M:{"0":0.20519},O:{"0":1.78636},Q:{"1.2":0.07846},S:{"2.5":0},H:{"0":0.2971},L:{"0":61.61879}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/HK.js b/website/www/node_modules/caniuse-lite/data/regions/HK.js new file mode 100644 index 000000000000..5aaf1ae8f357 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/HK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00579,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01737,"23":0,"24":0,"25":0,"26":0.01158,"27":0,"28":0,"29":0,"30":0.00579,"31":0,"32":0,"33":0,"34":0.05211,"35":0,"36":0,"37":0,"38":0.12738,"39":0,"40":0.01158,"41":0,"42":0.00579,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01158,"49":0.16791,"50":0,"51":0.00579,"52":0.00579,"53":0.16791,"54":0.00579,"55":0.01737,"56":0.01158,"57":0.02895,"58":0.00579,"59":0.01158,"60":0.01158,"61":0.01158,"62":0.03474,"63":0.03474,"64":0.01737,"65":0.04632,"66":0.02316,"67":0.06369,"68":0.03474,"69":0.06369,"70":0.04632,"71":0.06369,"72":0.05211,"73":0.13896,"74":0.11001,"75":0.13896,"76":0.15054,"77":0.14475,"78":0.20265,"79":0.45741,"80":12.61062,"81":6.30531,"83":0.02895,"84":0.01737,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00579,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00579,"48":0.01158,"49":0,"50":0.00579,"51":0,"52":0.02895,"53":0,"54":0,"55":0,"56":0.00579,"57":0,"58":0,"59":0,"60":0.00579,"61":0,"62":0.00579,"63":0,"64":0.00579,"65":0.01158,"66":0.01158,"67":0.00579,"68":0.10422,"69":0.00579,"70":0.00579,"71":0.01158,"72":0.04053,"73":0.02895,"74":0.61374,"75":1.05378,"76":0.00579,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01158,"37":0,"38":0,"39":0,"40":0.00579,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.12738,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00579},G:{"8":0.00301,"3.2":0.00301,"4.0-4.1":0,"4.2-4.3":0.00603,"5.0-5.1":0.03014,"6.0-6.1":0.00904,"7.0-7.1":0.03014,"8.1-8.4":0.04219,"9.0-9.2":0.03616,"9.3":0.43396,"10.0-10.2":0.1115,"10.3":0.38273,"11.0-11.2":0.24712,"11.3-11.4":0.4189,"12.0-12.1":0.51835,"12.2-12.4":3.39638,"13.0-13.1":0.72327,"13.2":0.3526,"13.3":19.74541,"13.4":3.65857},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01737,"9":0.02316,"10":0.01158,"11":0.03474,"12":0.09843,"13":2.58813,_:"0","3.1":0,"3.2":0,"5.1":0.00579,"6.1":0,"7.1":0,"9.1":0.01737,"10.1":0.08685,"11.1":0.13317,"12.1":0.32424,"13.1":1.09431},I:{"3":0.001,"4":0.00903,_:"81","2.1":0,"2.2":0.00301,"2.3":0.001,"4.1":0.02007,"4.2-4.3":0.04215,"4.4":0,"4.4.3-4.4.4":0.29004},B:{"12":0.00579,"13":0,"14":0.00579,"15":0.01158,"16":0.01158,"17":0.04632,"18":1.27959,_:"79 80 81"},P:{"4":0.60142,"5.0-5.4":0.01074,"6.2-6.4":0.02148,"7.2-7.4":0.04296,"8.2":0.03222,"9.2":0.17183,"10.1":0.25775,"11.1":3.81256},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00993,"9":0.00993,"10":0.00993,"11":1.15138,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.15998},O:{"0":0.47573},Q:{"1.2":0.1684},S:{"2.5":0},H:{"0":0.06776},L:{"0":29.10332}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/HN.js b/website/www/node_modules/caniuse-lite/data/regions/HN.js new file mode 100644 index 000000000000..16e0fdcb3a53 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/HN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00553,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00553,"35":0,"36":0.01107,"37":0,"38":0.05533,"39":0,"40":0.00553,"41":0.01107,"42":0,"43":0.0166,"44":0,"45":0,"46":0,"47":0,"48":0.00553,"49":0.30985,"50":0,"51":0.00553,"52":0,"53":0.07746,"54":0,"55":0,"56":0,"57":0,"58":0.00553,"59":0.01107,"60":0.00553,"61":0,"62":0.00553,"63":0.0332,"64":0.00553,"65":0.0166,"66":0.01107,"67":0.01107,"68":0.0332,"69":0.47031,"70":0.10513,"71":0.11066,"72":0.083,"73":0.12726,"74":0.0498,"75":0.05533,"76":0.083,"77":0.07193,"78":0.09406,"79":0.18812,"80":12.11174,"81":7.21503,"83":0.0166,"84":0.01107,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00553,"46":0.00553,"47":0.01107,"48":0.00553,"49":0,"50":0,"51":0,"52":0.01107,"53":0,"54":0,"55":0,"56":0.00553,"57":0,"58":0,"59":0,"60":0.00553,"61":0,"62":0.00553,"63":0,"64":0.00553,"65":0.00553,"66":0.0332,"67":0,"68":0.083,"69":0,"70":0,"71":0.00553,"72":0.02767,"73":0.02767,"74":0.64736,"75":1.04574,"76":0.0332,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00553,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00553,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00553,"64":0,"65":0,"66":0,"67":0.78569,"68":0.00553,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00108,"3.2":0.00108,"4.0-4.1":0,"4.2-4.3":0.00216,"5.0-5.1":0.01082,"6.0-6.1":0.00325,"7.0-7.1":0.01082,"8.1-8.4":0.01515,"9.0-9.2":0.01299,"9.3":0.15583,"10.0-10.2":0.04004,"10.3":0.13743,"11.0-11.2":0.08873,"11.3-11.4":0.15042,"12.0-12.1":0.18613,"12.2-12.4":1.21956,"13.0-13.1":0.25971,"13.2":0.12661,"13.3":7.09012,"13.4":1.31371},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00553,"11":0.02213,"12":0.0664,"13":0.95168,_:"0","3.1":0,"3.2":0,"5.1":0.96828,"6.1":0,"7.1":0,"9.1":0,"10.1":0.04426,"11.1":0.09959,"12.1":0.24899,"13.1":0.78569},I:{"3":0.00146,"4":0.01314,_:"81","2.1":0,"2.2":0.00438,"2.3":0.00146,"4.1":0.02919,"4.2-4.3":0.06131,"4.4":0,"4.4.3-4.4.4":0.42185},B:{"12":0.01107,"13":0.01107,"14":0.00553,"15":0.01107,"16":0.0332,"17":0.03873,"18":0.66396,_:"79 80 81"},P:{"4":0.3877,"5.0-5.4":0.03061,"6.2-6.4":0.03061,"7.2-7.4":0.12243,"8.2":0.03061,"9.2":0.15304,"10.1":0.29587,"11.1":2.32619},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02623,"9":0.00656,"10":0.00656,"11":0.13771,"5.5":0},N:{"10":0.0134,"11":0.0134},J:{"7":0,"10":0.00447},R:{_:"0"},M:{"0":0.13401},O:{"0":0.13848},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.20722},L:{"0":53.53028}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/HR.js b/website/www/node_modules/caniuse-lite/data/regions/HR.js new file mode 100644 index 000000000000..a26a8264f420 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/HR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00383,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00383,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00383,"37":0,"38":0.00383,"39":0,"40":0,"41":0,"42":0,"43":0.01533,"44":0,"45":0,"46":0,"47":0.00383,"48":0,"49":0.1916,"50":0,"51":0.00383,"52":0,"53":0.0115,"54":0,"55":0.00383,"56":0.00383,"57":0,"58":0.00383,"59":0.00383,"60":0,"61":0.01916,"62":0.00383,"63":0.0115,"64":0.00766,"65":0.00383,"66":0.00766,"67":0.00766,"68":0.00766,"69":0.0115,"70":0.01916,"71":0.03449,"72":0.01916,"73":0.01916,"74":0.03449,"75":0.03449,"76":0.01916,"77":0.13795,"78":0.04215,"79":0.06131,"80":5.93577,"81":3.06943,"83":0.00766,"84":0.00383,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00383,"48":0.00383,"49":0,"50":0,"51":0,"52":0.08047,"53":0,"54":0,"55":0.00383,"56":0.00383,"57":0,"58":0,"59":0.00383,"60":0.00383,"61":0.00383,"62":0.00766,"63":0.00383,"64":0.00383,"65":0.00383,"66":0.00766,"67":0.00383,"68":0.11113,"69":0.00766,"70":0.00766,"71":0.00383,"72":0.01916,"73":0.01533,"74":0.64761,"75":1.19558,"76":0.00766,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00383,"37":0,"38":0,"39":0,"40":0.0115,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00383,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0.00383,"63":0,"64":0,"65":0.00383,"66":0.01533,"67":0.43302,"68":0.00766,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00383},G:{"8":0.00074,"3.2":0.00074,"4.0-4.1":0,"4.2-4.3":0.00148,"5.0-5.1":0.0074,"6.0-6.1":0.00222,"7.0-7.1":0.0074,"8.1-8.4":0.01036,"9.0-9.2":0.00888,"9.3":0.1066,"10.0-10.2":0.02739,"10.3":0.09402,"11.0-11.2":0.0607,"11.3-11.4":0.1029,"12.0-12.1":0.12733,"12.2-12.4":0.8343,"13.0-13.1":0.17767,"13.2":0.08661,"13.3":4.85036,"13.4":0.89871},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00383,"12":0.00766,"13":0.28357,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01533,"11.1":0.01916,"12.1":0.04598,"13.1":0.17244},I:{"3":0.00043,"4":0.00387,_:"81","2.1":0,"2.2":0.00129,"2.3":0.00043,"4.1":0.00859,"4.2-4.3":0.01805,"4.4":0,"4.4.3-4.4.4":0.12417},B:{"12":0,"13":0.00383,"14":0.00383,"15":0.01533,"16":0.00383,"17":0.03832,"18":0.44451,_:"79 80 81"},P:{"4":0.16341,"5.0-5.4":0.03064,"6.2-6.4":0.04085,"7.2-7.4":0.13277,"8.2":0.06128,"9.2":0.41874,"10.1":0.6945,"11.1":6.322},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0958,"9":0.00383,"10":0.00383,"11":0.31806,"5.5":0},N:{"10":0,"11":0.06168},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24055},O:{"0":0.03701},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.25694},L:{"0":66.68814}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/HT.js b/website/www/node_modules/caniuse-lite/data/regions/HT.js new file mode 100644 index 000000000000..833d23152c1c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/HT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00244,"43":0.00244,"44":0,"45":0,"46":0.01218,"47":0,"48":0.00244,"49":0.02192,"50":0,"51":0.00244,"52":0.00244,"53":0.00244,"54":0,"55":0.00731,"56":0.00487,"57":0.00244,"58":0.00487,"59":0.00244,"60":0.01462,"61":0,"62":0.00244,"63":0.01949,"64":0.00244,"65":0.00487,"66":0.00244,"67":0.00244,"68":0.00487,"69":0.01218,"70":0.02436,"71":0.00974,"72":0.00244,"73":0.00487,"74":0.00731,"75":0.01462,"76":0.02192,"77":0.01462,"78":0.01462,"79":0.04385,"80":1.90982,"81":0.98902,"83":0.00244,"84":0.00487,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00244,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00244,"45":0,"46":0,"47":0,"48":0.00487,"49":0,"50":0,"51":0,"52":0.00487,"53":0,"54":0,"55":0,"56":0,"57":0.00244,"58":0,"59":0,"60":0.00244,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03654,"69":0,"70":0,"71":0.00244,"72":0.00487,"73":0.00244,"74":0.17539,"75":0.26065,"76":0.00974,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00244,"18":0,"19":0,"20":0.00974,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00244,"37":0.00244,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00244,"46":0.00244,"47":0.00487,"48":0.00244,"49":0,"50":0,"51":0,"52":0,"53":0.00487,"54":0,"55":0,"56":0,"57":0,"58":0.00244,"60":0,"62":0,"63":0,"64":0,"65":0.00731,"66":0.00731,"67":0.27527,"68":0.00487,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00244},G:{"8":0.0008,"3.2":0.0008,"4.0-4.1":0,"4.2-4.3":0.0016,"5.0-5.1":0.00801,"6.0-6.1":0.0024,"7.0-7.1":0.00801,"8.1-8.4":0.01122,"9.0-9.2":0.00962,"9.3":0.1154,"10.0-10.2":0.02965,"10.3":0.10177,"11.0-11.2":0.06571,"11.3-11.4":0.11139,"12.0-12.1":0.13783,"12.2-12.4":0.90313,"13.0-13.1":0.19233,"13.2":0.09376,"13.3":5.25049,"13.4":0.97285},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00731,"11":0.00487,"12":0.01705,"13":0.28988,_:"0","3.1":0,"3.2":0,"5.1":0.16808,"6.1":0.00244,"7.1":0,"9.1":0.00244,"10.1":0.0268,"11.1":0.03898,"12.1":0.05359,"13.1":0.2168},I:{"3":0.00145,"4":0.01302,_:"81","2.1":0,"2.2":0.00434,"2.3":0.00145,"4.1":0.02893,"4.2-4.3":0.06075,"4.4":0,"4.4.3-4.4.4":0.41802},B:{"12":0.01705,"13":0.01705,"14":0.00731,"15":0.01462,"16":0.0341,"17":0.0268,"18":0.29476,_:"79 80 81"},P:{"4":0.50987,"5.0-5.4":0.17336,"6.2-6.4":0.05099,"7.2-7.4":0.24474,"8.2":0.04079,"9.2":0.18355,"10.1":0.4079,"11.1":1.14211},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00974,"9":0.00244,"10":0.00487,"11":0.10718,"5.5":0},N:{"10":0.01891,"11":0.01891},J:{"7":0,"10":0.00756},R:{_:"0"},M:{"0":0.15884},O:{"0":0.57486},Q:{"1.2":0.00756},S:{"2.5":0},H:{"0":0.98823},L:{"0":80.17723}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/HU.js b/website/www/node_modules/caniuse-lite/data/regions/HU.js new file mode 100644 index 000000000000..e8fec963b868 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/HU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00558,"23":0,"24":0,"25":0,"26":0.00558,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01675,"35":0,"36":0.00558,"37":0,"38":0.03349,"39":0,"40":0.01116,"41":0,"42":0,"43":0.00558,"44":0,"45":0,"46":0,"47":0,"48":0.00558,"49":0.32376,"50":0,"51":0,"52":0,"53":0.05024,"54":0,"55":0.01116,"56":0.00558,"57":0.00558,"58":0.01675,"59":0.01116,"60":0,"61":0.00558,"62":0.00558,"63":0.01116,"64":0.00558,"65":0.01116,"66":0.00558,"67":0.01116,"68":0.01116,"69":0.01675,"70":0.02233,"71":0.03907,"72":0.02791,"73":0.02791,"74":0.02791,"75":0.02233,"76":0.03349,"77":0.03907,"78":0.05582,"79":0.11722,"80":12.76045,"81":6.92168,"83":0.01116,"84":0.00558,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00558,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00558,"48":0.01116,"49":0,"50":0.01116,"51":0.00558,"52":0.13955,"53":0,"54":0.00558,"55":0.00558,"56":0.01116,"57":0.00558,"58":0.00558,"59":0.00558,"60":0.01116,"61":0.00558,"62":0.00558,"63":0.00558,"64":0.00558,"65":0.01116,"66":0.02791,"67":0.01116,"68":0.22328,"69":0.01116,"70":0.01116,"71":0.01116,"72":0.04466,"73":0.02791,"74":1.62436,"75":3.27105,"76":0.01116,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01116,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00558,"46":0.00558,"47":0.01675,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00558,"66":0.00558,"67":1.18338,"68":0.02233,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00129,"3.2":0.00129,"4.0-4.1":0,"4.2-4.3":0.00258,"5.0-5.1":0.01289,"6.0-6.1":0.00387,"7.0-7.1":0.01289,"8.1-8.4":0.01805,"9.0-9.2":0.01547,"9.3":0.18564,"10.0-10.2":0.0477,"10.3":0.16372,"11.0-11.2":0.10571,"11.3-11.4":0.17919,"12.0-12.1":0.22173,"12.2-12.4":1.45288,"13.0-13.1":0.3094,"13.2":0.15083,"13.3":8.44654,"13.4":1.56503},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01116,"12":0.02233,"13":0.54704,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01116,"10.1":0.01116,"11.1":0.05024,"12.1":0.08373,"13.1":0.45772},I:{"3":0.00081,"4":0.00731,_:"81","2.1":0,"2.2":0.00244,"2.3":0.00081,"4.1":0.01625,"4.2-4.3":0.03412,"4.4":0,"4.4.3-4.4.4":0.23477},B:{"12":0,"13":0.00558,"14":0.01116,"15":0.02233,"16":0.01116,"17":0.05582,"18":1.07174,_:"79 80 81"},P:{"4":0.30839,"5.0-5.4":0,"6.2-6.4":0.01028,"7.2-7.4":0.03084,"8.2":0.01028,"9.2":0.08224,"10.1":0.2056,"11.1":2.49799},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00586,"9":0.00586,"10":0,"11":0.34553,"5.5":0},N:{"10":0,"11":0.03093},J:{"7":0,"10":0.00884},R:{_:"0"},M:{"0":0.27392},O:{"0":0.07069},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.35134},L:{"0":50.09123}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ID.js b/website/www/node_modules/caniuse-lite/data/regions/ID.js new file mode 100644 index 000000000000..224c720e2662 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ID.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00409,"34":0.00409,"35":0,"36":0.00819,"37":0,"38":0.01228,"39":0,"40":0,"41":0.00409,"42":0,"43":0.00819,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0655,"50":0,"51":0.00409,"52":0,"53":0.01228,"54":0,"55":0.00409,"56":0.00409,"57":0.00409,"58":0.02866,"59":0,"60":0.00409,"61":0.00819,"62":0.00409,"63":0.04094,"64":0.00409,"65":0.01228,"66":0.00819,"67":0.01638,"68":0.00409,"69":0.01638,"70":0.03685,"71":0.04913,"72":0.03685,"73":0.04913,"74":0.09007,"75":0.06141,"76":0.05732,"77":0.0696,"78":0.08188,"79":0.14329,"80":7.06624,"81":3.44715,"83":0.00819,"84":0.00409,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01638,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00409,"44":0.00409,"45":0.00409,"46":0,"47":0.01228,"48":0.00819,"49":0.00409,"50":0.00409,"51":0,"52":0.03275,"53":0.00409,"54":0.00409,"55":0.00409,"56":0.01228,"57":0.00819,"58":0.00409,"59":0.00409,"60":0.00819,"61":0.00819,"62":0.00819,"63":0.00409,"64":0.00819,"65":0.00819,"66":0.00819,"67":0.00819,"68":0.07369,"69":0.01638,"70":0.01638,"71":0.01638,"72":0.05732,"73":0.02866,"74":0.79833,"75":1.42471,"76":0.09007,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00409,"29":0,"30":0.00409,"31":0,"32":0.00409,"33":0.00409,"34":0.00409,"35":0,"36":0,"37":0.08597,"38":0.00409,"39":0,"40":0,"41":0,"42":0.00409,"43":0,"44":0,"45":0.01638,"46":0.04913,"47":0.12691,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00819,"56":0.00409,"57":0.00409,"58":0.00409,"60":0,"62":0,"63":0,"64":0,"65":0.00409,"66":0.00409,"67":0.31933,"68":0.00409,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00061,"3.2":0.00061,"4.0-4.1":0,"4.2-4.3":0.00122,"5.0-5.1":0.00611,"6.0-6.1":0.00183,"7.0-7.1":0.00611,"8.1-8.4":0.00856,"9.0-9.2":0.00733,"9.3":0.088,"10.0-10.2":0.02261,"10.3":0.07761,"11.0-11.2":0.05011,"11.3-11.4":0.08494,"12.0-12.1":0.10511,"12.2-12.4":0.68871,"13.0-13.1":0.14666,"13.2":0.0715,"13.3":4.00391,"13.4":0.74187},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00409,"11":0.01638,"12":0.04503,"13":0.23745,_:"0","3.1":0,"3.2":0,"5.1":0.4749,"6.1":0,"7.1":0,"9.1":0.00409,"10.1":0.02456,"11.1":0.04913,"12.1":0.10644,"13.1":0.19651},I:{"3":0.00249,"4":0.0224,_:"81","2.1":0,"2.2":0.00747,"2.3":0.00249,"4.1":0.04978,"4.2-4.3":0.10454,"4.4":0,"4.4.3-4.4.4":0.71935},B:{"12":0.00409,"13":0.00409,"14":0.00409,"15":0.00409,"16":0.00409,"17":0.01638,"18":0.20061,_:"79 80 81"},P:{"4":0.70872,"5.0-5.4":0.02025,"6.2-6.4":0.05062,"7.2-7.4":0.13162,"8.2":0.081,"9.2":0.29361,"10.1":0.45561,"11.1":1.37694},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01316,"9":0.00439,"10":0.00439,"11":0.03948,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00591},R:{_:"0"},M:{"0":0.11221},O:{"0":2.91756},Q:{"1.2":0},S:{"2.5":0},H:{"0":1.81162},L:{"0":64.41491}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IE.js b/website/www/node_modules/caniuse-lite/data/regions/IE.js new file mode 100644 index 000000000000..8b139ae13563 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00376,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00376,"28":0,"29":0.00376,"30":0.03008,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00376,"38":0.00376,"39":0,"40":0.00752,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00376,"47":0.01504,"48":0.16544,"49":0.1316,"50":0,"51":0.00376,"52":0,"53":0.01128,"54":0.00376,"55":0.00752,"56":0.00376,"57":0.00752,"58":0.00376,"59":0.00752,"60":0.0188,"61":0.01128,"62":0,"63":0.00752,"64":0.00376,"65":0.01504,"66":0.00752,"67":0.01504,"68":0.0564,"69":0.01504,"70":0.02632,"71":0.0376,"72":0.01504,"73":0.0188,"74":0.0188,"75":0.07144,"76":0.04888,"77":0.02256,"78":0.04512,"79":0.44368,"80":4.99328,"81":2.69968,"83":0.00376,"84":0.00376,_:"85"},C:{"2":0.02632,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01504,"39":0,"40":0,"41":0,"42":0,"43":0.01504,"44":0.06392,"45":0.01504,"46":0.03384,"47":0,"48":0.00752,"49":0,"50":0.00752,"51":0,"52":0.01504,"53":0,"54":0,"55":0,"56":0.00376,"57":0,"58":0.01504,"59":0,"60":0.00376,"61":0,"62":0,"63":0.00376,"64":0.00376,"65":0.01504,"66":0.00376,"67":0.02256,"68":0.12784,"69":0.00376,"70":0.00376,"71":0.00376,"72":0.01128,"73":0.00752,"74":0.28576,"75":0.45496,"76":0.00376,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00376,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.1316,"68":0.00376,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00378,"3.2":0.00378,"4.0-4.1":0,"4.2-4.3":0.00757,"5.0-5.1":0.03784,"6.0-6.1":0.01135,"7.0-7.1":0.03784,"8.1-8.4":0.05297,"9.0-9.2":0.0454,"9.3":0.54483,"10.0-10.2":0.13999,"10.3":0.48051,"11.0-11.2":0.31025,"11.3-11.4":0.52591,"12.0-12.1":0.65077,"12.2-12.4":4.26406,"13.0-13.1":0.90805,"13.2":0.44268,"13.3":24.78982,"13.4":4.59323},E:{"4":0,"5":0,"6":0.00376,"7":0,"8":0.00752,"9":0.02632,"10":0.01504,"11":0.01128,"12":0.02256,"13":0.94,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00752,"10.1":0.03008,"11.1":0.06392,"12.1":0.10528,"13.1":0.45496},I:{"3":0.00103,"4":0.00926,_:"81","2.1":0,"2.2":0.00309,"2.3":0.00103,"4.1":0.02057,"4.2-4.3":0.04319,"4.4":0,"4.4.3-4.4.4":0.2972},B:{"12":0.00752,"13":0.00752,"14":0.00752,"15":0.01128,"16":0.0188,"17":0.04512,"18":0.83096,_:"79 80 81"},P:{"4":0.06332,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03166,"8.2":0.02111,"9.2":0.12665,"10.1":0.29551,"11.1":3.73614},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02325,"9":0.05114,"10":0.0093,"11":0.34871,"5.5":0},N:{"10":0,"11":0.00624},J:{"7":0,"10":0.00624},R:{_:"0"},M:{"0":0.34944},O:{"0":0.07488},Q:{"1.2":0.04368},S:{"2.5":0},H:{"0":0.12997},L:{"0":41.22376}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IL.js b/website/www/node_modules/caniuse-lite/data/regions/IL.js new file mode 100644 index 000000000000..601a3a1ba225 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00445,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0178,"32":0.00445,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01335,"39":0,"40":0.00445,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.16016,"50":0,"51":0,"52":0,"53":0.01335,"54":0,"55":0.00445,"56":0.00445,"57":0.00445,"58":0.00445,"59":0.00445,"60":0,"61":0.0089,"62":0.00445,"63":0.0089,"64":0,"65":0.01335,"66":0.0089,"67":0.02669,"68":0.0089,"69":0.01335,"70":0.03559,"71":0.04449,"72":0.03559,"73":0.02225,"74":0.02225,"75":0.04894,"76":0.02225,"77":0.02669,"78":0.06229,"79":0.12457,"80":9.99245,"81":4.885,"83":0.01335,"84":0.00445,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00445,"26":0.01335,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00445,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00445,"49":0,"50":0.0089,"51":0,"52":0.0178,"53":0,"54":0,"55":0.00445,"56":0.0178,"57":0,"58":0.02669,"59":0,"60":0.01335,"61":0,"62":0,"63":0.00445,"64":0.0089,"65":0.0089,"66":0.00445,"67":0,"68":0.06674,"69":0.00445,"70":0.00445,"71":0.00445,"72":0.08008,"73":0.01335,"74":0.32033,"75":0.48049,"76":0.0089,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00445,"67":0.26249,"68":0.00445,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00177,"3.2":0.00177,"4.0-4.1":0,"4.2-4.3":0.00353,"5.0-5.1":0.01767,"6.0-6.1":0.0053,"7.0-7.1":0.01767,"8.1-8.4":0.02474,"9.0-9.2":0.02121,"9.3":0.25451,"10.0-10.2":0.06539,"10.3":0.22446,"11.0-11.2":0.14493,"11.3-11.4":0.24567,"12.0-12.1":0.30399,"12.2-12.4":1.99186,"13.0-13.1":0.42418,"13.2":0.20679,"13.3":11.58002,"13.4":2.14563},E:{"4":0,"5":0,"6":0,"7":0,"8":0.03114,"9":0,"10":0,"11":0.00445,"12":0.01335,"13":0.38706,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.00445,"7.1":0,"9.1":0.00445,"10.1":0.0178,"11.1":0.02669,"12.1":0.05784,"13.1":0.2269},I:{"3":0.00044,"4":0.00395,_:"81","2.1":0,"2.2":0.00132,"2.3":0.00044,"4.1":0.00877,"4.2-4.3":0.01842,"4.4":0,"4.4.3-4.4.4":0.12672},B:{"12":0,"13":0.00445,"14":0.00445,"15":0.00445,"16":0.0089,"17":0.03559,"18":0.69404,_:"79 80 81"},P:{"4":0.12292,"5.0-5.4":0.03073,"6.2-6.4":0.02049,"7.2-7.4":0.15365,"8.2":0.0717,"9.2":0.56337,"10.1":0.71702,"11.1":5.46982},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00445,"9":0.00445,"10":0.0089,"11":0.55613,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13878},O:{"0":0.07771},Q:{"1.2":0.00555},S:{"2.5":0},H:{"0":0.16817},L:{"0":51.7452}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IM.js b/website/www/node_modules/caniuse-lite/data/regions/IM.js new file mode 100644 index 000000000000..67de37e2cf64 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00498,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00498,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.42356,"50":0,"51":0,"52":0,"53":0.01495,"54":0,"55":0,"56":0.00997,"57":0,"58":0,"59":0.00498,"60":0.00498,"61":0,"62":0,"63":0.01495,"64":0,"65":0.00498,"66":0.00498,"67":0.07475,"68":0,"69":0.00498,"70":0.00498,"71":0.01993,"72":0.06976,"73":0.00498,"74":0.00997,"75":0.08969,"76":0.0299,"77":0.0299,"78":0.11959,"79":0.17939,"80":7.13566,"81":3.47315,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00498,"48":0.01495,"49":0,"50":0,"51":0,"52":0.01495,"53":0,"54":0,"55":0,"56":0.16942,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00997,"67":0,"68":0.15946,"69":0,"70":0.00498,"71":0.00498,"72":0.01993,"73":0.00498,"74":0.32888,"75":0.67271,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00498,"67":0.28901,"68":0.00498,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0041,"3.2":0.0041,"4.0-4.1":0,"4.2-4.3":0.00821,"5.0-5.1":0.04104,"6.0-6.1":0.01231,"7.0-7.1":0.04104,"8.1-8.4":0.05746,"9.0-9.2":0.04925,"9.3":0.59101,"10.0-10.2":0.15186,"10.3":0.52123,"11.0-11.2":0.33655,"11.3-11.4":0.57049,"12.0-12.1":0.70592,"12.2-12.4":4.62544,"13.0-13.1":0.98501,"13.2":0.48019,"13.3":26.89078,"13.4":4.98251},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01495,"12":0.03986,"13":3.03963,_:"0","3.1":0,"3.2":0,"5.1":0.00498,"6.1":0,"7.1":0,"9.1":0.00997,"10.1":0.04983,"11.1":0.25912,"12.1":0.29898,"13.1":1.28561},I:{"3":0.00217,"4":0.01954,_:"81","2.1":0,"2.2":0.00651,"2.3":0.00217,"4.1":0.04343,"4.2-4.3":0.09121,"4.4":0,"4.4.3-4.4.4":0.62759},B:{"12":0,"13":0.00498,"14":0.07475,"15":0.5581,"16":0.00997,"17":0.04983,"18":2.47157,_:"79 80 81"},P:{"4":0.02252,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0.01126,"9.2":0.32647,"10.1":0.20264,"11.1":4.51432},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.01316,"10":0,"11":0.99341,"5.5":0},N:{"10":0,"11":0.01505},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24583},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.0475},L:{"0":26.08227}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IN.js b/website/www/node_modules/caniuse-lite/data/regions/IN.js new file mode 100644 index 000000000000..a80d4a8bcdd7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00251,"34":0,"35":0,"36":0.00251,"37":0,"38":0,"39":0,"40":0,"41":0.00251,"42":0,"43":0,"44":0,"45":0,"46":0.00251,"47":0,"48":0,"49":0.02756,"50":0.00251,"51":0.00251,"52":0,"53":0.00251,"54":0,"55":0.00251,"56":0.00251,"57":0.00251,"58":0.00752,"59":0,"60":0.00251,"61":0.00251,"62":0.00251,"63":0.01503,"64":0.00251,"65":0.00251,"66":0.00501,"67":0.00501,"68":0.00501,"69":0.00752,"70":0.01253,"71":0.03257,"72":0.01002,"73":0.01253,"74":0.02756,"75":0.01253,"76":0.01253,"77":0.01754,"78":0.03006,"79":0.05261,"80":2.97594,"81":1.69839,"83":0.01002,"84":0.00501,_:"85"},C:{"2":0,"3":0,"4":0.00251,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00251,"43":0.00251,"44":0,"45":0,"46":0,"47":0.00251,"48":0.00251,"49":0,"50":0,"51":0,"52":0.00752,"53":0,"54":0,"55":0,"56":0.00251,"57":0,"58":0,"59":0,"60":0.00251,"61":0,"62":0,"63":0.00251,"64":0,"65":0.00251,"66":0.00251,"67":0.00251,"68":0.04008,"69":0.00251,"70":0.00251,"71":0.00251,"72":0.00752,"73":0.00501,"74":0.12525,"75":0.24299,"76":0.02756,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01253,"38":0.00251,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01002,"46":0.02255,"47":0.07014,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00251,"54":0,"55":0.00501,"56":0.00251,"57":0.00501,"58":0.00251,"60":0,"62":0,"63":0,"64":0,"65":0.00251,"66":0.00251,"67":0.09269,"68":0.00251,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00251},G:{"8":0.00028,"3.2":0.00028,"4.0-4.1":0,"4.2-4.3":0.00057,"5.0-5.1":0.00284,"6.0-6.1":0.00085,"7.0-7.1":0.00284,"8.1-8.4":0.00397,"9.0-9.2":0.0034,"9.3":0.04084,"10.0-10.2":0.01049,"10.3":0.03602,"11.0-11.2":0.02326,"11.3-11.4":0.03942,"12.0-12.1":0.04878,"12.2-12.4":0.31964,"13.0-13.1":0.06807,"13.2":0.03318,"13.3":1.85829,"13.4":0.34432},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00251,"12":0.00501,"13":0.07014,_:"0","3.1":0,"3.2":0,"5.1":0.03758,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00251,"11.1":0.00752,"12.1":0.02004,"13.1":0.05511},I:{"3":0.00037,"4":0.00333,_:"81","2.1":0,"2.2":0.00111,"2.3":0.00037,"4.1":0.0074,"4.2-4.3":0.01554,"4.4":0,"4.4.3-4.4.4":0.1069},B:{"12":0.00251,"13":0.00251,"14":0.00251,"15":0.00251,"16":0.00501,"17":0.01503,"18":0.09269,_:"79 80 81"},P:{"4":0.42328,"5.0-5.4":0.02016,"6.2-6.4":0.04031,"7.2-7.4":0.14109,"8.2":0.05039,"9.2":0.21164,"10.1":0.25195,"11.1":0.64499},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00501,"9":0,"10":0.00251,"11":0.03758,"5.5":0},N:{"10":0,"11":0.02998},J:{"7":0,"10":0.0075},R:{_:"0"},M:{"0":0.12742},O:{"0":13.25116},Q:{"1.2":0},S:{"2.5":0.74201},H:{"0":2.23517},L:{"0":67.81349}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IQ.js b/website/www/node_modules/caniuse-lite/data/regions/IQ.js new file mode 100644 index 000000000000..dcf69db848e1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IQ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00514,"27":0,"28":0,"29":0,"30":0,"31":0.00257,"32":0,"33":0.00257,"34":0,"35":0,"36":0.00257,"37":0,"38":0.00771,"39":0,"40":0.04624,"41":0,"42":0.00257,"43":0.04367,"44":0,"45":0.00257,"46":0,"47":0.00257,"48":0,"49":0.02826,"50":0,"51":0,"52":0.00257,"53":0.00514,"54":0,"55":0.00257,"56":0,"57":0,"58":0.00514,"59":0,"60":0.00257,"61":0.00514,"62":0.00257,"63":0.02312,"64":0.00257,"65":0.00514,"66":0,"67":0.00514,"68":0.00771,"69":0.01285,"70":0.01798,"71":0.02055,"72":0.00771,"73":0.01028,"74":0.01798,"75":0.01285,"76":0.01285,"77":0.02569,"78":0.02569,"79":0.05909,"80":2.718,"81":1.6159,"83":0.00514,"84":0.00514,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00257,"48":0,"49":0,"50":0,"51":0,"52":0.00257,"53":0,"54":0,"55":0,"56":0.00257,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00257,"64":0,"65":0,"66":0,"67":0,"68":0.02826,"69":0.00257,"70":0,"71":0.01285,"72":0.00771,"73":0.01028,"74":0.12074,"75":0.24662,"76":0.01541,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00257,"65":0.00257,"66":0.00257,"67":0.21323,"68":0.00771,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00149,"3.2":0.00149,"4.0-4.1":0,"4.2-4.3":0.00299,"5.0-5.1":0.01493,"6.0-6.1":0.00448,"7.0-7.1":0.01493,"8.1-8.4":0.02091,"9.0-9.2":0.01792,"9.3":0.21503,"10.0-10.2":0.05525,"10.3":0.18964,"11.0-11.2":0.12245,"11.3-11.4":0.20756,"12.0-12.1":0.25684,"12.2-12.4":1.68287,"13.0-13.1":0.35838,"13.2":0.17471,"13.3":9.78366,"13.4":1.81278},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00514,"12":0.00514,"13":0.15414,_:"0","3.1":0,"3.2":0,"5.1":0.01798,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00257,"11.1":0.00514,"12.1":0.01285,"13.1":0.09505},I:{"3":0.00159,"4":0.01435,_:"81","2.1":0,"2.2":0.00478,"2.3":0.00159,"4.1":0.0319,"4.2-4.3":0.06698,"4.4":0,"4.4.3-4.4.4":0.46091},B:{"12":0.00257,"13":0.00257,"14":0.00257,"15":0.00257,"16":0.00257,"17":0.01541,"18":0.16699,_:"79 80 81"},P:{"4":0.29985,"5.0-5.4":0.02068,"6.2-6.4":0.06204,"7.2-7.4":0.22747,"8.2":0.04136,"9.2":0.548,"10.1":0.76513,"11.1":6.70003},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.12823,"9":0.00305,"10":0.00305,"11":0.07633,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.10403},O:{"0":0.54989},Q:{"1.2":0.00743},S:{"2.5":0},H:{"0":0.19699},L:{"0":66.03705}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IR.js b/website/www/node_modules/caniuse-lite/data/regions/IR.js new file mode 100644 index 000000000000..2fc83f4d4f42 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IR.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.00451,"13":1.00551,"29":0.00902,"31":0.00451,"33":0.00451,"34":0.00902,"35":0.02705,"38":0.02255,"39":0.00451,"46":0.00451,"48":0.00902,"49":0.29759,"50":0.00451,"51":0.01353,"52":0.00451,"53":0.00902,"55":0.00902,"56":0.00902,"57":0.00902,"58":0.02255,"59":0.00451,"60":0.01353,"61":0.00902,"62":0.02255,"63":0.08567,"64":0.00902,"65":0.01804,"66":0.01353,"67":0.02255,"68":0.01804,"69":0.04058,"70":0.11273,"71":0.18036,"72":0.12174,"73":0.08116,"74":0.05862,"75":0.13076,"76":0.09469,"77":0.08567,"78":0.11273,"79":0.23898,"80":14.72639,"81":8.72492,"83":0.01353,"84":0.00451,_:"4 5 6 7 8 9 10 12 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 32 36 37 40 41 42 43 44 45 47 54 85"},C:{"16":0.00451,"24":0.00451,"25":0.00451,"29":0.00902,"30":0.00902,"31":0.00451,"33":0.01353,"34":0.00451,"35":0.00451,"37":0.00451,"38":0.00451,"39":0.00451,"40":0.00451,"41":0.00902,"42":0.00451,"43":0.02255,"44":0.00902,"45":0.00902,"46":0.00451,"47":0.05411,"48":0.01804,"49":0.01353,"50":0.00902,"52":0.79809,"53":0.00902,"54":0.00902,"55":0.00902,"56":0.04509,"57":0.01804,"58":0.00902,"59":0.01353,"60":0.03156,"61":0.01353,"62":0.03156,"63":0.02255,"64":0.03156,"65":0.04058,"66":0.03156,"67":0.01353,"68":0.32014,"69":0.03156,"70":0.02705,"71":0.03607,"72":0.15331,"73":0.10371,"74":2.89929,"75":5.37473,"76":0.0992,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 26 27 28 32 36 51 77 78 3.5 3.6"},F:{"36":0.00451,"56":0.00902,"57":0.00902,"58":0.00902,"64":0.00902,"65":0.02255,"66":0.03607,"67":0.90631,"68":0.01804,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 60 62 63 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00059,"3.2":0.00059,"4.0-4.1":0,"4.2-4.3":0.00118,"5.0-5.1":0.00588,"6.0-6.1":0.00176,"7.0-7.1":0.00588,"8.1-8.4":0.00823,"9.0-9.2":0.00705,"9.3":0.08465,"10.0-10.2":0.02175,"10.3":0.07466,"11.0-11.2":0.0482,"11.3-11.4":0.08171,"12.0-12.1":0.10111,"12.2-12.4":0.66251,"13.0-13.1":0.14108,"13.2":0.06878,"13.3":3.8516,"13.4":0.71365},E:{"4":0,"10":0.00902,"11":0.01353,"12":0.04058,"13":0.27054,_:"0 5 6 7 8 9 3.1 3.2 6.1 7.1","5.1":0.00902,"9.1":0.00451,"10.1":0.01804,"11.1":0.03607,"12.1":0.08567,"13.1":0.20291},I:{"3":0.00131,"4":0.01178,_:"81","2.1":0,"2.2":0.00393,"2.3":0.00131,"4.1":0.02618,"4.2-4.3":0.05497,"4.4":0,"4.4.3-4.4.4":0.37825},B:{"12":0.04058,"13":0.02705,"14":0.03156,"15":0.02255,"16":0.04058,"17":0.17134,"18":0.54108,_:"79 80 81"},P:{"4":1.63448,"5.0-5.4":0.24214,"6.2-6.4":0.1917,"7.2-7.4":0.72643,"8.2":0.35313,"9.2":1.72528,"10.1":2.15913,"11.1":5.25656},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.98484,"9":0.49469,"10":0.12708,"11":3.2586,_:"6 7 5.5"},N:{"10":0,"11":0},J:{"7":0,"10":0.01098},R:{_:"0"},M:{"0":0.86209},O:{"0":0.17571},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.40029},L:{"0":35.08326}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IS.js b/website/www/node_modules/caniuse-lite/data/regions/IS.js new file mode 100644 index 000000000000..7efdc2fe45d5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.03094,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.03094,"38":0.00619,"39":0,"40":0.00619,"41":0.00619,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00619,"48":0,"49":0.31559,"50":0,"51":0,"52":0,"53":0.00619,"54":0,"55":0,"56":0,"57":0,"58":0.00619,"59":0.2042,"60":0.01238,"61":0.00619,"62":0,"63":0.00619,"64":0.00619,"65":0.02475,"66":0.01856,"67":0.06188,"68":0.01856,"69":0.01238,"70":0.00619,"71":0.05569,"72":0.01238,"73":0.09282,"74":0.02475,"75":0.02475,"76":0.06807,"77":0.0495,"78":0.05569,"79":0.32178,"80":16.11355,"81":6.51596,"83":0.01856,"84":0.00619,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00619,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01856,"46":0,"47":0,"48":0.01238,"49":0,"50":0.21039,"51":0,"52":0.01856,"53":0,"54":0,"55":0,"56":0.01238,"57":0,"58":0.45172,"59":0,"60":0.01238,"61":0,"62":0,"63":0,"64":0,"65":0.00619,"66":0.00619,"67":0.01238,"68":0.21658,"69":0.00619,"70":0,"71":0.01238,"72":0.03713,"73":0.04332,"74":1.00246,"75":1.72645,"76":0.00619,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.08663,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.01238,"66":0.00619,"67":0.65593,"68":0.04332,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00276,"3.2":0.00276,"4.0-4.1":0,"4.2-4.3":0.00551,"5.0-5.1":0.02755,"6.0-6.1":0.00827,"7.0-7.1":0.02755,"8.1-8.4":0.03858,"9.0-9.2":0.03307,"9.3":0.39679,"10.0-10.2":0.10195,"10.3":0.34995,"11.0-11.2":0.22595,"11.3-11.4":0.38301,"12.0-12.1":0.47394,"12.2-12.4":3.10543,"13.0-13.1":0.66132,"13.2":0.32239,"13.3":18.05392,"13.4":3.34516},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00619,"10":0.00619,"11":0.01856,"12":0.06188,"13":2.74747,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.02475,"10.1":0.1052,"11.1":0.25371,"12.1":0.61261,"13.1":1.37374},I:{"3":0.00051,"4":0.00456,_:"81","2.1":0,"2.2":0.00152,"2.3":0.00051,"4.1":0.01012,"4.2-4.3":0.02126,"4.4":0,"4.4.3-4.4.4":0.14628},B:{"12":0.00619,"13":0,"14":0,"15":0.00619,"16":0.00619,"17":0.05569,"18":2.02966,_:"79 80 81"},P:{"4":0.03111,"5.0-5.4":0,"6.2-6.4":0.04147,"7.2-7.4":0.02074,"8.2":0.02074,"9.2":0.13479,"10.1":0.21774,"11.1":3.94008},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00619,"10":0,"11":0.43316,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2554},O:{"0":0.01144},Q:{"1.2":0},S:{"2.5":0.00762},H:{"0":0.12992},L:{"0":27.49456}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/IT.js b/website/www/node_modules/caniuse-lite/data/regions/IT.js new file mode 100644 index 000000000000..0523a0f6fb81 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/IT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00557,"37":0,"38":0.01115,"39":0,"40":0.00557,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00557,"49":0.44592,"50":0.00557,"51":0.00557,"52":0,"53":0.01115,"54":0,"55":0.01115,"56":0.00557,"57":0.00557,"58":0.01115,"59":0.00557,"60":0.00557,"61":0.01672,"62":0.00557,"63":0.02787,"64":0.00557,"65":0.02787,"66":0.03902,"67":0.03902,"68":0.01115,"69":0.03344,"70":0.05574,"71":0.07804,"72":0.05574,"73":0.04459,"74":0.05017,"75":0.03344,"76":0.03344,"77":0.05017,"78":0.07246,"79":0.11705,"80":12.03427,"81":6.78913,"83":0.01115,"84":0.00557,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00557,"45":0.00557,"46":0,"47":0.00557,"48":0.04459,"49":0,"50":0,"51":0,"52":0.08361,"53":0,"54":0.00557,"55":0.00557,"56":0.02787,"57":0,"58":0.00557,"59":0.01115,"60":0.01115,"61":0.00557,"62":0,"63":0.01672,"64":0.01115,"65":0.00557,"66":0.01115,"67":0.00557,"68":0.1505,"69":0.01115,"70":0.01115,"71":0.01115,"72":0.03344,"73":0.02787,"74":0.98102,"75":1.76138,"76":0.01672,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00557,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00557,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00557,"58":0.00557,"60":0,"62":0,"63":0,"64":0,"65":0.00557,"66":0.00557,"67":0.4292,"68":0.01115,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00168,"3.2":0.00168,"4.0-4.1":0,"4.2-4.3":0.00336,"5.0-5.1":0.01679,"6.0-6.1":0.00504,"7.0-7.1":0.01679,"8.1-8.4":0.02351,"9.0-9.2":0.02015,"9.3":0.24178,"10.0-10.2":0.06212,"10.3":0.21323,"11.0-11.2":0.13768,"11.3-11.4":0.23338,"12.0-12.1":0.28879,"12.2-12.4":1.89224,"13.0-13.1":0.40296,"13.2":0.19644,"13.3":11.00086,"13.4":2.03831},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00557,"9":0.00557,"10":0.01115,"11":0.02787,"12":0.08918,"13":1.48268,_:"0","3.1":0,"3.2":0,"5.1":0.01115,"6.1":0.00557,"7.1":0,"9.1":0.0223,"10.1":0.07804,"11.1":0.18952,"12.1":0.31772,"13.1":1.49383},I:{"3":0.00102,"4":0.00915,_:"81","2.1":0,"2.2":0.00305,"2.3":0.00102,"4.1":0.02034,"4.2-4.3":0.04271,"4.4":0,"4.4.3-4.4.4":0.29387},B:{"12":0.00557,"13":0.00557,"14":0.01115,"15":0.01115,"16":0.01672,"17":0.05017,"18":1.12595,_:"79 80 81"},P:{"4":0.1134,"5.0-5.4":0.02062,"6.2-6.4":0.02062,"7.2-7.4":0.05154,"8.2":0.02062,"9.2":0.18556,"10.1":0.34019,"11.1":2.53597},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03608,"9":0.01804,"10":0.01203,"11":0.6975,"5.5":0},N:{"10":0,"11":0.01328},J:{"7":0,"10":0.00443},R:{_:"0"},M:{"0":0.18147},O:{"0":0.17261},Q:{"1.2":0.03983},S:{"2.5":0},H:{"0":0.12152},L:{"0":46.56585}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/JE.js b/website/www/node_modules/caniuse-lite/data/regions/JE.js new file mode 100644 index 000000000000..61de8d189307 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/JE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00506,"39":0.01012,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.09616,"50":0,"51":0,"52":0,"53":0.01012,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00506,"60":0.01012,"61":0.01012,"62":0,"63":0,"64":0,"65":0.01012,"66":0.00506,"67":0.01518,"68":0,"69":0,"70":0.01012,"71":0.00506,"72":0.01518,"73":0.01012,"74":0,"75":0.02531,"76":0.00506,"77":0.01518,"78":0.03543,"79":0.12653,"80":5.82521,"81":4.0488,"83":0.00506,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01012,"49":0,"50":0,"51":0,"52":0.00506,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.07592,"69":0,"70":0,"71":0,"72":0.02531,"73":0.00506,"74":0.50104,"75":0.84519,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00506,"67":0.10122,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00495,"3.2":0.00495,"4.0-4.1":0,"4.2-4.3":0.00991,"5.0-5.1":0.04955,"6.0-6.1":0.01486,"7.0-7.1":0.04955,"8.1-8.4":0.06937,"9.0-9.2":0.05946,"9.3":0.71352,"10.0-10.2":0.18333,"10.3":0.62928,"11.0-11.2":0.40631,"11.3-11.4":0.68874,"12.0-12.1":0.85226,"12.2-12.4":5.58427,"13.0-13.1":1.1892,"13.2":0.57973,"13.3":32.46508,"13.4":6.01535},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00506,"9":0,"10":0.00506,"11":0.01012,"12":0.0911,"13":5.57216,_:"0","3.1":0,"3.2":0,"5.1":0.01012,"6.1":0,"7.1":0,"9.1":0.03543,"10.1":0.08098,"11.1":0.16701,"12.1":0.44537,"13.1":1.67519},I:{"3":0.00283,"4":0.02543,_:"81","2.1":0,"2.2":0.00848,"2.3":0.00283,"4.1":0.05652,"4.2-4.3":0.11869,"4.4":0,"4.4.3-4.4.4":0.8167},B:{"12":0,"13":0,"14":0.00506,"15":0.02531,"16":0.01012,"17":0.08098,"18":1.78653,_:"79 80 81"},P:{"4":0.32268,"5.0-5.4":0,"6.2-6.4":0.01113,"7.2-7.4":0,"8.2":0.02225,"9.2":0.11127,"10.1":0.32268,"11.1":3.08216},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01518,"9":0,"10":0.00506,"11":0.77939,"5.5":0},N:{"10":0,"11":0.04939},J:{"7":0,"10":0.00494},R:{_:"0"},M:{"0":0.15311},O:{"0":0.00494},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.02338},L:{"0":20.0674}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/JM.js b/website/www/node_modules/caniuse-lite/data/regions/JM.js new file mode 100644 index 000000000000..fbaed59df076 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/JM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00393,"12":0,"13":0,"14":0,"15":0,"16":0.00786,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.01966,"34":0,"35":0,"36":0,"37":0,"38":0.01966,"39":0,"40":0,"41":0,"42":0.01966,"43":0,"44":0,"45":0,"46":0.00393,"47":0,"48":0,"49":0.08257,"50":0.00393,"51":0.00393,"52":0,"53":0.0118,"54":0,"55":0.0118,"56":0.00393,"57":0,"58":0.00786,"59":0,"60":0.00786,"61":0.00393,"62":0.00393,"63":0.01966,"64":0,"65":0.00786,"66":0.00393,"67":0.03539,"68":0.00393,"69":0.0118,"70":0.0118,"71":0.04718,"72":0.00786,"73":0.01573,"74":0.02359,"75":0.04325,"76":0.04718,"77":0.03146,"78":0.05898,"79":0.08257,"80":5.95305,"81":3.0591,"83":0.02359,"84":0.01966,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00786,"48":0.00393,"49":0,"50":0,"51":0,"52":0.00393,"53":0,"54":0,"55":0.01966,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00393,"62":0,"63":0.00393,"64":0,"65":0.00393,"66":0,"67":0,"68":0.08257,"69":0,"70":0.00393,"71":0,"72":0.01966,"73":0.0118,"74":0.23199,"75":0.42072,"76":0.0118,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00393,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00393,"58":0.05505,"60":0,"62":0,"63":0,"64":0,"65":0.00393,"66":0.00393,"67":0.27524,"68":0.00393,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00179,"3.2":0.00179,"4.0-4.1":0,"4.2-4.3":0.00359,"5.0-5.1":0.01793,"6.0-6.1":0.00538,"7.0-7.1":0.01793,"8.1-8.4":0.0251,"9.0-9.2":0.02151,"9.3":0.25815,"10.0-10.2":0.06633,"10.3":0.22767,"11.0-11.2":0.147,"11.3-11.4":0.24918,"12.0-12.1":0.30834,"12.2-12.4":2.02036,"13.0-13.1":0.43025,"13.2":0.20974,"13.3":11.74569,"13.4":2.17632},E:{"4":0,"5":0,"6":0,"7":0.00393,"8":0,"9":0,"10":0.00393,"11":0,"12":0.01966,"13":0.53475,_:"0","3.1":0,"3.2":0,"5.1":0.04325,"6.1":0,"7.1":0,"9.1":0.00393,"10.1":0.01573,"11.1":0.03539,"12.1":0.12582,"13.1":0.38534},I:{"3":0.00301,"4":0.02709,_:"81","2.1":0,"2.2":0.00903,"2.3":0.00301,"4.1":0.06019,"4.2-4.3":0.12641,"4.4":0,"4.4.3-4.4.4":0.8698},B:{"12":0.00786,"13":0.0118,"14":0.0118,"15":0.0118,"16":0.02359,"17":0.05898,"18":0.86504,_:"79 80 81"},P:{"4":0.14814,"5.0-5.4":0.04233,"6.2-6.4":0.02116,"7.2-7.4":0.19047,"8.2":0.04233,"9.2":0.15872,"10.1":0.38093,"11.1":3.72469},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01281,"9":0.00427,"10":0.00427,"11":0.12807,"5.5":0},N:{"10":0,"11":0.02427},J:{"7":0,"10":0.02427},R:{_:"0"},M:{"0":0.22452},O:{"0":0.66748},Q:{"1.2":0.04248},S:{"2.5":0.01214},H:{"0":0.18383},L:{"0":59.20748}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/JO.js b/website/www/node_modules/caniuse-lite/data/regions/JO.js new file mode 100644 index 000000000000..d5e34d966ed8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/JO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00364,"37":0,"38":0.00364,"39":0,"40":0.00364,"41":0,"42":0,"43":0.00727,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.1345,"50":0,"51":0,"52":0,"53":0.00364,"54":0.01091,"55":0.00364,"56":0,"57":0,"58":0.01091,"59":0,"60":0,"61":0.01454,"62":0,"63":0.02545,"64":0.00364,"65":0.00727,"66":0.01454,"67":0.02181,"68":0.00364,"69":0.01091,"70":0.05816,"71":0.03635,"72":0.01091,"73":0.02908,"74":0.03999,"75":0.02908,"76":0.03272,"77":0.03272,"78":0.03272,"79":0.0727,"80":6.43759,"81":3.14064,"83":0.00727,"84":0.00364,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00364,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00364,"48":0,"49":0,"50":0,"51":0,"52":0.00727,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.03272,"64":0,"65":0.00364,"66":0,"67":0,"68":0.05089,"69":0.00364,"70":0.00727,"71":0.00364,"72":0.01091,"73":0.00364,"74":0.27263,"75":0.4253,"76":0.00364,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00364,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00364,"67":0.38895,"68":0.00727,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00122,"3.2":0.00122,"4.0-4.1":0,"4.2-4.3":0.00244,"5.0-5.1":0.0122,"6.0-6.1":0.00366,"7.0-7.1":0.0122,"8.1-8.4":0.01708,"9.0-9.2":0.01464,"9.3":0.17564,"10.0-10.2":0.04513,"10.3":0.15491,"11.0-11.2":0.10002,"11.3-11.4":0.16954,"12.0-12.1":0.2098,"12.2-12.4":1.37465,"13.0-13.1":0.29274,"13.2":0.14271,"13.3":7.99176,"13.4":1.48077},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00364,"12":0.03635,"13":0.28717,_:"0","3.1":0,"3.2":0,"5.1":0.01454,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02181,"11.1":0.04362,"12.1":0.09451,"13.1":0.29807},I:{"3":0.00072,"4":0.00648,_:"81","2.1":0,"2.2":0.00216,"2.3":0.00072,"4.1":0.0144,"4.2-4.3":0.03023,"4.4":0,"4.4.3-4.4.4":0.20802},B:{"12":0.00364,"13":0.00364,"14":0.00364,"15":0.01091,"16":0.00364,"17":0.02908,"18":0.36714,_:"79 80 81"},P:{"4":0.27333,"5.0-5.4":0.03037,"6.2-6.4":0.04049,"7.2-7.4":0.26321,"8.2":0.06074,"9.2":0.48592,"10.1":0.52642,"11.1":2.57134},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01504,"9":0.00376,"10":0.00376,"11":0.08649,"5.5":0},N:{"10":0,"11":0.0191},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.10821},O:{"0":0.49647},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.21091},L:{"0":67.42944}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/JP.js b/website/www/node_modules/caniuse-lite/data/regions/JP.js new file mode 100644 index 000000000000..c0db94703bba --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/JP.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00599,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.01198,"36":0,"37":0,"38":0,"39":0,"40":0.00599,"41":0,"42":0,"43":0.00599,"44":0,"45":0,"46":0.00599,"47":0,"48":0.00599,"49":0.42543,"50":0.00599,"51":0.00599,"52":0,"53":0.00599,"54":0.00599,"55":0.01198,"56":0.01798,"57":0.01198,"58":0.00599,"59":0.01198,"60":0.01798,"61":0.00599,"62":0.01798,"63":0.01798,"64":0.01198,"65":0.04794,"66":0.01198,"67":0.05992,"68":0.01198,"69":0.06591,"70":0.03595,"71":0.05393,"72":0.02996,"73":0.04794,"74":0.04794,"75":0.05992,"76":0.05992,"77":0.05992,"78":0.12583,"79":0.21571,"80":10.88147,"81":4.90146,"83":0.01798,"84":0.01798,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00599,"46":0,"47":0,"48":0.04194,"49":0.00599,"50":0.01198,"51":0,"52":0.05393,"53":0.00599,"54":0,"55":0.00599,"56":0.04794,"57":0.00599,"58":0.01798,"59":0,"60":0.01198,"61":0,"62":0.00599,"63":0.01198,"64":0.00599,"65":0.01798,"66":0.01198,"67":0.00599,"68":0.12583,"69":0.01198,"70":0.01198,"71":0.01198,"72":0.05393,"73":0.04194,"74":0.99467,"75":1.97137,"76":0.01798,"77":0.01198,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.19174,"68":0.00599,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00599},G:{"8":0.00389,"3.2":0.00389,"4.0-4.1":0,"4.2-4.3":0.00777,"5.0-5.1":0.03886,"6.0-6.1":0.01166,"7.0-7.1":0.03886,"8.1-8.4":0.0544,"9.0-9.2":0.04663,"9.3":0.55956,"10.0-10.2":0.14378,"10.3":0.4935,"11.0-11.2":0.31864,"11.3-11.4":0.54013,"12.0-12.1":0.66836,"12.2-12.4":4.37931,"13.0-13.1":0.9326,"13.2":0.45464,"13.3":25.45986,"13.4":4.71738},E:{"4":0,"5":0.00599,"6":0,"7":0,"8":0.00599,"9":0.00599,"10":0.01198,"11":0.03595,"12":0.0719,"13":1.88149,_:"0","3.1":0,"3.2":0,"5.1":0.00599,"6.1":0.00599,"7.1":0,"9.1":0.02996,"10.1":0.08988,"11.1":0.19774,"12.1":0.33555,"13.1":1.20439},I:{"3":0.00187,"4":0.01682,_:"81","2.1":0,"2.2":0.00561,"2.3":0.00187,"4.1":0.03737,"4.2-4.3":0.07848,"4.4":0,"4.4.3-4.4.4":0.54001},B:{"12":0,"13":0.00599,"14":0.00599,"15":0.00599,"16":0.01198,"17":0.0719,"18":3.07989,_:"79 80 81"},P:{"4":0.01059,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0.01059,"9.2":0.07413,"10.1":0.1059,"11.1":1.10139},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02644,"9":0.02644,"10":0.01322,"11":3.39728,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.17234},O:{"0":0.27655},Q:{"1.2":0.10822},S:{"2.5":0},H:{"0":0.11004},L:{"0":24.65881}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KE.js b/website/www/node_modules/caniuse-lite/data/regions/KE.js new file mode 100644 index 000000000000..2a8158cbc2da --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0043,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0043,"32":0,"33":0,"34":0.0043,"35":0,"36":0.0043,"37":0,"38":0.00861,"39":0,"40":0.0043,"41":0,"42":0.0043,"43":0.0043,"44":0,"45":0,"46":0.0043,"47":0.00861,"48":0,"49":0.07745,"50":0.0043,"51":0.0043,"52":0,"53":0.0043,"54":0,"55":0.0043,"56":0.0043,"57":0.0043,"58":0.00861,"59":0.0043,"60":0.0043,"61":0.0043,"62":0.01291,"63":0.03012,"64":0.0043,"65":0.01291,"66":0.0043,"67":0.02582,"68":0.01291,"69":0.03442,"70":0.01721,"71":0.03442,"72":0.02152,"73":0.08176,"74":0.04303,"75":0.03442,"76":0.03012,"77":0.03442,"78":0.06024,"79":0.11618,"80":6.64383,"81":3.77803,"83":0.01721,"84":0.00861,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.0043,"31":0,"32":0,"33":0.0043,"34":0.0043,"35":0,"36":0.0043,"37":0,"38":0.0043,"39":0.0043,"40":0.0043,"41":0.0043,"42":0.0043,"43":0.00861,"44":0.0043,"45":0.0043,"46":0.0043,"47":0.01721,"48":0.01291,"49":0.0043,"50":0.0043,"51":0,"52":0.03873,"53":0,"54":0.0043,"55":0,"56":0.02152,"57":0.0043,"58":0.0043,"59":0.0043,"60":0.01291,"61":0.0043,"62":0.0043,"63":0.0043,"64":0.0043,"65":0.00861,"66":0.01721,"67":0.0043,"68":0.18073,"69":0.00861,"70":0.01291,"71":0.01721,"72":0.03873,"73":0.03442,"74":0.72721,"75":1.36835,"76":0.142,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0.0043,"16":0.00861,"17":0,"18":0,"19":0.0043,"20":0.01721,"21":0,"22":0,"23":0.02582,"24":0.03873,"25":0.0043,"26":0.03012,"27":0.04733,"28":0.05164,"29":0.00861,"30":0.03012,"31":0.01721,"32":0.04303,"33":0.03012,"34":0,"35":0.00861,"36":0.0043,"37":0.01721,"38":0.03873,"39":0,"40":0,"41":0.0043,"42":0.03012,"43":0.0043,"44":0.0043,"45":0.05594,"46":0.34854,"47":0.61963,"48":0.00861,"49":0,"50":0,"51":0,"52":0,"53":0.01291,"54":0.0043,"55":0.0043,"56":0.01721,"57":0.02582,"58":0.0043,"60":0,"62":0,"63":0,"64":0,"65":0.00861,"66":0.01291,"67":0.66697,"68":0.03012,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.05594},G:{"8":0.00058,"3.2":0.00058,"4.0-4.1":0,"4.2-4.3":0.00117,"5.0-5.1":0.00585,"6.0-6.1":0.00175,"7.0-7.1":0.00585,"8.1-8.4":0.00819,"9.0-9.2":0.00702,"9.3":0.08419,"10.0-10.2":0.02163,"10.3":0.07425,"11.0-11.2":0.04794,"11.3-11.4":0.08127,"12.0-12.1":0.10056,"12.2-12.4":0.6589,"13.0-13.1":0.14032,"13.2":0.0684,"13.3":3.83064,"13.4":0.70977},E:{"4":0,"5":0,"6":0,"7":0.0043,"8":0.0043,"9":0,"10":0,"11":0.00861,"12":0.02152,"13":0.37006,_:"0","3.1":0,"3.2":0,"5.1":0.5766,"6.1":0,"7.1":0,"9.1":0.0043,"10.1":0.03012,"11.1":0.05164,"12.1":0.09036,"13.1":0.32273},I:{"3":0.00167,"4":0.01504,_:"81","2.1":0,"2.2":0.00501,"2.3":0.00167,"4.1":0.03342,"4.2-4.3":0.07019,"4.4":0,"4.4.3-4.4.4":0.48299},B:{"12":0.02152,"13":0.01721,"14":0.02152,"15":0.01721,"16":0.01291,"17":0.03873,"18":0.44321,_:"79 80 81"},P:{"4":0.39259,"5.0-5.4":0,"6.2-6.4":0.02066,"7.2-7.4":0.10331,"8.2":0.01033,"9.2":0.13431,"10.1":0.30994,"11.1":1.0228},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01223,"9":0.00611,"10":0.01223,"11":0.20179,"5.5":0},N:{"10":0.03845,"11":0.16664},J:{"7":0,"10":0.04558},R:{_:"0"},M:{"0":0.23927},O:{"0":1.42995},Q:{"1.2":0.0057},S:{"2.5":0.01139},H:{"0":9.75154},L:{"0":55.75057}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KG.js b/website/www/node_modules/caniuse-lite/data/regions/KG.js new file mode 100644 index 000000000000..d9ee53f8076d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.01701,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00567,"48":0,"49":0.1758,"50":0,"51":0,"52":0,"53":0.00567,"54":0.00567,"55":0.00567,"56":0.05104,"57":0.00567,"58":0.00567,"59":0.02268,"60":0,"61":0.02268,"62":0,"63":0.01134,"64":0,"65":0.22117,"66":0.01134,"67":0.00567,"68":0.00567,"69":0.00567,"70":0.06805,"71":0.24385,"72":0.05671,"73":0.04537,"74":0.06238,"75":0.17013,"76":0.0397,"77":0.06238,"78":0.10775,"79":0.18714,"80":18.40807,"81":5.33074,"83":0.01701,"84":0.00567,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01701,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.0397,"53":0,"54":0,"55":0,"56":0,"57":0.00567,"58":0,"59":0,"60":0,"61":0.05104,"62":0,"63":0,"64":0.10775,"65":0,"66":0.00567,"67":0.00567,"68":0.0397,"69":0.00567,"70":0,"71":0.00567,"72":0.01134,"73":0.00567,"74":0.29489,"75":0.43667,"76":0.01701,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01134,"37":0.00567,"38":0,"39":0,"40":0,"41":0,"42":0.00567,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00567,"66":0.00567,"67":1.93381,"68":0.01701,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01134},G:{"8":0.00072,"3.2":0.00072,"4.0-4.1":0,"4.2-4.3":0.00143,"5.0-5.1":0.00715,"6.0-6.1":0.00215,"7.0-7.1":0.00715,"8.1-8.4":0.01001,"9.0-9.2":0.00858,"9.3":0.10299,"10.0-10.2":0.02646,"10.3":0.09083,"11.0-11.2":0.05865,"11.3-11.4":0.09942,"12.0-12.1":0.12302,"12.2-12.4":0.80606,"13.0-13.1":0.17165,"13.2":0.08368,"13.3":4.68615,"13.4":0.86828},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01701,"12":0.00567,"13":0.54442,_:"0","3.1":0,"3.2":0,"5.1":0.09641,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02836,"11.1":0.06805,"12.1":0.0397,"13.1":0.3516},I:{"3":0.00044,"4":0.00399,_:"81","2.1":0,"2.2":0.00133,"2.3":0.00044,"4.1":0.00886,"4.2-4.3":0.0186,"4.4":0,"4.4.3-4.4.4":0.12799},B:{"12":0,"13":0.00567,"14":0.00567,"15":0.00567,"16":0.01134,"17":0.01701,"18":0.32325,_:"79 80 81"},P:{"4":0.97617,"5.0-5.4":0.04067,"6.2-6.4":0.13219,"7.2-7.4":0.21354,"8.2":0.07118,"9.2":0.31522,"10.1":0.47791,"11.1":1.47442},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00882,"9":0,"10":0,"11":0.14997,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.04762},O:{"0":1.33766},Q:{"1.2":0.01732},S:{"2.5":0},H:{"0":0.36066},L:{"0":51.60293}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KH.js b/website/www/node_modules/caniuse-lite/data/regions/KH.js new file mode 100644 index 000000000000..59bca3a8f586 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00669,"31":0,"32":0,"33":0.00669,"34":0.00669,"35":0,"36":0.02007,"37":0,"38":0.01338,"39":0,"40":0.02007,"41":0.01338,"42":0,"43":0.02007,"44":0,"45":0,"46":0,"47":0.01338,"48":0.01338,"49":0.39477,"50":0.00669,"51":0.00669,"52":0.00669,"53":0.04015,"54":0,"55":0.00669,"56":0.02676,"57":0.00669,"58":0.01338,"59":0.00669,"60":0.01338,"61":0.01338,"62":0.02007,"63":0.05353,"64":0.00669,"65":0.01338,"66":0.00669,"67":0.03346,"68":0.04684,"69":0.08698,"70":0.3747,"71":0.4483,"72":0.40815,"73":0.27433,"74":0.19404,"75":0.0736,"76":0.10706,"77":0.0736,"78":0.11375,"79":0.3011,"80":19.08942,"81":9.86923,"83":0.08029,"84":0.04015,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00669,"31":0,"32":0.00669,"33":0,"34":0.00669,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00669,"42":0.00669,"43":0.00669,"44":0.00669,"45":0.00669,"46":0,"47":0.01338,"48":0.00669,"49":0.00669,"50":0.01338,"51":0.00669,"52":0.02007,"53":0.00669,"54":0.00669,"55":0.03346,"56":0.02007,"57":0.02007,"58":0.01338,"59":0.00669,"60":0.01338,"61":0.01338,"62":0.03346,"63":0.15389,"64":0.06691,"65":0.10706,"66":0.01338,"67":0.02007,"68":0.13382,"69":0.03346,"70":0.04015,"71":0.04684,"72":0.0736,"73":0.05353,"74":1.73966,"75":2.68978,"76":0.13382,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01338,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.02676,"57":0.00669,"58":0.02007,"60":0,"62":0,"63":0,"64":0,"65":0.00669,"66":0.00669,"67":0.76947,"68":0.01338,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00219,"3.2":0.00219,"4.0-4.1":0,"4.2-4.3":0.00437,"5.0-5.1":0.02185,"6.0-6.1":0.00656,"7.0-7.1":0.02185,"8.1-8.4":0.03059,"9.0-9.2":0.02622,"9.3":0.31468,"10.0-10.2":0.08085,"10.3":0.27753,"11.0-11.2":0.17919,"11.3-11.4":0.30375,"12.0-12.1":0.37586,"12.2-12.4":2.46277,"13.0-13.1":0.52446,"13.2":0.25567,"13.3":14.31774,"13.4":2.65289},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01338,"9":0.00669,"10":0.00669,"11":0.02007,"12":0.16058,"13":1.15754,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01338,"10.1":0.04015,"11.1":0.11375,"12.1":0.38808,"13.1":0.73601},I:{"3":0.00097,"4":0.00869,_:"81","2.1":0,"2.2":0.0029,"2.3":0.00097,"4.1":0.01932,"4.2-4.3":0.04056,"4.4":0,"4.4.3-4.4.4":0.27911},B:{"12":0.00669,"13":0.01338,"14":0.01338,"15":0.01338,"16":0.02007,"17":0.08698,"18":0.70925,_:"79 80 81"},P:{"4":0.23125,"5.0-5.4":0.02011,"6.2-6.4":0.02011,"7.2-7.4":0.05027,"8.2":0.02011,"9.2":0.08043,"10.1":0.16087,"11.1":0.98532},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01167,"7":0.01167,"8":0.05835,"9":0.02334,"10":0.02334,"11":0.37345,"5.5":0},N:{"10":0.01406,"11":0.04219},J:{"7":0,"10":0.01324},R:{_:"0"},M:{"0":0.12574},O:{"0":0.81732},Q:{"1.2":0.07942},S:{"2.5":0},H:{"0":0.50437},L:{"0":28.57335}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KI.js b/website/www/node_modules/caniuse-lite/data/regions/KI.js new file mode 100644 index 000000000000..edbe5f7bac02 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.01751,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.007,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02101,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0035,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.007,"62":0,"63":0.06302,"64":0,"65":0,"66":0.007,"67":0.014,"68":0.13304,"69":0.07352,"70":0,"71":0.57066,"72":0.03851,"73":0.014,"74":0,"75":0.014,"76":0,"77":0.0105,"78":0,"79":0.09803,"80":3.36096,"81":1.63847,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.007,"48":0,"49":0,"50":0,"51":0,"52":0.0035,"53":0,"54":0,"55":0,"56":0.04551,"57":0,"58":0,"59":0.0105,"60":0.0035,"61":0.0105,"62":0,"63":0.014,"64":0.02451,"65":0.02801,"66":0.0105,"67":0,"68":0.05602,"69":0.0035,"70":0.0105,"71":0.04901,"72":0.03501,"73":0.12254,"74":0.19256,"75":0.53565,"76":0.07352,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0035,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0035,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.02451,"66":0,"67":0.20306,"68":0.0035,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0035},G:{"8":0.0008,"3.2":0.0008,"4.0-4.1":0,"4.2-4.3":0.00159,"5.0-5.1":0.00795,"6.0-6.1":0.00239,"7.0-7.1":0.00795,"8.1-8.4":0.01113,"9.0-9.2":0.00954,"9.3":0.11448,"10.0-10.2":0.02942,"10.3":0.10097,"11.0-11.2":0.06519,"11.3-11.4":0.11051,"12.0-12.1":0.13674,"12.2-12.4":0.89597,"13.0-13.1":0.1908,"13.2":0.09302,"13.3":5.20885,"13.4":0.96513},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":1.78551,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0},I:{"3":0.0037,"4":0.03332,_:"81","2.1":0,"2.2":0.01111,"2.3":0.0037,"4.1":0.07405,"4.2-4.3":0.15551,"4.4":0,"4.4.3-4.4.4":1.07008},B:{"12":0.04201,"13":0.03851,"14":0.04901,"15":0.04551,"16":0.12954,"17":0.18905,"18":0.53915,_:"79 80 81"},P:{"4":1.27475,"5.0-5.4":0.04112,"6.2-6.4":0.08224,"7.2-7.4":0.8841,"8.2":0.03084,"9.2":0.44205,"10.1":0.23645,"11.1":0.40093},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.007,"10":0,"11":0.25207,"5.5":0},N:{"10":0,"11":0.0325},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.21447},O:{"0":1.06584},Q:{"1.2":0},S:{"2.5":0.0195},H:{"0":0.33841},L:{"0":73.00454}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KM.js b/website/www/node_modules/caniuse-lite/data/regions/KM.js new file mode 100644 index 000000000000..33e15a0a5a42 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00332,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00332,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.01659,"44":0,"45":0,"46":0.03317,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00995,"58":0.00663,"59":0.00332,"60":0,"61":0,"62":0,"63":0.06634,"64":0.00332,"65":0.00332,"66":0.00663,"67":0.00332,"68":0.02654,"69":0.06966,"70":0.03649,"71":0.00332,"72":0.01327,"73":0.00663,"74":0.03317,"75":0.00332,"76":0.01659,"77":0.00663,"78":0.0199,"79":0.10614,"80":3.96713,"81":1.69167,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0.00332,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00332,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00332,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00332,"48":0,"49":0,"50":0,"51":0,"52":0.00332,"53":0,"54":0,"55":0.02654,"56":0.01327,"57":0.00332,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00995,"68":0.01327,"69":0.00995,"70":0,"71":0.00332,"72":0.02654,"73":0.00995,"74":0.8193,"75":0.47765,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0.00332,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00663,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00663,"54":0,"55":0,"56":0,"57":0,"58":0.00332,"60":0,"62":0,"63":0.00332,"64":0.00332,"65":0.00332,"66":0.08624,"67":0.38477,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00036,"3.2":0.00036,"4.0-4.1":0,"4.2-4.3":0.00071,"5.0-5.1":0.00356,"6.0-6.1":0.00107,"7.0-7.1":0.00356,"8.1-8.4":0.00499,"9.0-9.2":0.00428,"9.3":0.05132,"10.0-10.2":0.01319,"10.3":0.04526,"11.0-11.2":0.02922,"11.3-11.4":0.04954,"12.0-12.1":0.0613,"12.2-12.4":0.40165,"13.0-13.1":0.08553,"13.2":0.0417,"13.3":2.33504,"13.4":0.43265},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01327,"11":0,"12":0,"13":0.05639,_:"0","3.1":0,"3.2":0,"5.1":0.00332,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00995,"11.1":0.00663,"12.1":0.01327,"13.1":0.02322},I:{"3":0.00351,"4":0.03156,_:"81","2.1":0,"2.2":0.01052,"2.3":0.00351,"4.1":0.07013,"4.2-4.3":0.14727,"4.4":0,"4.4.3-4.4.4":1.01336},B:{"12":0.05307,"13":0.01659,"14":0,"15":0.02985,"16":0.0199,"17":0.02322,"18":0.13931,_:"79 80 81"},P:{"4":0.98957,"5.0-5.4":0.03029,"6.2-6.4":0.0101,"7.2-7.4":0.40391,"8.2":0.0101,"9.2":0.23225,"10.1":0.34332,"11.1":0.74723},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03317,"9":0,"10":0.00995,"11":0.12605,"5.5":0},N:{"10":0.02139,"11":0.13901},J:{"7":0,"10":0.00668},R:{_:"0"},M:{"0":0.07351},O:{"0":0.67498},Q:{"1.2":0.02005},S:{"2.5":0},H:{"0":0.90477},L:{"0":78.95649}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KN.js b/website/www/node_modules/caniuse-lite/data/regions/KN.js new file mode 100644 index 000000000000..dae28658b340 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00615,"48":0,"49":0.01844,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.02458,"64":0,"65":0,"66":0,"67":0.00615,"68":0.02458,"69":0.01229,"70":0.02458,"71":0,"72":0,"73":0,"74":0.00615,"75":0.06146,"76":0.00615,"77":0.03073,"78":0.01229,"79":0.23969,"80":6.62539,"81":17.88486,"83":0.00615,"84":0.00615,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.01229,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.25199,"69":0.00615,"70":0,"71":0,"72":0.00615,"73":0.00615,"74":0.31345,"75":0.39334,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00615,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.14136,"68":0.02458,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00123,"3.2":0.00123,"4.0-4.1":0,"4.2-4.3":0.00245,"5.0-5.1":0.01226,"6.0-6.1":0.00368,"7.0-7.1":0.01226,"8.1-8.4":0.01716,"9.0-9.2":0.01471,"9.3":0.17653,"10.0-10.2":0.04536,"10.3":0.15569,"11.0-11.2":0.10053,"11.3-11.4":0.1704,"12.0-12.1":0.21086,"12.2-12.4":1.38161,"13.0-13.1":0.29422,"13.2":0.14343,"13.3":8.03223,"13.4":1.48827},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.01844,"13":0.89732,_:"0","3.1":0,"3.2":0,"5.1":0.00615,"6.1":0,"7.1":0,"9.1":0,"10.1":0.11063,"11.1":0.04302,"12.1":0.09834,"13.1":1.44431},I:{"3":0.00687,"4":0.06181,_:"81","2.1":0,"2.2":0.0206,"2.3":0.00687,"4.1":0.13737,"4.2-4.3":0.28847,"4.4":0,"4.4.3-4.4.4":1.98495},B:{"12":0.02458,"13":0.00615,"14":0.00615,"15":0.00615,"16":0.03073,"17":0.15365,"18":1.6963,_:"79 80 81"},P:{"4":0.29684,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05301,"8.2":0,"9.2":0.05301,"10.1":0.31804,"11.1":2.85177},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.01229,"11":4.08094,"5.5":0},N:{"10":0,"11":0.00771},J:{"7":0,"10":0.01156},R:{_:"0"},M:{"0":0.43165},O:{"0":0.03083},Q:{"1.2":0},S:{"2.5":0},H:{"0":1.11286},L:{"0":41.78773}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KP.js b/website/www/node_modules/caniuse-lite/data/regions/KP.js new file mode 100644 index 000000000000..a393821d4abf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KP.js @@ -0,0 +1 @@ +module.exports={D:{"18":0.18888,"43":1.86412,"68":3.3505,"70":1.48637,"73":0.36954,"76":0.55842,"77":12.6629,"78":0.92796,"79":5.58416,"80":21.78644,"81":1.30571,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 71 72 74 75 83 84 85"},C:{"52":10.42924,"59":0.18888,"69":1.67525,"71":0.36954,"72":0.18888,"73":1.30571,"74":1.48637,"75":3.90891,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 60 61 62 63 64 65 66 67 68 70 76 77 78 3.5 3.6"},F:{"34":0.18888,"64":0.74729,"65":0.18888,"67":2.42254,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 66 68 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00021,"3.2":0.00021,"4.0-4.1":0,"4.2-4.3":0.00042,"5.0-5.1":0.00209,"6.0-6.1":0.00063,"7.0-7.1":0.00209,"8.1-8.4":0.00293,"9.0-9.2":0.00251,"9.3":0.0301,"10.0-10.2":0.00773,"10.3":0.02654,"11.0-11.2":0.01714,"11.3-11.4":0.02905,"12.0-12.1":0.03595,"12.2-12.4":0.23554,"13.0-13.1":0.05016,"13.2":0.02445,"13.3":1.36934,"13.4":0.25372},E:{"4":0,_:"0 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1"},I:{"3":0.00052,"4":0.00467,_:"81","2.1":0,"2.2":0.00156,"2.3":0.00052,"4.1":0.01038,"4.2-4.3":0.0218,"4.4":0,"4.4.3-4.4.4":0.14998},B:{"18":0.92796,_:"12 13 14 15 16 17 79 80 81"},P:{"4":1.27475,"5.0-5.4":0.04112,"6.2-6.4":0.08224,"7.2-7.4":0.8841,"8.2":0.03084,"9.2":0.44205,"10.1":2.27897,"11.1":0.19245},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"11":2.42254,_:"6 7 8 9 10 5.5"},N:{"10":0,"11":0.0325},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":12.73774}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KR.js b/website/www/node_modules/caniuse-lite/data/regions/KR.js new file mode 100644 index 000000000000..230c8637e81d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KR.js @@ -0,0 +1 @@ +module.exports={D:{"23":0.022,"31":0.32994,"42":0.03849,"48":0.011,"49":0.17597,"55":0.0055,"56":0.011,"58":0.0055,"61":0.0055,"62":0.0055,"63":0.011,"65":0.022,"66":0.011,"67":0.04399,"68":0.022,"69":0.03299,"70":0.16497,"71":0.22546,"72":0.21446,"73":0.11548,"74":0.03299,"75":0.03849,"76":0.04399,"77":0.22546,"78":0.07699,"79":0.15397,"80":23.6237,"81":11.89984,"83":0.011,"84":0.0165,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 50 51 52 53 54 57 59 60 64 85"},C:{"52":0.0165,"56":0.0275,"63":0.0275,"64":0.0165,"65":0.0165,"66":0.0165,"68":0.011,"72":0.011,"73":0.011,"74":0.23646,"75":0.42892,"76":0.011,"77":0.011,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 67 69 70 71 78 3.5 3.6"},F:{"57":0.0055,"58":0.022,"67":0.14297,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 60 62 63 64 65 66 68 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00088,"3.2":0.00088,"4.0-4.1":0,"4.2-4.3":0.00177,"5.0-5.1":0.00884,"6.0-6.1":0.00265,"7.0-7.1":0.00884,"8.1-8.4":0.01237,"9.0-9.2":0.01061,"9.3":0.12728,"10.0-10.2":0.0327,"10.3":0.11225,"11.0-11.2":0.07248,"11.3-11.4":0.12286,"12.0-12.1":0.15203,"12.2-12.4":0.99615,"13.0-13.1":0.21214,"13.2":0.10342,"13.3":5.79129,"13.4":1.07305},E:{"4":0,"8":0.011,"9":0.0055,"11":0.0165,"12":0.05499,"13":0.68738,_:"0 5 6 7 10 3.1 3.2 5.1 6.1 7.1","9.1":0.0055,"10.1":0.03849,"11.1":0.06049,"12.1":0.19796,"13.1":0.5609},I:{"3":0.00014,"4":0.00122,_:"81","2.1":0,"2.2":0.00041,"2.3":0.00014,"4.1":0.00271,"4.2-4.3":0.0057,"4.4":0,"4.4.3-4.4.4":0.03919},B:{"13":0.0055,"14":0.011,"15":0.011,"16":0.022,"17":0.09898,"18":2.62852,_:"12 79 80 81"},P:{"4":0.06068,"5.0-5.4":0.08091,"6.2-6.4":0.01011,"7.2-7.4":0.06068,"8.2":0.10114,"9.2":0.2933,"10.1":1.12262,"11.1":10.36656},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00557,"8":0.02227,"9":0.03898,"10":0.05011,"11":8.29654,_:"7 5.5"},N:{"10":0,"11":0.0325},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.108},O:{"0":0.1035},Q:{"1.2":0.027},S:{"2.5":0},H:{"0":0.12781},L:{"0":18.2279}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KW.js b/website/www/node_modules/caniuse-lite/data/regions/KW.js new file mode 100644 index 000000000000..e7fa2c2b33cf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00288,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00288,"35":0,"36":0.00288,"37":0,"38":0.01153,"39":0,"40":0,"41":0,"42":0,"43":0.00577,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.04901,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00288,"57":0.00288,"58":0.00577,"59":0,"60":0,"61":0,"62":0.00288,"63":0.00865,"64":0.00865,"65":0.00577,"66":0.00288,"67":0.00577,"68":0.00577,"69":0.01153,"70":0.00577,"71":0.01442,"72":0.00288,"73":0.00577,"74":0.0173,"75":0.01153,"76":0.0173,"77":0.02883,"78":0.02018,"79":0.05189,"80":3.34428,"81":1.71539,"83":0.00288,"84":0.00577,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00288,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00577,"49":0,"50":0,"51":0,"52":0.00865,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01153,"64":0,"65":0.00288,"66":0,"67":0.01153,"68":0.04613,"69":0.00288,"70":0.00288,"71":0.00288,"72":0.00577,"73":0.00288,"74":0.16721,"75":0.26524,"76":0.00577,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00288,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00288,"47":0.00577,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.15568,"68":0.00288,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00319,"3.2":0.00319,"4.0-4.1":0,"4.2-4.3":0.00639,"5.0-5.1":0.03195,"6.0-6.1":0.00958,"7.0-7.1":0.03195,"8.1-8.4":0.04473,"9.0-9.2":0.03834,"9.3":0.46008,"10.0-10.2":0.11821,"10.3":0.40576,"11.0-11.2":0.26199,"11.3-11.4":0.4441,"12.0-12.1":0.54954,"12.2-12.4":3.60074,"13.0-13.1":0.76679,"13.2":0.37381,"13.3":20.93347,"13.4":3.8787},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00288,"9":0,"10":0.00288,"11":0.01442,"12":0.04325,"13":0.58813,_:"0","3.1":0,"3.2":0,"5.1":0.00577,"6.1":0,"7.1":0,"9.1":0.00577,"10.1":0.03171,"11.1":0.05766,"12.1":0.10955,"13.1":0.40939},I:{"3":0.00045,"4":0.00402,_:"81","2.1":0,"2.2":0.00134,"2.3":0.00045,"4.1":0.00893,"4.2-4.3":0.01874,"4.4":0,"4.4.3-4.4.4":0.12897},B:{"12":0.00288,"13":0.00288,"14":0.00288,"15":0.00288,"16":0.00577,"17":0.02018,"18":0.38632,_:"79 80 81"},P:{"4":0.44289,"5.0-5.4":0.0206,"6.2-6.4":0.0412,"7.2-7.4":0.1648,"8.2":0.0927,"9.2":0.42229,"10.1":0.71068,"11.1":3.07963},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00329,"9":0.00329,"10":0,"11":0.15486,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13522},O:{"0":3.77201},Q:{"1.2":0.01423},S:{"2.5":0},H:{"0":0.91636},L:{"0":46.69305}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KY.js b/website/www/node_modules/caniuse-lite/data/regions/KY.js new file mode 100644 index 000000000000..6a1b68369f8f --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01573,"39":0,"40":0,"41":0.02097,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.04194,"50":0,"51":0,"52":0,"53":0.00524,"54":0,"55":0,"56":0,"57":0,"58":0.01049,"59":0,"60":0,"61":0,"62":0,"63":0.00524,"64":0,"65":0.00524,"66":0,"67":0.01049,"68":0.00524,"69":0,"70":0.00524,"71":0.00524,"72":0,"73":0.02622,"74":0.01573,"75":0.02097,"76":0.02097,"77":0.00524,"78":0.01573,"79":0.15729,"80":11.28818,"81":3.75399,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00524,"22":0,"23":0.00524,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01049,"53":0,"54":0,"55":0.01573,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.04719,"69":0,"70":0.00524,"71":0,"72":0.02097,"73":0.00524,"74":0.48236,"75":0.51381,"76":0.01049,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.09437,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00339,"3.2":0.00339,"4.0-4.1":0,"4.2-4.3":0.00678,"5.0-5.1":0.03388,"6.0-6.1":0.01016,"7.0-7.1":0.03388,"8.1-8.4":0.04744,"9.0-9.2":0.04066,"9.3":0.48791,"10.0-10.2":0.12537,"10.3":0.43031,"11.0-11.2":0.27784,"11.3-11.4":0.47097,"12.0-12.1":0.58279,"12.2-12.4":3.8186,"13.0-13.1":0.81319,"13.2":0.39643,"13.3":22.20008,"13.4":4.11338},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00524,"12":0.02097,"13":2.23352,_:"0","3.1":0,"3.2":0,"5.1":0.00524,"6.1":0,"7.1":0,"9.1":0.01049,"10.1":0.14156,"11.1":0.06816,"12.1":0.21496,"13.1":1.85602},I:{"3":0.0013,"4":0.01171,_:"81","2.1":0,"2.2":0.0039,"2.3":0.0013,"4.1":0.02603,"4.2-4.3":0.05465,"4.4":0,"4.4.3-4.4.4":0.37607},B:{"12":0.00524,"13":0,"14":0.27788,"15":0,"16":0.02097,"17":0.13632,"18":3.06716,_:"79 80 81"},P:{"4":0.02124,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02124,"8.2":0.01062,"9.2":0.11684,"10.1":0.31865,"11.1":5.39581},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00524,"11":0.73402,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.14271},R:{_:"0"},M:{"0":0.31872},O:{"0":0.91334},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.04954},L:{"0":28.69519}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/KZ.js b/website/www/node_modules/caniuse-lite/data/regions/KZ.js new file mode 100644 index 000000000000..83d18204da25 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/KZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00607,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01213,"37":0,"38":0,"39":0,"40":0.00607,"41":0,"42":0,"43":0,"44":0,"45":0.00607,"46":0,"47":0,"48":0.00607,"49":0.13345,"50":0,"51":0.00607,"52":0,"53":0.01213,"54":0,"55":0.01213,"56":0.01213,"57":0.01213,"58":0.00607,"59":0.0182,"60":0.01213,"61":0.14558,"62":0.00607,"63":0.01213,"64":0.02426,"65":0.0182,"66":0.03033,"67":0.02426,"68":0.02426,"69":0.03033,"70":0.14558,"71":0.12132,"72":0.13345,"73":0.11525,"74":0.08492,"75":0.06066,"76":0.06673,"77":0.10312,"78":0.15772,"79":0.21838,"80":14.49167,"81":7.50971,"83":0.03033,"84":0.0182,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.0182,"44":0,"45":0,"46":0,"47":0.00607,"48":0.00607,"49":0,"50":0.00607,"51":0.00607,"52":0.10312,"53":0,"54":0,"55":0.0182,"56":0.01213,"57":0.01213,"58":0,"59":0,"60":0.00607,"61":0.0182,"62":0.00607,"63":0.0364,"64":0.00607,"65":0.00607,"66":0.01213,"67":0.00607,"68":0.08492,"69":0.0182,"70":0.00607,"71":0.01213,"72":0.02426,"73":0.0182,"74":0.56414,"75":0.95236,"76":0.01213,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.03033,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00607,"57":0.00607,"58":0,"60":0,"62":0,"63":0.00607,"64":0,"65":0.0182,"66":0.01213,"67":2.82676,"68":0.06673,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00607},G:{"8":0.0012,"3.2":0.0012,"4.0-4.1":0,"4.2-4.3":0.0024,"5.0-5.1":0.012,"6.0-6.1":0.0036,"7.0-7.1":0.012,"8.1-8.4":0.0168,"9.0-9.2":0.0144,"9.3":0.17281,"10.0-10.2":0.0444,"10.3":0.15241,"11.0-11.2":0.09841,"11.3-11.4":0.16681,"12.0-12.1":0.20642,"12.2-12.4":1.35251,"13.0-13.1":0.28802,"13.2":0.14041,"13.3":7.86306,"13.4":1.45692},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00607,"12":0.05459,"13":0.73399,_:"0","3.1":0,"3.2":0,"5.1":0.06066,"6.1":0,"7.1":0,"9.1":0.00607,"10.1":0.0182,"11.1":0.05459,"12.1":0.13952,"13.1":0.53381},I:{"3":0.00066,"4":0.0059,_:"81","2.1":0,"2.2":0.00197,"2.3":0.00066,"4.1":0.01311,"4.2-4.3":0.02754,"4.4":0,"4.4.3-4.4.4":0.1895},B:{"12":0,"13":0.00607,"14":0.00607,"15":0.00607,"16":0.01213,"17":0.07279,"18":0.6066,_:"79 80 81"},P:{"4":0.22365,"5.0-5.4":0.02033,"6.2-6.4":0.05083,"7.2-7.4":0.11183,"8.2":0.04066,"9.2":0.35581,"10.1":0.40664,"11.1":1.99253},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01021,"7":0,"8":0.03063,"9":0.03063,"10":0.02042,"11":0.32668,"5.5":0},N:{"10":0,"11":0.0118},J:{"7":0,"10":0.01967},R:{_:"0"},M:{"0":0.07868},O:{"0":0.64518},Q:{"1.2":0.02754},S:{"2.5":0},H:{"0":0.26444},L:{"0":43.15445}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LA.js b/website/www/node_modules/caniuse-lite/data/regions/LA.js new file mode 100644 index 000000000000..48954928f5b5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00393,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00393,"22":0,"23":0,"24":0,"25":0.00393,"26":0.00393,"27":0,"28":0,"29":0,"30":0,"31":0.00393,"32":0,"33":0.00785,"34":0.00785,"35":0,"36":0.01178,"37":0.00393,"38":0.00393,"39":0.00393,"40":0.00785,"41":0.0314,"42":0.00393,"43":0.07065,"44":0.00393,"45":0.00393,"46":0.01178,"47":0.0157,"48":0.00785,"49":0.14915,"50":0.00393,"51":0.00785,"52":0.00785,"53":0.01178,"54":0.00393,"55":0.01178,"56":0.01178,"57":0.01178,"58":0.01178,"59":0.00785,"60":0.01963,"61":0.0157,"62":0.02355,"63":0.05495,"64":0.02355,"65":0.01178,"66":0.01963,"67":0.01963,"68":0.02355,"69":0.0314,"70":0.0314,"71":0.20018,"72":0.09028,"73":0.55343,"74":0.06673,"75":0.03533,"76":0.02748,"77":0.04318,"78":0.05103,"79":0.10598,"80":5.42828,"81":2.91628,"83":0.00785,"84":0.00393,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00393,"31":0.00785,"32":0.00393,"33":0.00785,"34":0.00785,"35":0.00393,"36":0.00785,"37":0.00393,"38":0.01178,"39":0.00785,"40":0.00785,"41":0.00785,"42":0.01178,"43":0.0157,"44":0.00785,"45":0.01178,"46":0.00393,"47":0.01178,"48":0.02355,"49":0.00393,"50":0.00785,"51":0.00785,"52":0.01963,"53":0.00785,"54":0.01178,"55":0.00393,"56":0.0157,"57":0.0157,"58":0.0157,"59":0.00785,"60":0.01178,"61":0.00785,"62":0.00785,"63":0.00785,"64":0.00393,"65":0.08635,"66":0.00785,"67":0.00393,"68":0.32185,"69":0.00393,"70":0.00393,"71":0.00393,"72":0.02355,"73":0.01178,"74":0.47885,"75":0.7222,"76":0.05888,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0.00393,"12":0,"15":0.00393,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00393,"33":0,"34":0.00393,"35":0,"36":0,"37":0.01963,"38":0,"39":0,"40":0.00393,"41":0,"42":0.00393,"43":0.00393,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00393,"66":0,"67":0.22765,"68":0.0157,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00785},G:{"8":0.00179,"3.2":0.00179,"4.0-4.1":0,"4.2-4.3":0.00357,"5.0-5.1":0.01786,"6.0-6.1":0.00536,"7.0-7.1":0.01786,"8.1-8.4":0.02501,"9.0-9.2":0.02144,"9.3":0.25723,"10.0-10.2":0.06609,"10.3":0.22687,"11.0-11.2":0.14648,"11.3-11.4":0.2483,"12.0-12.1":0.30725,"12.2-12.4":2.01321,"13.0-13.1":0.42872,"13.2":0.209,"13.3":11.70412,"13.4":2.16862},E:{"4":0.00393,"5":0.00785,"6":0.00393,"7":0.00393,"8":0.00785,"9":0.00393,"10":0.00393,"11":0.03925,"12":0.0314,"13":0.28653,_:"0","3.1":0.00393,"3.2":0,"5.1":0.00393,"6.1":0.00785,"7.1":0.00393,"9.1":0.0157,"10.1":0.02748,"11.1":0.0471,"12.1":0.05888,"13.1":0.2198},I:{"3":0.00259,"4":0.0233,_:"81","2.1":0,"2.2":0.00777,"2.3":0.00259,"4.1":0.05177,"4.2-4.3":0.10871,"4.4":0,"4.4.3-4.4.4":0.74805},B:{"12":0.01178,"13":0.0157,"14":0.01963,"15":0.02355,"16":0.01178,"17":0.01963,"18":0.36895,_:"79 80 81"},P:{"4":1.84458,"5.0-5.4":0.04122,"6.2-6.4":0.13396,"7.2-7.4":0.49464,"8.2":0.08244,"9.2":0.66982,"10.1":0.8347,"11.1":2.27739},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01178,"7":0.00589,"8":0.13541,"9":0.04121,"10":0.02355,"11":0.24139,"5.5":0},N:{"10":0.11087,"11":0.33261},J:{"7":0,"10":0.04253},R:{_:"0"},M:{"0":0.10328},O:{"0":0.93555},Q:{"1.2":0.25515},S:{"2.5":0},H:{"0":0.6039},L:{"0":53.65633}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LB.js b/website/www/node_modules/caniuse-lite/data/regions/LB.js new file mode 100644 index 000000000000..5d0ca1eee571 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LB.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00981,"37":0,"38":0.00981,"39":0,"40":0.00491,"41":0,"42":0,"43":0.00491,"44":0,"45":0,"46":0.00491,"47":0,"48":0.00491,"49":0.10301,"50":0,"51":0,"52":0,"53":0.00491,"54":0,"55":0.00491,"56":0,"57":0.00491,"58":0.01962,"59":0.00981,"60":0,"61":0.00491,"62":0.00491,"63":0.01962,"64":0.00491,"65":0.01962,"66":0.01472,"67":0.02943,"68":0.00981,"69":0.02453,"70":0.02943,"71":0.03434,"72":0.03434,"73":0.04905,"74":0.04905,"75":0.02453,"76":0.03434,"77":0.02943,"78":0.05886,"79":0.1962,"80":10.87929,"81":5.17478,"83":0.02943,"84":0.00491,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01962,"49":0,"50":0,"51":0,"52":0.01472,"53":0,"54":0,"55":0,"56":0.01472,"57":0.00491,"58":0,"59":0,"60":0.00981,"61":0.00491,"62":0,"63":0.00491,"64":0.00491,"65":0.00491,"66":0.00491,"67":0.03434,"68":0.13734,"69":0.00491,"70":0.00491,"71":0.01472,"72":0.02943,"73":0.01962,"74":0.67199,"75":0.94667,"76":0.02453,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.01962,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00491,"64":0,"65":0,"66":0,"67":0.32373,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00159,"3.2":0.00159,"4.0-4.1":0,"4.2-4.3":0.00318,"5.0-5.1":0.01588,"6.0-6.1":0.00476,"7.0-7.1":0.01588,"8.1-8.4":0.02223,"9.0-9.2":0.01905,"9.3":0.22861,"10.0-10.2":0.05874,"10.3":0.20162,"11.0-11.2":0.13018,"11.3-11.4":0.22067,"12.0-12.1":0.27306,"12.2-12.4":1.78919,"13.0-13.1":0.38102,"13.2":0.18575,"13.3":10.40178,"13.4":1.92731},E:{"4":0,"5":0,"6":0,"7":0,"8":0.03924,"9":0.00981,"10":0.05886,"11":0.08339,"12":0.11772,"13":0.84857,_:"0","3.1":0,"3.2":0,"5.1":0.38259,"6.1":0,"7.1":0,"9.1":0.02943,"10.1":0.13244,"11.1":0.22563,"12.1":0.40712,"13.1":0.67689},I:{"3":0.00103,"4":0.00928,_:"81","2.1":0,"2.2":0.00309,"2.3":0.00103,"4.1":0.02062,"4.2-4.3":0.04329,"4.4":0,"4.4.3-4.4.4":0.2979},B:{"12":0.00491,"13":0.00491,"14":0.00491,"15":0.02453,"16":0.02943,"17":0.10301,"18":0.7799,_:"79 80 81"},P:{"4":0.25475,"5.0-5.4":0.02038,"6.2-6.4":0.05095,"7.2-7.4":0.21399,"8.2":0.07133,"9.2":0.4076,"10.1":0.63178,"11.1":5.77773},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0199,"9":0.00995,"10":0.00995,"11":0.30354,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.0051},R:{_:"0"},M:{"0":0.13757},O:{"0":0.47384},Q:{"1.2":0.0051},S:{"2.5":0},H:{"0":0.19777},L:{"0":47.70906}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LC.js b/website/www/node_modules/caniuse-lite/data/regions/LC.js new file mode 100644 index 000000000000..145adefdbdff --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01255,"37":0,"38":0.00836,"39":0,"40":0,"41":0,"42":0.00418,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.046,"50":0,"51":0,"52":0,"53":0.00418,"54":0,"55":0,"56":0,"57":0,"58":0.01673,"59":0,"60":0,"61":0,"62":0,"63":0.01255,"64":0,"65":0.00836,"66":0.00418,"67":0.00418,"68":0.00418,"69":0.01673,"70":0.02091,"71":0.00836,"72":0.01255,"73":0.05437,"74":0.00418,"75":0.01673,"76":0.05018,"77":0.03346,"78":0.02509,"79":0.05855,"80":6.90866,"81":3.85999,"83":0.00418,"84":0.00836,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00418,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.02509,"68":0.11291,"69":0,"70":0,"71":0.00418,"72":0.00836,"73":0.00418,"74":0.23419,"75":0.4182,"76":0.00418,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00836,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.05018,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00418,"64":0,"65":0,"66":0,"67":0.25928,"68":0.02509,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00115,"3.2":0.00115,"4.0-4.1":0,"4.2-4.3":0.00231,"5.0-5.1":0.01153,"6.0-6.1":0.00346,"7.0-7.1":0.01153,"8.1-8.4":0.01614,"9.0-9.2":0.01383,"9.3":0.16597,"10.0-10.2":0.04265,"10.3":0.14638,"11.0-11.2":0.09451,"11.3-11.4":0.16021,"12.0-12.1":0.19825,"12.2-12.4":1.29898,"13.0-13.1":0.27662,"13.2":0.13485,"13.3":7.55186,"13.4":1.39926},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00418,"9":0,"10":0,"11":0.00418,"12":0.00836,"13":0.63566,_:"0","3.1":0,"3.2":0,"5.1":0.05018,"6.1":0,"7.1":0,"9.1":0.00418,"10.1":0.00836,"11.1":0.046,"12.1":0.14637,"13.1":0.34711},I:{"3":0.00459,"4":0.04132,_:"81","2.1":0,"2.2":0.01377,"2.3":0.00459,"4.1":0.09183,"4.2-4.3":0.19284,"4.4":0,"4.4.3-4.4.4":1.32692},B:{"12":0.00836,"13":0.00836,"14":0,"15":0.02509,"16":0.02091,"17":0.06691,"18":1.23369,_:"79 80 81"},P:{"4":0.16013,"5.0-5.4":0.01068,"6.2-6.4":0.01068,"7.2-7.4":0.25622,"8.2":0.02135,"9.2":0.27757,"10.1":0.4377,"11.1":4.38769},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00433,"11":0.11695,"5.5":0},N:{"10":0,"11":0.02327},J:{"7":0,"10":0.00582},R:{_:"0"},M:{"0":0.26181},O:{"0":0.19199},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.12669},L:{"0":62.79164}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LI.js b/website/www/node_modules/caniuse-lite/data/regions/LI.js new file mode 100644 index 000000000000..ba0d62a45936 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.06454,"50":0.00645,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00645,"60":0.00645,"61":0,"62":0,"63":0,"64":0,"65":0.00645,"66":0.00645,"67":0.10326,"68":0.18071,"69":0,"70":0.02582,"71":0.36788,"72":0.54859,"73":0.06454,"74":0,"75":0.03227,"76":0.05163,"77":0.02582,"78":0.18071,"79":0.12263,"80":11.4623,"81":4.6727,"83":0,"84":0.01291,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01291,"49":0.00645,"50":0,"51":0,"52":0.05163,"53":0,"54":0,"55":0.00645,"56":0,"57":0,"58":0,"59":0,"60":0.02582,"61":0.01291,"62":0,"63":0.07099,"64":0.03872,"65":0.02582,"66":0.37433,"67":0.00645,"68":0.21298,"69":0,"70":0.05163,"71":0.04518,"72":0.03872,"73":0.09036,"74":1.74258,"75":2.65905,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00645,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.37433,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00302,"3.2":0.00302,"4.0-4.1":0,"4.2-4.3":0.00605,"5.0-5.1":0.03024,"6.0-6.1":0.00907,"7.0-7.1":0.03024,"8.1-8.4":0.04234,"9.0-9.2":0.03629,"9.3":0.43551,"10.0-10.2":0.1119,"10.3":0.3841,"11.0-11.2":0.248,"11.3-11.4":0.42039,"12.0-12.1":0.5202,"12.2-12.4":3.40849,"13.0-13.1":0.72585,"13.2":0.35385,"13.3":19.81582,"13.4":3.67161},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.05163,"12":0.0839,"13":3.1431,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.1549,"10.1":0.03872,"11.1":0.41951,"12.1":0.26461,"13.1":2.82685},I:{"3":0.00062,"4":0.00555,_:"81","2.1":0,"2.2":0.00185,"2.3":0.00062,"4.1":0.01232,"4.2-4.3":0.02588,"4.4":0,"4.4.3-4.4.4":0.17807},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00645,"17":0.05809,"18":4.45971,_:"79 80 81"},P:{"4":0.17966,"5.0-5.4":0.04227,"6.2-6.4":0,"7.2-7.4":0.01057,"8.2":0.03171,"9.2":0.01057,"10.1":0.02114,"11.1":2.93803},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00645,"7":0,"8":0.07745,"9":0.01936,"10":0.00645,"11":3.30445,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.21631},O:{"0":0.03546},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.05371},L:{"0":23.90549}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LK.js b/website/www/node_modules/caniuse-lite/data/regions/LK.js new file mode 100644 index 000000000000..390ccbc3330a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00335,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00335,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00335,"31":0.00335,"32":0,"33":0.00335,"34":0,"35":0.00335,"36":0.00335,"37":0,"38":0,"39":0,"40":0.01341,"41":0,"42":0.00335,"43":0.00335,"44":0,"45":0.00335,"46":0,"47":0,"48":0,"49":0.03018,"50":0.00335,"51":0.00335,"52":0,"53":0.00335,"54":0,"55":0.00335,"56":0.00335,"57":0,"58":0.01006,"59":0.00335,"60":0.00335,"61":0.00335,"62":0.00335,"63":0.02682,"64":0.00671,"65":0.00671,"66":0.00335,"67":0.01006,"68":0.01341,"69":0.01341,"70":0.02012,"71":0.02012,"72":0.02682,"73":0.01341,"74":0.0503,"75":0.02012,"76":0.02682,"77":0.03688,"78":0.057,"79":0.07712,"80":5.18374,"81":2.71928,"83":0.00671,"84":0.00671,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00335,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00335,"44":0,"45":0,"46":0,"47":0.00671,"48":0.00335,"49":0,"50":0,"51":0,"52":0.01006,"53":0,"54":0,"55":0,"56":0.00335,"57":0,"58":0.00335,"59":0,"60":0.00335,"61":0,"62":0,"63":0.00335,"64":0.00671,"65":0.00335,"66":0.00335,"67":0.00335,"68":0.05365,"69":0.00671,"70":0.00671,"71":0.00671,"72":0.01341,"73":0.01006,"74":0.31183,"75":0.54989,"76":0.03018,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00335,"35":0,"36":0,"37":0.02682,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00335,"47":0.01006,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00671,"54":0,"55":0.00335,"56":0.00335,"57":0.00671,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00671,"66":0.01006,"67":0.42583,"68":0.01006,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00106,"3.2":0.00106,"4.0-4.1":0,"4.2-4.3":0.00212,"5.0-5.1":0.01062,"6.0-6.1":0.00319,"7.0-7.1":0.01062,"8.1-8.4":0.01486,"9.0-9.2":0.01274,"9.3":0.15289,"10.0-10.2":0.03928,"10.3":0.13484,"11.0-11.2":0.08706,"11.3-11.4":0.14758,"12.0-12.1":0.18262,"12.2-12.4":1.19659,"13.0-13.1":0.25482,"13.2":0.12422,"13.3":6.95659,"13.4":1.28896},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00335,"10":0.00335,"11":0.00335,"12":0.01006,"13":0.171,_:"0","3.1":0,"3.2":0,"5.1":0.03018,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00671,"11.1":0.01006,"12.1":0.04359,"13.1":0.114},I:{"3":0.00122,"4":0.01101,_:"81","2.1":0,"2.2":0.00367,"2.3":0.00122,"4.1":0.02447,"4.2-4.3":0.05139,"4.4":0,"4.4.3-4.4.4":0.3536},B:{"12":0.01341,"13":0.01006,"14":0.01341,"15":0.01341,"16":0.01006,"17":0.02347,"18":0.25818,_:"79 80 81"},P:{"4":1.58406,"5.0-5.4":0.07108,"6.2-6.4":0.132,"7.2-7.4":0.4874,"8.2":0.18278,"9.2":0.72095,"10.1":0.8428,"11.1":2.041},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01829,"9":0.00457,"10":0.00457,"11":0.07316,"5.5":0},N:{"10":0,"11":0.15953},J:{"7":0,"10":0.00665},R:{_:"0"},M:{"0":0.13294},O:{"0":2.95792},Q:{"1.2":0.00665},S:{"2.5":0},H:{"0":2.19624},L:{"0":62.21892}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LR.js b/website/www/node_modules/caniuse-lite/data/regions/LR.js new file mode 100644 index 000000000000..6e3a0ebb277c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00264,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00264,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00264,"38":0,"39":0,"40":0.00527,"41":0,"42":0,"43":0.00791,"44":0,"45":0,"46":0.00264,"47":0.00264,"48":0.00264,"49":0.01318,"50":0.00264,"51":0.00264,"52":0.00264,"53":0,"54":0.00527,"55":0.00527,"56":0.00264,"57":0,"58":0.00264,"59":0,"60":0.00791,"61":0.00264,"62":0,"63":0.02108,"64":0.03426,"65":0.01054,"66":0.00264,"67":0.00264,"68":0.00264,"69":0.01054,"70":0.01318,"71":0.01845,"72":0.00791,"73":0.00791,"74":0.05007,"75":0.01581,"76":0.01845,"77":0.03162,"78":0.08696,"79":0.22661,"80":1.92355,"81":0.7905,"83":0.02108,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00527,"22":0.00264,"23":0.00264,"24":0.00527,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00264,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00264,"43":0.00264,"44":0.00264,"45":0,"46":0,"47":0.01318,"48":0.00264,"49":0.00264,"50":0,"51":0,"52":0.01581,"53":0,"54":0,"55":0.01318,"56":0.01581,"57":0.00264,"58":0.00264,"59":0.00264,"60":0.00264,"61":0,"62":0,"63":0.00791,"64":0,"65":0,"66":0,"67":0.00264,"68":0.02899,"69":0.00264,"70":0.00264,"71":0,"72":0.01318,"73":0.00527,"74":0.26614,"75":0.48748,"76":0.01054,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00264,"17":0,"18":0,"19":0,"20":0.01054,"21":0.00264,"22":0,"23":0.01054,"24":0,"25":0,"26":0,"27":0.01054,"28":0,"29":0.00264,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00264,"36":0,"37":0.00264,"38":0.00264,"39":0,"40":0,"41":0,"42":0.00527,"43":0,"44":0,"45":0.00264,"46":0.00791,"47":0.00527,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.01318,"54":0.00264,"55":0,"56":0,"57":0.00264,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.01054,"66":0.02372,"67":0.15283,"68":0.00264,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0527},G:{"8":0.00067,"3.2":0.00067,"4.0-4.1":0,"4.2-4.3":0.00133,"5.0-5.1":0.00666,"6.0-6.1":0.002,"7.0-7.1":0.00666,"8.1-8.4":0.00932,"9.0-9.2":0.00799,"9.3":0.09584,"10.0-10.2":0.02463,"10.3":0.08452,"11.0-11.2":0.05457,"11.3-11.4":0.09251,"12.0-12.1":0.11447,"12.2-12.4":0.75007,"13.0-13.1":0.15973,"13.2":0.07787,"13.3":4.36066,"13.4":0.80797},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00264,"13":0.09223,_:"0","3.1":0,"3.2":0,"5.1":0.01054,"6.1":0,"7.1":0,"9.1":0.00264,"10.1":0.00527,"11.1":0.03162,"12.1":0.00791,"13.1":0.07642},I:{"3":0.00165,"4":0.01482,_:"81","2.1":0,"2.2":0.00494,"2.3":0.00165,"4.1":0.03294,"4.2-4.3":0.06917,"4.4":0,"4.4.3-4.4.4":0.47598},B:{"12":0.03162,"13":0.02899,"14":0.02372,"15":0.01845,"16":0.01318,"17":0.03426,"18":0.34519,_:"79 80 81"},P:{"4":0.37662,"5.0-5.4":0.08143,"6.2-6.4":0.03054,"7.2-7.4":0.14251,"8.2":0.03054,"9.2":0.34609,"10.1":0.34609,"11.1":0.80414},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00823,"9":0,"10":0.0192,"11":0.10696,"5.5":0},N:{"10":0,"11":0.07365},J:{"7":0,"10":0.01473},R:{_:"0"},M:{"0":0.11784},O:{"0":5.22915},Q:{"1.2":0.01473},S:{"2.5":0.1694},H:{"0":4.67869},L:{"0":71.15994}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LS.js b/website/www/node_modules/caniuse-lite/data/regions/LS.js new file mode 100644 index 000000000000..0ae115d44837 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00244,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00487,"32":0,"33":0,"34":0.00244,"35":0,"36":0.00244,"37":0,"38":0.00244,"39":0,"40":0.03898,"41":0.00244,"42":0,"43":0.02192,"44":0,"45":0,"46":0.0341,"47":0,"48":0.00487,"49":0.00731,"50":0.00244,"51":0.00244,"52":0,"53":0,"54":0,"55":0.10231,"56":0.00487,"57":0.00244,"58":0.00487,"59":0.01949,"60":0.00244,"61":0,"62":0.00244,"63":0.01705,"64":0,"65":0.00731,"66":0.00974,"67":0.00244,"68":0.00487,"69":0.00974,"70":0.0268,"71":0.01218,"72":0.00244,"73":0.00244,"74":0.01705,"75":0.0268,"76":0.01949,"77":0.01949,"78":0.04141,"79":0.0341,"80":1.46891,"81":0.62118,"83":0.00731,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00244,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00244,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00244,"44":0,"45":0,"46":0,"47":0.00244,"48":0,"49":0,"50":0,"51":0.00244,"52":0.00731,"53":0,"54":0,"55":0.00487,"56":0.00244,"57":0,"58":0.00244,"59":0,"60":0.00244,"61":0.00244,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03654,"69":0.00244,"70":0,"71":0.00244,"72":0.00731,"73":0.01462,"74":0.11449,"75":0.20462,"76":0.01218,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00244,"18":0.00244,"19":0.00487,"20":0,"21":0.00487,"22":0.00244,"23":0,"24":0,"25":0.00244,"26":0.00974,"27":0,"28":0.00244,"29":0,"30":0.00244,"31":0,"32":0,"33":0.00244,"34":0,"35":0.01949,"36":0,"37":0.00487,"38":0,"39":0,"40":0.00487,"41":0,"42":0.00731,"43":0,"44":0,"45":0.01949,"46":0.01949,"47":0.03167,"48":0,"49":0.00244,"50":0,"51":0,"52":0,"53":0.00244,"54":0,"55":0,"56":0.00487,"57":0.00244,"58":0.00244,"60":0,"62":0,"63":0.00487,"64":0,"65":0.00731,"66":0.01462,"67":0.2436,"68":0.00244,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.07064},G:{"8":0.00036,"3.2":0.00036,"4.0-4.1":0,"4.2-4.3":0.00071,"5.0-5.1":0.00356,"6.0-6.1":0.00107,"7.0-7.1":0.00356,"8.1-8.4":0.00498,"9.0-9.2":0.00427,"9.3":0.05122,"10.0-10.2":0.01316,"10.3":0.04517,"11.0-11.2":0.02917,"11.3-11.4":0.04944,"12.0-12.1":0.06118,"12.2-12.4":0.40085,"13.0-13.1":0.08536,"13.2":0.04161,"13.3":2.3304,"13.4":0.43179},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00731,"12":0.01218,"13":0.10231,_:"0","3.1":0,"3.2":0,"5.1":0.19244,"6.1":0.00487,"7.1":0,"9.1":0,"10.1":0.00244,"11.1":0.00244,"12.1":0.01462,"13.1":0.0341},I:{"3":0.00126,"4":0.01138,_:"81","2.1":0,"2.2":0.00379,"2.3":0.00126,"4.1":0.02528,"4.2-4.3":0.05309,"4.4":0,"4.4.3-4.4.4":0.36534},B:{"12":0.02192,"13":0.0341,"14":0.01218,"15":0.02192,"16":0.02192,"17":0.03167,"18":0.41899,_:"79 80 81"},P:{"4":1.13502,"5.0-5.4":0.02027,"6.2-6.4":0.07094,"7.2-7.4":0.70939,"8.2":0.11148,"9.2":0.4155,"10.1":0.831,"11.1":1.41878},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00754,"9":0.00251,"10":0.00754,"11":0.14319,"5.5":0},N:{"10":0.01059,"11":0.04236},J:{"7":0,"10":0.14372},R:{_:"0"},M:{"0":0.15884},O:{"0":3.45675},Q:{"1.2":0.06808},S:{"2.5":0},H:{"0":8.50739},L:{"0":69.38846}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LT.js b/website/www/node_modules/caniuse-lite/data/regions/LT.js new file mode 100644 index 000000000000..6131ba0701b1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.01934,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00645,"37":0,"38":0,"39":0,"40":0,"41":0.00645,"42":0,"43":0.00645,"44":0,"45":0,"46":0.00645,"47":0,"48":0.02579,"49":0.46426,"50":0,"51":0.00645,"52":0.00645,"53":0.0129,"54":0.00645,"55":0.00645,"56":0.00645,"57":0.00645,"58":0.01934,"59":0.00645,"60":0.0129,"61":0.10317,"62":0.00645,"63":0.02579,"64":0.05803,"65":0.0129,"66":0.0129,"67":0.02579,"68":0.0129,"69":0.03869,"70":0.10962,"71":0.06448,"72":0.04514,"73":0.06448,"74":0.04514,"75":0.06448,"76":0.06448,"77":0.06448,"78":0.12251,"79":0.23858,"80":17.4225,"81":8.25344,"83":0.0129,"84":0.00645,_:"85"},C:{"2":0,"3":0.00645,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00645,"13":0,"14":0,"15":0,"16":0.00645,"17":0,"18":0,"19":0.00645,"20":0,"21":0.00645,"22":0.00645,"23":0.00645,"24":0,"25":0.00645,"26":0.00645,"27":0.00645,"28":0.00645,"29":0.00645,"30":0.00645,"31":0.0129,"32":0.00645,"33":0,"34":0.00645,"35":0,"36":0,"37":0,"38":0.00645,"39":0,"40":0,"41":0.00645,"42":0,"43":0.00645,"44":0,"45":0.00645,"46":0,"47":0.00645,"48":0.02579,"49":0.00645,"50":0.01934,"51":0.0129,"52":0.13541,"53":0.00645,"54":0,"55":0.00645,"56":0.02579,"57":0.00645,"58":0,"59":0,"60":0.01934,"61":0.00645,"62":0.00645,"63":0.00645,"64":0.00645,"65":0.01934,"66":0.0129,"67":0.0129,"68":0.21278,"69":0.0129,"70":0.02579,"71":0.0129,"72":0.05158,"73":0.03869,"74":1.73451,"75":3.19176,"76":0.02579,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0129,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00645,"46":0,"47":0.00645,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00645,"58":0.00645,"60":0,"62":0,"63":0,"64":0,"65":0.00645,"66":0.0129,"67":1.81834,"68":0.02579,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00645},G:{"8":0.00126,"3.2":0.00126,"4.0-4.1":0,"4.2-4.3":0.00252,"5.0-5.1":0.01261,"6.0-6.1":0.00378,"7.0-7.1":0.01261,"8.1-8.4":0.01766,"9.0-9.2":0.01513,"9.3":0.18159,"10.0-10.2":0.04666,"10.3":0.16016,"11.0-11.2":0.10341,"11.3-11.4":0.17529,"12.0-12.1":0.2169,"12.2-12.4":1.42123,"13.0-13.1":0.30266,"13.2":0.14755,"13.3":8.26256,"13.4":1.53094},E:{"4":0.0129,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00645,"11":0.0129,"12":0.09672,"13":1.07037,_:"0","3.1":0,"3.2":0,"5.1":0.00645,"6.1":0,"7.1":0,"9.1":0.00645,"10.1":0.03224,"11.1":0.09027,"12.1":0.24502,"13.1":0.806},I:{"3":0.00107,"4":0.00963,_:"81","2.1":0,"2.2":0.00321,"2.3":0.00107,"4.1":0.02139,"4.2-4.3":0.04492,"4.4":0,"4.4.3-4.4.4":0.3091},B:{"12":0,"13":0.0129,"14":0.0129,"15":0.02579,"16":0.01934,"17":0.05803,"18":1.79899,_:"79 80 81"},P:{"4":0.10179,"5.0-5.4":0.04072,"6.2-6.4":0.01018,"7.2-7.4":0.06108,"8.2":0.03054,"9.2":0.15269,"10.1":0.31556,"11.1":3.15558},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00724,"7":0.00724,"8":0.20278,"9":0.06518,"10":0.09415,"11":1.09356,"5.5":0},N:{"10":0,"11":0.03552},J:{"7":0,"10":0.0071},R:{_:"0"},M:{"0":0.20246},O:{"0":0.14918},Q:{"1.2":0.00355},S:{"2.5":0},H:{"0":0.2354},L:{"0":38.14453}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LU.js b/website/www/node_modules/caniuse-lite/data/regions/LU.js new file mode 100644 index 000000000000..e6bc8323f51e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0096,"39":0,"40":0.1296,"41":0.0048,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.3504,"50":0,"51":0,"52":0,"53":0.0096,"54":0,"55":0.0096,"56":0,"57":0.0048,"58":0,"59":0.0192,"60":0,"61":0,"62":0.0048,"63":0.0096,"64":0,"65":0.0288,"66":0.0048,"67":0.0096,"68":0.0048,"69":0.0624,"70":0.0432,"71":0.0192,"72":0.048,"73":0.36,"74":0.0288,"75":0.0192,"76":0.0576,"77":0.0576,"78":0.1008,"79":0.096,"80":5.7552,"81":3.0096,"83":0.0096,"84":0.0144,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.0096,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0048,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0096,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0144,"46":0,"47":0.0048,"48":0.0192,"49":0,"50":0.0336,"51":0.0048,"52":0.0576,"53":0,"54":0,"55":0.0048,"56":0.0096,"57":0.0192,"58":0.1632,"59":0,"60":0.0384,"61":0,"62":0,"63":0.0048,"64":0.0048,"65":0.2256,"66":0.0048,"67":0.024,"68":0.528,"69":0.0096,"70":0.0096,"71":0.0048,"72":0.0432,"73":0.0384,"74":0.9264,"75":1.5984,"76":0.0048,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0096,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0048,"47":0.0096,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.0096,"54":0.0048,"55":0.0048,"56":0.0048,"57":0.0048,"58":0,"60":0,"62":0,"63":0.0096,"64":0,"65":0,"66":0.0096,"67":0.3648,"68":0.0048,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00253,"3.2":0.00253,"4.0-4.1":0,"4.2-4.3":0.00507,"5.0-5.1":0.02534,"6.0-6.1":0.0076,"7.0-7.1":0.02534,"8.1-8.4":0.03548,"9.0-9.2":0.03041,"9.3":0.36491,"10.0-10.2":0.09376,"10.3":0.32183,"11.0-11.2":0.2078,"11.3-11.4":0.35224,"12.0-12.1":0.43587,"12.2-12.4":2.85594,"13.0-13.1":0.60819,"13.2":0.29649,"13.3":16.60346,"13.4":3.07641},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0048,"9":0,"10":0.0048,"11":0.0096,"12":0.0576,"13":1.8192,_:"0","3.1":0,"3.2":0,"5.1":0.0048,"6.1":0,"7.1":0,"9.1":0.144,"10.1":0.0816,"11.1":0.2064,"12.1":0.2448,"13.1":1.776},I:{"3":0.00097,"4":0.00876,_:"81","2.1":0,"2.2":0.00292,"2.3":0.00097,"4.1":0.01946,"4.2-4.3":0.04087,"4.4":0,"4.4.3-4.4.4":0.28124},B:{"12":0,"13":0.0048,"14":0.0048,"15":0.0048,"16":0.0336,"17":0.0384,"18":1.2288,_:"79 80 81"},P:{"4":0.40404,"5.0-5.4":0.04144,"6.2-6.4":0.04144,"7.2-7.4":0.14504,"8.2":0.12432,"9.2":0.46621,"10.1":0.79773,"11.1":4.73458},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00523,"9":0.00523,"10":0,"11":0.68553,"5.5":0},N:{"10":0,"11":0.0052},J:{"7":0,"10":0.0052},R:{_:"0"},M:{"0":0.6656},O:{"0":0.9776},Q:{"1.2":0.0104},S:{"2.5":0},H:{"0":0.47261},L:{"0":38.6972}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LV.js b/website/www/node_modules/caniuse-lite/data/regions/LV.js new file mode 100644 index 000000000000..6b3ad029b01e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LV.js @@ -0,0 +1 @@ +module.exports={D:{"4":0.00673,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00673,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.10101,"32":0,"33":0,"34":0,"35":0,"36":0.00673,"37":0,"38":0.00673,"39":0,"40":0.10774,"41":0.00673,"42":0,"43":0,"44":0,"45":0.01347,"46":0.02694,"47":0,"48":0.01347,"49":0.51178,"50":0,"51":0,"52":0,"53":0.0202,"54":0,"55":0,"56":0.00673,"57":0.0202,"58":0.0202,"59":0.09428,"60":0.00673,"61":0.00673,"62":0.00673,"63":0.01347,"64":0.01347,"65":0.00673,"66":0.06061,"67":0.03367,"68":0.0202,"69":0.20875,"70":0.08081,"71":0.05387,"72":0.03367,"73":0.08081,"74":0.09428,"75":0.09428,"76":0.09428,"77":0.10774,"78":0.22222,"79":0.24242,"80":19.13803,"81":9.56901,"83":0.03367,"84":0.01347,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.02694,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01347,"38":0.01347,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00673,"46":0.00673,"47":0.00673,"48":0.00673,"49":0.00673,"50":0.01347,"51":0,"52":0.14141,"53":0.00673,"54":0.00673,"55":0,"56":0.0202,"57":0.01347,"58":0.14141,"59":0,"60":0.0404,"61":0.03367,"62":0,"63":0.06734,"64":0.00673,"65":0.0202,"66":0.0202,"67":0.0202,"68":0.18855,"69":0.02694,"70":0.01347,"71":0.01347,"72":0.08081,"73":0.04714,"74":1.79124,"75":3.0707,"76":0.03367,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00673,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.01347,"58":0.0202,"60":0,"62":0.00673,"63":0,"64":0,"65":0.00673,"66":0.01347,"67":1.60269,"68":0.05387,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00673},G:{"8":0.00138,"3.2":0.00138,"4.0-4.1":0,"4.2-4.3":0.00276,"5.0-5.1":0.01382,"6.0-6.1":0.00415,"7.0-7.1":0.01382,"8.1-8.4":0.01935,"9.0-9.2":0.01659,"9.3":0.19907,"10.0-10.2":0.05115,"10.3":0.17557,"11.0-11.2":0.11336,"11.3-11.4":0.19215,"12.0-12.1":0.23777,"12.2-12.4":1.55797,"13.0-13.1":0.33178,"13.2":0.16174,"13.3":9.05753,"13.4":1.67824},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00673,"9":0,"10":0,"11":0.01347,"12":0.08081,"13":1.25926,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.14815,"10.1":0.06061,"11.1":0.13468,"12.1":0.23569,"13.1":1.0303},I:{"3":0.00061,"4":0.0055,_:"81","2.1":0,"2.2":0.00183,"2.3":0.00061,"4.1":0.01221,"4.2-4.3":0.02564,"4.4":0,"4.4.3-4.4.4":0.17646},B:{"12":0,"13":0.00673,"14":0.00673,"15":0.01347,"16":0.02694,"17":0.06061,"18":1.19192,_:"79 80 81"},P:{"4":0.06133,"5.0-5.4":0.01022,"6.2-6.4":0.01022,"7.2-7.4":0.05111,"8.2":0.03066,"9.2":0.13288,"10.1":0.38841,"11.1":2.94371},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00692,"7":0,"8":0.03458,"9":0.00692,"10":0.01383,"11":0.44954,"5.5":0},N:{"10":0,"11":0.01306},J:{"7":0,"10":0.00327},R:{_:"0"},M:{"0":0.18616},O:{"0":0.10125},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.26592},L:{"0":34.167}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/LY.js b/website/www/node_modules/caniuse-lite/data/regions/LY.js new file mode 100644 index 000000000000..2939cf7d9db3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/LY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00243,"32":0.00243,"33":0.00486,"34":0,"35":0.00243,"36":0,"37":0,"38":0.00243,"39":0,"40":0.00972,"41":0,"42":0,"43":0.01945,"44":0,"45":0,"46":0,"47":0.00243,"48":0.00243,"49":0.06078,"50":0.00729,"51":0,"52":0,"53":0.00243,"54":0,"55":0.00243,"56":0.00243,"57":0,"58":0.00486,"59":0,"60":0.00729,"61":0,"62":0,"63":0.01945,"64":0.00243,"65":0.00243,"66":0.00243,"67":0.00243,"68":0.00243,"69":0.01945,"70":0.00729,"71":0.00729,"72":0.00729,"73":0.01216,"74":0.01459,"75":0.01459,"76":0.01459,"77":0.03403,"78":0.01945,"79":0.0389,"80":2.61819,"81":1.28114,"83":0.00243,"84":0.00243,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00243,"44":0,"45":0,"46":0,"47":0.00486,"48":0,"49":0,"50":0,"51":0,"52":0.00486,"53":0,"54":0,"55":0,"56":0.00243,"57":0.00243,"58":0,"59":0,"60":0.00243,"61":0,"62":0,"63":0,"64":0.00243,"65":0,"66":0,"67":0.00243,"68":0.03403,"69":0.00729,"70":0.00243,"71":0.00243,"72":0.01702,"73":0.00729,"74":0.19934,"75":0.29415,"76":0.00972,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00243,"15":0,"16":0,"17":0.00243,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00243,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00243,"46":0.00243,"47":0.01216,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00243,"54":0,"55":0.00243,"56":0.00729,"57":0.00486,"58":0,"60":0,"62":0,"63":0.00243,"64":0,"65":0.00243,"66":0.00486,"67":0.36708,"68":0.00243,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00243},G:{"8":0.00116,"3.2":0.00116,"4.0-4.1":0,"4.2-4.3":0.00232,"5.0-5.1":0.01161,"6.0-6.1":0.00348,"7.0-7.1":0.01161,"8.1-8.4":0.01626,"9.0-9.2":0.01394,"9.3":0.16723,"10.0-10.2":0.04297,"10.3":0.14748,"11.0-11.2":0.09523,"11.3-11.4":0.16142,"12.0-12.1":0.19974,"12.2-12.4":1.30878,"13.0-13.1":0.27871,"13.2":0.13587,"13.3":7.60878,"13.4":1.40981},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00486,"13":0.06321,_:"0","3.1":0,"3.2":0,"5.1":0.02917,"6.1":0,"7.1":0,"9.1":0.00243,"10.1":0.00486,"11.1":0.00486,"12.1":0.00729,"13.1":0.06564},I:{"3":0.00189,"4":0.01705,_:"81","2.1":0,"2.2":0.00568,"2.3":0.00189,"4.1":0.0379,"4.2-4.3":0.07958,"4.4":0,"4.4.3-4.4.4":0.5476},B:{"12":0.00243,"13":0.00243,"14":0.00243,"15":0.00729,"16":0.00486,"17":0.01216,"18":0.141,_:"79 80 81"},P:{"4":0.65316,"5.0-5.4":0.05103,"6.2-6.4":0.20411,"7.2-7.4":0.70419,"8.2":0.1735,"9.2":0.76542,"10.1":1.28591,"11.1":3.86793},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00729,"9":0.00243,"10":0.00486,"11":0.04619,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.1211},O:{"0":0.71906},Q:{"1.2":0},S:{"2.5":0.00757},H:{"0":2.04943},L:{"0":68.36188}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MA.js b/website/www/node_modules/caniuse-lite/data/regions/MA.js new file mode 100644 index 000000000000..697a8fb525c8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00463,"19":0.07868,"20":0,"21":0,"22":0,"23":0,"24":0.20826,"25":0,"26":0,"27":0,"28":0,"29":0.00463,"30":0.06479,"31":0,"32":0,"33":0.07405,"34":0,"35":0.13884,"36":0.00463,"37":0,"38":0.00463,"39":0,"40":0.00463,"41":0,"42":0,"43":0.01388,"44":0,"45":0,"46":0.00463,"47":0.00463,"48":0.00463,"49":0.21289,"50":0,"51":0,"52":0,"53":0.00463,"54":0.07868,"55":0.07868,"56":0.36098,"57":0.00463,"58":0.01851,"59":0,"60":0,"61":0.01851,"62":0.00463,"63":0.0324,"64":0.00463,"65":0.01851,"66":0.00463,"67":0.02314,"68":0.00463,"69":0.01388,"70":0.06479,"71":0.11107,"72":0.10182,"73":0.06942,"74":0.05091,"75":0.03702,"76":0.04165,"77":0.04628,"78":0.0833,"79":0.13421,"80":7.9509,"81":4.23925,"83":0.01388,"84":0.00926,_:"85"},C:{"2":0.06016,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.07405,"16":0,"17":0,"18":0.05554,"19":0,"20":0,"21":0.07405,"22":0,"23":0.06479,"24":0,"25":0.1481,"26":0,"27":0,"28":0,"29":0,"30":0.0833,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00463,"44":0,"45":0,"46":0,"47":0.00926,"48":0.00926,"49":0,"50":0,"51":0.07405,"52":0.06016,"53":0,"54":0,"55":0,"56":0.00926,"57":0,"58":0,"59":0,"60":0.00463,"61":0,"62":0,"63":0.01388,"64":0.02314,"65":0.01851,"66":0.00463,"67":0.00463,"68":0.09256,"69":0.00926,"70":0.00463,"71":0.00926,"72":0.02314,"73":0.01388,"74":0.55073,"75":0.94874,"76":0.02777,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00926,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.06479,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00463,"57":0.00926,"58":0.00463,"60":0,"62":0,"63":0.00926,"64":0,"65":0.00463,"66":0.00463,"67":0.91634,"68":0.01388,"9.5-9.6":0,"10.0-10.1":0.08793,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00149,"3.2":0.00149,"4.0-4.1":0,"4.2-4.3":0.00297,"5.0-5.1":0.01485,"6.0-6.1":0.00446,"7.0-7.1":0.01485,"8.1-8.4":0.02079,"9.0-9.2":0.01782,"9.3":0.21388,"10.0-10.2":0.05496,"10.3":0.18863,"11.0-11.2":0.1218,"11.3-11.4":0.20646,"12.0-12.1":0.25547,"12.2-12.4":1.67394,"13.0-13.1":0.35647,"13.2":0.17378,"13.3":9.73172,"13.4":1.80316},E:{"4":0,"5":0.06942,"6":0,"7":0,"8":0.00463,"9":0,"10":0.00463,"11":0.01388,"12":0.04628,"13":0.22677,_:"0","3.1":0,"3.2":0,"5.1":0.03702,"6.1":0,"7.1":0,"9.1":0.00463,"10.1":0.0324,"11.1":0.05091,"12.1":0.09719,"13.1":0.19438},I:{"3":0.00404,"4":0.03633,_:"81","2.1":0,"2.2":0.01211,"2.3":0.00404,"4.1":0.08074,"4.2-4.3":0.16956,"4.4":0,"4.4.3-4.4.4":1.16672},B:{"12":0.00463,"13":0.00463,"14":0.00463,"15":0.00926,"16":0.00926,"17":0.02777,"18":0.22214,_:"79 80 81"},P:{"4":0.56804,"5.0-5.4":0.03156,"6.2-6.4":0.07363,"7.2-7.4":0.34713,"8.2":0.0526,"9.2":0.31558,"10.1":0.5996,"11.1":3.04006},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.17373,"9":0.1496,"10":0.14477,"11":0.09652,"5.5":0},N:{"10":0,"11":0.0376},J:{"7":0,"10":0.01074},R:{_:"0"},M:{"0":0.10744},O:{"0":0.1719},Q:{"1.2":0.00537},S:{"2.5":0},H:{"0":0.35601},L:{"0":55.13222}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MC.js b/website/www/node_modules/caniuse-lite/data/regions/MC.js new file mode 100644 index 000000000000..ad774da8edaf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.07544,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00686,"64":0,"65":0.02057,"66":0.01372,"67":0.01372,"68":0.02057,"69":0.00686,"70":0.45263,"71":0.39091,"72":0.0823,"73":1.76251,"74":0.00686,"75":0.02057,"76":0.02743,"77":0.00686,"78":0.15773,"79":0.21946,"80":14.12062,"81":6.16534,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.10973,"46":0,"47":0,"48":0.03429,"49":0,"50":0,"51":0,"52":0.14402,"53":0,"54":0,"55":0.00686,"56":0,"57":0,"58":0,"59":0,"60":0.1303,"61":0,"62":0,"63":0.06172,"64":0.01372,"65":0.02057,"66":0.00686,"67":0.00686,"68":0.33604,"69":0,"70":0,"71":0,"72":0.06858,"73":0.04801,"74":1.49504,"75":1.85852,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.1303,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.41148,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00384,"3.2":0.00384,"4.0-4.1":0,"4.2-4.3":0.00769,"5.0-5.1":0.03844,"6.0-6.1":0.01153,"7.0-7.1":0.03844,"8.1-8.4":0.05381,"9.0-9.2":0.04613,"9.3":0.55352,"10.0-10.2":0.14222,"10.3":0.48817,"11.0-11.2":0.3152,"11.3-11.4":0.5343,"12.0-12.1":0.66114,"12.2-12.4":4.33203,"13.0-13.1":0.92253,"13.2":0.44973,"13.3":25.18498,"13.4":4.66645},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00686,"9":0,"10":0.00686,"11":0.02057,"12":0.30175,"13":5.45897,_:"0","3.1":0,"3.2":0,"5.1":0.01372,"6.1":0,"7.1":0,"9.1":0.01372,"10.1":0.14402,"11.1":0.6858,"12.1":1.40589,"13.1":3.86791},I:{"3":0.00016,"4":0.00148,_:"81","2.1":0,"2.2":0.00049,"2.3":0.00016,"4.1":0.00329,"4.2-4.3":0.0069,"4.4":0,"4.4.3-4.4.4":0.04751},B:{"12":0,"13":0,"14":0,"15":0.00686,"16":0.00686,"17":0.03429,"18":1.4539,_:"79 80 81"},P:{"4":0.11459,"5.0-5.4":0.02083,"6.2-6.4":0,"7.2-7.4":0.03125,"8.2":0.01042,"9.2":0,"10.1":0.03125,"11.1":1.54175},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.04801,"9":0.00686,"10":0.00686,"11":1.61849,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00314},R:{_:"0"},M:{"0":0.10054},O:{"0":0.01571},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.60683},L:{"0":12.16744}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MD.js b/website/www/node_modules/caniuse-lite/data/regions/MD.js new file mode 100644 index 000000000000..ffc0fa7beebb --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MD.js @@ -0,0 +1 @@ +module.exports={D:{"26":0.00537,"34":0.01073,"36":0.0161,"38":0.02147,"40":0.13418,"41":0.10734,"45":0.00537,"47":0.01073,"48":0.0161,"49":0.78358,"51":0.01073,"52":0.01073,"53":0.04294,"55":0.00537,"56":0.02147,"57":0.02147,"58":0.0161,"59":0.0322,"60":0.01073,"61":0.0161,"62":0.0161,"63":0.0483,"64":0.0161,"65":0.02147,"66":0.0161,"67":0.02147,"68":0.0322,"69":0.05367,"70":0.22005,"71":0.23615,"72":0.26298,"73":0.51523,"74":0.24152,"75":0.19858,"76":0.16101,"77":0.14491,"78":0.41863,"79":0.54743,"80":25.04242,"81":11.37804,"83":0.02684,"84":0.0161,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 37 39 42 43 44 46 50 54 85"},C:{"34":0.00537,"38":0.0161,"40":0.00537,"43":0.01073,"45":0.0161,"47":0.0161,"48":0.01073,"50":0.02147,"51":0.00537,"52":0.09124,"53":0.01073,"55":0.00537,"56":0.0161,"57":0.0161,"58":0.18248,"59":0.0161,"60":0.05367,"61":0.01073,"63":0.01073,"64":0.0322,"65":0.00537,"66":0.10197,"67":0.0161,"68":0.32739,"69":0.04294,"70":0.01073,"71":0.0161,"72":0.05367,"73":0.02147,"74":0.92312,"75":1.35248,"76":0.0161,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 41 42 44 46 49 54 62 77 78 3.5","3.6":0.0161},F:{"36":0.07514,"56":0.00537,"58":0.00537,"65":0.01073,"66":0.01073,"67":2.40442,"68":0.03757,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.01073},G:{"8":0.00053,"3.2":0.00053,"4.0-4.1":0,"4.2-4.3":0.00106,"5.0-5.1":0.00528,"6.0-6.1":0.00159,"7.0-7.1":0.00528,"8.1-8.4":0.0074,"9.0-9.2":0.00634,"9.3":0.07609,"10.0-10.2":0.01955,"10.3":0.06711,"11.0-11.2":0.04333,"11.3-11.4":0.07345,"12.0-12.1":0.09089,"12.2-12.4":0.59552,"13.0-13.1":0.12682,"13.2":0.06182,"13.3":3.46217,"13.4":0.64149},E:{"4":0,"9":0.00537,"11":0.05904,"12":0.03757,"13":0.82115,_:"0 5 6 7 8 10 3.1 3.2 6.1 7.1","5.1":0.02147,"9.1":0.13954,"10.1":0.0322,"11.1":0.08051,"12.1":0.18785,"13.1":0.62257},I:{"3":0.00108,"4":0.00971,_:"81","2.1":0,"2.2":0.00324,"2.3":0.00108,"4.1":0.02158,"4.2-4.3":0.04531,"4.4":0,"4.4.3-4.4.4":0.31181},B:{"12":0.00537,"13":0.01073,"14":0.00537,"15":0.01073,"16":0.0322,"17":0.0322,"18":0.70844,_:"79 80 81"},P:{"4":0.21757,"5.0-5.4":0.01053,"6.2-6.4":0.01036,"7.2-7.4":0.0518,"8.2":0.02072,"9.2":0.21757,"10.1":0.32117,"11.1":2.53827},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00555,"7":0.00555,"8":0.061,"9":0.01664,"10":0.01109,"11":0.3993,_:"5.5"},N:{"10":0,"11":0.03706},J:{"7":0,"10":0.00927},R:{_:"0"},M:{"0":0.14826},O:{"0":1.01463},Q:{"1.2":0.00927},S:{"2.5":0},H:{"0":0.31581},L:{"0":36.49264}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ME.js b/website/www/node_modules/caniuse-lite/data/regions/ME.js new file mode 100644 index 000000000000..51a67670eba5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ME.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00355,"23":0,"24":0,"25":0,"26":0.00355,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00355,"34":0.00355,"35":0,"36":0,"37":0,"38":0.01419,"39":0,"40":0.00355,"41":0,"42":0,"43":0.00355,"44":0.00355,"45":0,"46":0,"47":0,"48":0,"49":0.12418,"50":0.00355,"51":0,"52":0,"53":0.01774,"54":0.00355,"55":0.00355,"56":0.00355,"57":0,"58":0.0071,"59":0,"60":0.0071,"61":0,"62":0.0071,"63":0.01064,"64":0,"65":0.00355,"66":0.0071,"67":0.00355,"68":0.00355,"69":0.00355,"70":0.04967,"71":0.02484,"72":0.01419,"73":0.02484,"74":0.02129,"75":0.02129,"76":0.02484,"77":0.01419,"78":0.04967,"79":0.05322,"80":5.07719,"81":2.61133,"83":0.01064,"84":0.00355,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0071,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00355,"50":0,"51":0,"52":0.0816,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00355,"65":0.0071,"66":0.0071,"67":0.00355,"68":0.03548,"69":0,"70":0.0071,"71":0,"72":0.0071,"73":0.00355,"74":0.30158,"75":0.57123,"76":0.01774,"77":0.00355,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00355,"32":0,"33":0,"34":0,"35":0,"36":0.0071,"37":0,"38":0,"39":0,"40":0.00355,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00355,"57":0,"58":0.0071,"60":0,"62":0,"63":0.00355,"64":0,"65":0.00355,"66":0.00355,"67":2.04365,"68":0.0071,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00113,"3.2":0.00113,"4.0-4.1":0,"4.2-4.3":0.00227,"5.0-5.1":0.01133,"6.0-6.1":0.0034,"7.0-7.1":0.01133,"8.1-8.4":0.01586,"9.0-9.2":0.0136,"9.3":0.16314,"10.0-10.2":0.04192,"10.3":0.14388,"11.0-11.2":0.0929,"11.3-11.4":0.15748,"12.0-12.1":0.19487,"12.2-12.4":1.27683,"13.0-13.1":0.27191,"13.2":0.13255,"13.3":7.42307,"13.4":1.3754},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00355,"9":0,"10":0.01064,"11":0.0071,"12":0.01064,"13":0.16321,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0071,"10.1":0.00355,"11.1":0.03548,"12.1":0.01064,"13.1":0.10999},I:{"3":0.00075,"4":0.00671,_:"81","2.1":0,"2.2":0.00224,"2.3":0.00075,"4.1":0.0149,"4.2-4.3":0.03129,"4.4":0,"4.4.3-4.4.4":0.21531},B:{"12":0,"13":0.00355,"14":0,"15":0.01419,"16":0.00355,"17":0.01064,"18":0.15966,_:"79 80 81"},P:{"4":0.24384,"5.0-5.4":0.02032,"6.2-6.4":0.03048,"7.2-7.4":0.11176,"8.2":0.06096,"9.2":0.27431,"10.1":0.59943,"11.1":4.91735},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00422,"9":0,"10":0,"11":0.08448,"5.5":0},N:{"10":0,"11":0.01936},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.08388},O:{"0":0.02581},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.22601},L:{"0":67.18072}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MG.js b/website/www/node_modules/caniuse-lite/data/regions/MG.js new file mode 100644 index 000000000000..c65b63cb6b83 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00597,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00597,"26":0,"27":0,"28":0.00597,"29":0,"30":0,"31":0,"32":0.00597,"33":0,"34":0,"35":0,"36":0.01791,"37":0,"38":0.01194,"39":0,"40":0.01791,"41":0,"42":0.01194,"43":0.01194,"44":0.00597,"45":0,"46":0.00597,"47":0.00597,"48":0.02985,"49":0.28059,"50":0.00597,"51":0.01194,"52":0,"53":0,"54":0,"55":0.14328,"56":0.02985,"57":0.01194,"58":0.01791,"59":0.00597,"60":0,"61":0.00597,"62":0.01791,"63":0.18507,"64":0.01194,"65":0.01194,"66":0.00597,"67":0.07761,"68":0.02388,"69":0.08955,"70":0.02388,"71":0.04776,"72":0.08358,"73":0.14925,"74":0.09552,"75":0.07761,"76":0.10746,"77":0.23283,"78":0.1194,"79":0.33432,"80":11.05644,"81":6.37596,"83":0.01791,"84":0.01791,_:"85"},C:{"2":0,"3":0.00597,"4":0.00597,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00597,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00597,"29":0,"30":0.00597,"31":0.00597,"32":0.00597,"33":0.00597,"34":0,"35":0.00597,"36":0.00597,"37":0,"38":0.00597,"39":0.00597,"40":0.01194,"41":0.00597,"42":0.01194,"43":0.01791,"44":0.00597,"45":0.01194,"46":0,"47":0.05373,"48":0.12537,"49":0.01791,"50":0.03582,"51":0.01194,"52":0.08955,"53":0.00597,"54":0.01194,"55":0.00597,"56":0.04179,"57":0.02985,"58":0.01194,"59":0.00597,"60":0.02985,"61":0.01194,"62":0.01791,"63":0.02388,"64":0.01791,"65":0.01791,"66":0.02388,"67":0.06567,"68":0.31044,"69":0.04179,"70":0.05373,"71":0.04776,"72":0.27462,"73":0.13731,"74":2.19696,"75":4.06557,"76":0.16119,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0.00597,"16":0,"17":0,"18":0.00597,"19":0,"20":0.00597,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00597,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00597,"37":0.00597,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00597,"45":0.01194,"46":0.01194,"47":0.02388,"48":0.00597,"49":0,"50":0,"51":0,"52":0,"53":0.00597,"54":0,"55":0,"56":0.00597,"57":0.00597,"58":0.00597,"60":0,"62":0.00597,"63":0.00597,"64":0.00597,"65":0.02985,"66":0.03582,"67":1.35519,"68":0.03582,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00597,"12.1":0.04179},G:{"8":0.00055,"3.2":0.00055,"4.0-4.1":0,"4.2-4.3":0.0011,"5.0-5.1":0.00549,"6.0-6.1":0.00165,"7.0-7.1":0.00549,"8.1-8.4":0.00768,"9.0-9.2":0.00659,"9.3":0.07904,"10.0-10.2":0.02031,"10.3":0.06971,"11.0-11.2":0.04501,"11.3-11.4":0.0763,"12.0-12.1":0.09441,"12.2-12.4":0.61863,"13.0-13.1":0.13174,"13.2":0.06422,"13.3":3.59653,"13.4":0.66639},E:{"4":0,"5":0,"6":0.02985,"7":0.00597,"8":0.07164,"9":0,"10":0.01194,"11":0.02388,"12":0.04776,"13":0.597,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00597,"10.1":0.01791,"11.1":0.05373,"12.1":0.14925,"13.1":0.32835},I:{"3":0.00302,"4":0.02717,_:"81","2.1":0,"2.2":0.00906,"2.3":0.00302,"4.1":0.06037,"4.2-4.3":0.12678,"4.4":0,"4.4.3-4.4.4":0.87238},B:{"12":0.02388,"13":0.04776,"14":0.04776,"15":0.04776,"16":0.01194,"17":0.10149,"18":0.79401,_:"79 80 81"},P:{"4":0.16344,"5.0-5.4":0,"6.2-6.4":0.01021,"7.2-7.4":0.03064,"8.2":0,"9.2":0.12258,"10.1":0.30645,"11.1":0.83762},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.12179,"9":0.01433,"10":0.00716,"11":0.28656,"5.5":0},N:{"10":0.01136,"11":0.11357},J:{"7":0,"10":0.00806},R:{_:"0"},M:{"0":0.27001},O:{"0":5.3196},Q:{"1.2":0.09269},S:{"2.5":0.17732},H:{"0":8.59215},L:{"0":33.98695}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MH.js b/website/www/node_modules/caniuse-lite/data/regions/MH.js new file mode 100644 index 000000000000..a9c73f1f9039 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.23233,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02161,"50":0,"51":0,"52":0.0054,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.01081,"63":0.0054,"64":0.0054,"65":0,"66":0,"67":0.0054,"68":0.01621,"69":0,"70":0,"71":0,"72":0.0054,"73":0.21612,"74":0,"75":0,"76":0.01081,"77":0.01621,"78":0,"79":0.08645,"80":11.72991,"81":7.68847,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.0054,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01081,"49":0,"50":0,"51":0,"52":0.01081,"53":0,"54":0,"55":0,"56":0,"57":0.01081,"58":0,"59":0,"60":0,"61":0.0054,"62":0,"63":0,"64":0,"65":0,"66":0.0054,"67":0,"68":0.02161,"69":0.01081,"70":0,"71":0,"72":0.0054,"73":0.362,"74":0.1837,"75":0.59433,"76":0.03782,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.05943,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00212,"3.2":0.00212,"4.0-4.1":0,"4.2-4.3":0.00424,"5.0-5.1":0.02118,"6.0-6.1":0.00635,"7.0-7.1":0.02118,"8.1-8.4":0.02965,"9.0-9.2":0.02542,"9.3":0.30501,"10.0-10.2":0.07837,"10.3":0.269,"11.0-11.2":0.17369,"11.3-11.4":0.29442,"12.0-12.1":0.36432,"12.2-12.4":2.38712,"13.0-13.1":0.50835,"13.2":0.24782,"13.3":13.87793,"13.4":2.5714},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.01621,"13":0.64836,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.11887,"11.1":0.05943,"12.1":0.38361,"13.1":0.25934},I:{"3":0.00193,"4":0.01736,_:"81","2.1":0,"2.2":0.00579,"2.3":0.00193,"4.1":0.03857,"4.2-4.3":0.08099,"4.4":0,"4.4.3-4.4.4":0.5573},B:{"12":0.01081,"13":0.03242,"14":0.0054,"15":0.01081,"16":0.25934,"17":0.28096,"18":1.96669,_:"79 80 81"},P:{"4":0.10955,"5.0-5.4":0.02191,"6.2-6.4":0,"7.2-7.4":0.06573,"8.2":0.01096,"9.2":0.15338,"10.1":0.01096,"11.1":0.79975},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00547,"9":0,"10":0,"11":0.41056,"5.5":0},N:{"10":0,"11":0.0046},J:{"7":0,"10":0.0046},R:{_:"0"},M:{"0":0.04597},O:{"0":0.17009},Q:{"1.2":1.0757},S:{"2.5":0},H:{"0":0.04352},L:{"0":47.7566}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MK.js b/website/www/node_modules/caniuse-lite/data/regions/MK.js new file mode 100644 index 000000000000..37e3a43c2c47 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00488,"23":0,"24":0,"25":0.01953,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00488,"35":0,"36":0,"37":0,"38":0.00976,"39":0,"40":0,"41":0.00488,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00488,"48":0,"49":0.67372,"50":0.00488,"51":0.00488,"52":0.00488,"53":0.02441,"54":0,"55":0.00488,"56":0.00976,"57":0.00488,"58":0.01953,"59":0.00488,"60":0.00976,"61":0.09276,"62":0.00976,"63":0.01953,"64":0.00488,"65":0.01465,"66":0.00488,"67":0.09276,"68":0.01953,"69":0.14158,"70":0.40032,"71":0.57608,"72":0.50773,"73":0.27827,"74":0.02441,"75":0.03417,"76":0.02929,"77":0.03906,"78":0.0537,"79":0.07811,"80":10.41819,"81":4.88688,"83":0.01465,"84":0.00488,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00488,"39":0,"40":0,"41":0,"42":0,"43":0.00488,"44":0,"45":0,"46":0,"47":0.00976,"48":0.00488,"49":0.02929,"50":0.00488,"51":0.00976,"52":0.16111,"53":0,"54":0,"55":0.01465,"56":0.02929,"57":0,"58":0.00976,"59":0,"60":0.00488,"61":0.00488,"62":0.00488,"63":0.15134,"64":0.1904,"65":0.04882,"66":0.02929,"67":0.00488,"68":0.08299,"69":0.00488,"70":0,"71":0.00488,"72":0.01465,"73":0.01953,"74":0.56631,"75":0.98616,"76":0.01953,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00488,"31":0.00976,"32":0,"33":0,"34":0,"35":0,"36":0.00488,"37":0.00488,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00488,"57":0.1074,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.58096,"68":0.00976,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00097,"3.2":0.00097,"4.0-4.1":0,"4.2-4.3":0.00194,"5.0-5.1":0.00969,"6.0-6.1":0.00291,"7.0-7.1":0.00969,"8.1-8.4":0.01356,"9.0-9.2":0.01163,"9.3":0.13951,"10.0-10.2":0.03585,"10.3":0.12304,"11.0-11.2":0.07945,"11.3-11.4":0.13467,"12.0-12.1":0.16664,"12.2-12.4":1.09189,"13.0-13.1":0.23252,"13.2":0.11335,"13.3":6.34786,"13.4":1.17618},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00976,"12":0.03417,"13":0.20016,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00976,"11.1":0.01465,"12.1":0.04882,"13.1":0.14158},I:{"3":0.00081,"4":0.00727,_:"81","2.1":0,"2.2":0.00242,"2.3":0.00081,"4.1":0.01616,"4.2-4.3":0.03393,"4.4":0,"4.4.3-4.4.4":0.23348},B:{"12":0.00488,"13":0.00488,"14":0.00488,"15":0.01465,"16":0.01465,"17":0.06835,"18":0.37103,_:"79 80 81"},P:{"4":0.09243,"5.0-5.4":0.01027,"6.2-6.4":0.01027,"7.2-7.4":0.03081,"8.2":0.02054,"9.2":0.16431,"10.1":0.22593,"11.1":2.57766},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.06084,"9":0.00507,"10":0.01014,"11":0.18758,"5.5":0},N:{"10":0,"11":0.03071},J:{"7":0,"10":0.01024},R:{_:"0"},M:{"0":0.09212},O:{"0":0.04094},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.08237},L:{"0":61.5939}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ML.js b/website/www/node_modules/caniuse-lite/data/regions/ML.js new file mode 100644 index 000000000000..ce39d9581b36 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ML.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.05555,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00265,"37":0.00265,"38":0,"39":0,"40":0.00265,"41":0.00265,"42":0,"43":0.00794,"44":0,"45":0,"46":0,"47":0,"48":0.00265,"49":0.04497,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00265,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.03174,"64":0.00265,"65":0.00529,"66":0.00265,"67":0.00265,"68":0.00265,"69":0.02116,"70":0.00529,"71":0.05026,"72":0.00529,"73":0.00529,"74":0.01058,"75":0.00265,"76":0.0291,"77":0.01058,"78":0.00529,"79":0.05026,"80":1.9044,"81":0.96543,"83":0.00265,"84":0,_:"85"},C:{"2":0,"3":0.01323,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01587,"29":0,"30":0.00265,"31":0,"32":0.00265,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00265,"40":0.00265,"41":0,"42":0,"43":0.00794,"44":0,"45":0,"46":0,"47":0.00529,"48":0.00265,"49":0,"50":0,"51":0,"52":0.00529,"53":0,"54":0,"55":0,"56":0.05026,"57":0.00265,"58":0.00265,"59":0,"60":0.01323,"61":0.00265,"62":0,"63":0,"64":0.00529,"65":0,"66":0.00265,"67":0.00265,"68":0.07142,"69":0.00265,"70":0.01323,"71":0.00265,"72":0.02381,"73":0.01323,"74":0.59248,"75":0.85963,"76":0.02381,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00265,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00265,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00265,"47":0.01058,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00529,"54":0,"55":0,"56":0,"57":0,"58":0.00265,"60":0.00794,"62":0,"63":0.00265,"64":0.00265,"65":0.04232,"66":0.00529,"67":0.21689,"68":0.00265,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0007,"3.2":0.0007,"4.0-4.1":0,"4.2-4.3":0.0014,"5.0-5.1":0.00698,"6.0-6.1":0.00209,"7.0-7.1":0.00698,"8.1-8.4":0.00977,"9.0-9.2":0.00837,"9.3":0.1005,"10.0-10.2":0.02582,"10.3":0.08863,"11.0-11.2":0.05723,"11.3-11.4":0.09701,"12.0-12.1":0.12004,"12.2-12.4":0.78653,"13.0-13.1":0.1675,"13.2":0.08165,"13.3":4.57262,"13.4":0.84725},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00265,"9":0,"10":0.01587,"11":0,"12":0.01852,"13":0.10845,_:"0","3.1":0,"3.2":0,"5.1":0.02381,"6.1":0,"7.1":0,"9.1":0.00529,"10.1":0.07671,"11.1":0.01058,"12.1":0.08464,"13.1":0.14812},I:{"3":0.00153,"4":0.01376,_:"81","2.1":0,"2.2":0.00459,"2.3":0.00153,"4.1":0.03057,"4.2-4.3":0.0642,"4.4":0,"4.4.3-4.4.4":0.44176},B:{"12":0.01852,"13":0.01852,"14":0.00529,"15":0.01058,"16":0.01587,"17":0.02645,"18":0.25657,_:"79 80 81"},P:{"4":0.361,"5.0-5.4":0.05014,"6.2-6.4":0.05014,"7.2-7.4":0.22061,"8.2":0.06017,"9.2":0.66183,"10.1":0.56155,"11.1":1.5944},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00824,"9":0.00412,"10":0.02059,"11":0.29239,"5.5":0},N:{"10":0.01018,"11":0.12221},J:{"7":0,"10":0.03678},R:{_:"0"},M:{"0":0.32362},O:{"0":3.80989},Q:{"1.2":0.09562},S:{"2.5":0.02207},H:{"0":0.88433},L:{"0":74.61852}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MM.js b/website/www/node_modules/caniuse-lite/data/regions/MM.js new file mode 100644 index 000000000000..1079cd3ab681 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00762,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01523,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00254,"32":0.00254,"33":0,"34":0,"35":0,"36":0,"37":0.02031,"38":0.00254,"39":0,"40":0.00508,"41":0,"42":0.00254,"43":0.00254,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00762,"50":0,"51":0,"52":0,"53":0.00762,"54":0,"55":0,"56":0,"57":0,"58":0.00254,"59":0,"60":0,"61":0.00254,"62":0.00508,"63":0.02285,"64":0.00508,"65":0.00762,"66":0.00254,"67":0.00254,"68":0.00254,"69":0.0127,"70":0.00508,"71":0.02539,"72":0.01016,"73":0.0127,"74":0.0457,"75":0.01016,"76":0.04316,"77":0.0127,"78":0.0127,"79":0.0457,"80":1.99058,"81":1.34313,"83":0.00508,"84":0.00508,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.00254,"20":0,"21":0,"22":0,"23":0.00254,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00254,"30":0.00254,"31":0,"32":0,"33":0,"34":0,"35":0.00254,"36":0.00254,"37":0.00254,"38":0.00254,"39":0.00254,"40":0,"41":0.00254,"42":0.00254,"43":0.00508,"44":0.00254,"45":0.00254,"46":0,"47":0.01016,"48":0.00508,"49":0.00254,"50":0.00254,"51":0,"52":0.00508,"53":0,"54":0,"55":0.00508,"56":0.00762,"57":0.00762,"58":0.00254,"59":0.00254,"60":0.03047,"61":0.00508,"62":0.00762,"63":0.00254,"64":0.01016,"65":0.00762,"66":0.01523,"67":0.0127,"68":0.05332,"69":0.01523,"70":0.00762,"71":0.02285,"72":0.0457,"73":0.01777,"74":0.44686,"75":0.83025,"76":0.10918,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00254,"35":0,"36":0,"37":0.03047,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00254,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00254,"64":0,"65":0.00254,"66":0,"67":0.06601,"68":0.00508,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00072,"3.2":0.00072,"4.0-4.1":0,"4.2-4.3":0.00143,"5.0-5.1":0.00715,"6.0-6.1":0.00215,"7.0-7.1":0.00715,"8.1-8.4":0.01001,"9.0-9.2":0.00858,"9.3":0.10297,"10.0-10.2":0.02646,"10.3":0.09082,"11.0-11.2":0.05864,"11.3-11.4":0.0994,"12.0-12.1":0.123,"12.2-12.4":0.80592,"13.0-13.1":0.17162,"13.2":0.08367,"13.3":4.68534,"13.4":0.86813},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00254,"11":0.00762,"12":0.03047,"13":0.19043,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01523,"11.1":0.02031,"12.1":0.0584,"13.1":0.14726},I:{"3":0.00628,"4":0.05655,_:"81","2.1":0,"2.2":0.01885,"2.3":0.00628,"4.1":0.12567,"4.2-4.3":0.26391,"4.4":0,"4.4.3-4.4.4":1.81596},B:{"12":0.00254,"13":0.00508,"14":0.00254,"15":0.00254,"16":0.00254,"17":0.01523,"18":0.14472,_:"79 80 81"},P:{"4":0.52958,"5.0-5.4":0.02037,"6.2-6.4":0.02037,"7.2-7.4":0.09166,"8.2":0.03055,"9.2":0.16295,"10.1":0.30553,"11.1":0.87585},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00399,"9":0.00399,"10":0,"11":0.04788,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00746},R:{_:"0"},M:{"0":0.22383},O:{"0":2.05924},Q:{"1.2":0.07461},S:{"2.5":0},H:{"0":0.60041},L:{"0":77.92576}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MN.js b/website/www/node_modules/caniuse-lite/data/regions/MN.js new file mode 100644 index 000000000000..a990582a8f1c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.00677,"20":0,"21":0,"22":0,"23":0.00677,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0203,"37":0,"38":0.00677,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00677,"47":0,"48":0,"49":0.09472,"50":0,"51":0.00677,"52":0.00677,"53":0,"54":0,"55":0.00677,"56":0,"57":0.00677,"58":0.02706,"59":0,"60":0.02706,"61":0.00677,"62":0.00677,"63":0.10149,"64":0,"65":0.03383,"66":0.00677,"67":0.0203,"68":0.00677,"69":0.05413,"70":0.0406,"71":0.02706,"72":0.0406,"73":0.06089,"74":0.25711,"75":0.05413,"76":0.06089,"77":0.13532,"78":0.14209,"79":0.2977,"80":23.6404,"81":12.2194,"83":0.04736,"84":0.00677,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00677,"48":0,"49":0,"50":0,"51":0,"52":0.0203,"53":0,"54":0,"55":0,"56":0.00677,"57":0,"58":0,"59":0,"60":0.0203,"61":0,"62":0,"63":0,"64":0,"65":0.00677,"66":0.00677,"67":0.01353,"68":0.08119,"69":0.00677,"70":0.01353,"71":0,"72":0.0406,"73":0.02706,"74":1.0352,"75":1.81329,"76":0.05413,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00677,"64":0,"65":0.00677,"66":0.00677,"67":1.53588,"68":0.0203,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00144,"3.2":0.00144,"4.0-4.1":0,"4.2-4.3":0.00289,"5.0-5.1":0.01444,"6.0-6.1":0.00433,"7.0-7.1":0.01444,"8.1-8.4":0.02022,"9.0-9.2":0.01733,"9.3":0.20797,"10.0-10.2":0.05344,"10.3":0.18342,"11.0-11.2":0.11843,"11.3-11.4":0.20075,"12.0-12.1":0.24841,"12.2-12.4":1.62768,"13.0-13.1":0.34662,"13.2":0.16898,"13.3":9.46281,"13.4":1.75334},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00677,"10":0.00677,"11":0,"12":0.0406,"13":0.45332,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01353,"10.1":0.01353,"11.1":0.04736,"12.1":0.16915,"13.1":0.27064},I:{"3":0.00125,"4":0.01122,_:"81","2.1":0,"2.2":0.00374,"2.3":0.00125,"4.1":0.02494,"4.2-4.3":0.05238,"4.4":0,"4.4.3-4.4.4":0.36044},B:{"12":0.00677,"13":0.00677,"14":0.00677,"15":0.00677,"16":0.05413,"17":0.04736,"18":0.77132,_:"79 80 81"},P:{"4":0.39425,"5.0-5.4":0.14153,"6.2-6.4":0.03033,"7.2-7.4":0.1112,"8.2":0.03033,"9.2":0.20218,"10.1":0.46502,"11.1":2.96196},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00918,"7":0,"8":0.04591,"9":0.00918,"10":0,"11":0.19283,"5.5":0},N:{"10":0,"11":0.0097},J:{"7":0,"10":0.00323},R:{_:"0"},M:{"0":0.10996},O:{"0":0.26842},Q:{"1.2":0.06791},S:{"2.5":0},H:{"0":0.10716},L:{"0":31.81617}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MO.js b/website/www/node_modules/caniuse-lite/data/regions/MO.js new file mode 100644 index 000000000000..5d30983e803d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01051,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.02628,"23":0,"24":0,"25":0,"26":0.01577,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.04205,"35":0,"36":0.00526,"37":0,"38":0.0841,"39":0,"40":0.0473,"41":0,"42":0,"43":0,"44":0,"45":0.00526,"46":0,"47":0.01051,"48":0,"49":0.14717,"50":0,"51":0,"52":0,"53":0.10512,"54":0.00526,"55":0.02102,"56":0.00526,"57":0.02102,"58":0.02102,"59":0.02628,"60":0.00526,"61":0.01051,"62":0.02628,"63":0.06307,"64":0.06307,"65":0.02102,"66":0.0473,"67":0.0473,"68":0.05782,"69":0.12614,"70":0.03679,"71":0.08935,"72":0.06307,"73":0.16819,"74":0.13666,"75":0.12614,"76":0.09461,"77":0.15768,"78":0.2155,"79":0.37318,"80":9.99691,"81":4.48862,"83":0.01577,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01577,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00526,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.01577,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00526,"53":0,"54":0,"55":0,"56":0.01051,"57":0,"58":0,"59":0,"60":0.00526,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00526,"67":0,"68":0.03679,"69":0.00526,"70":0,"71":0,"72":0.01051,"73":0.01051,"74":0.31536,"75":0.56239,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01577,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.09461,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0044,"3.2":0.0044,"4.0-4.1":0,"4.2-4.3":0.0088,"5.0-5.1":0.04399,"6.0-6.1":0.0132,"7.0-7.1":0.04399,"8.1-8.4":0.06158,"9.0-9.2":0.05279,"9.3":0.63342,"10.0-10.2":0.16275,"10.3":0.55864,"11.0-11.2":0.3607,"11.3-11.4":0.61143,"12.0-12.1":0.75659,"12.2-12.4":4.95742,"13.0-13.1":1.05571,"13.2":0.51466,"13.3":28.82079,"13.4":5.34012},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00526,"9":0,"10":0.03154,"11":0.03154,"12":0.0841,"13":2.8067,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.03679,"10.1":0.08935,"11.1":0.14717,"12.1":0.37318,"13.1":0.95659},I:{"3":0.00149,"4":0.01344,_:"81","2.1":0,"2.2":0.00448,"2.3":0.00149,"4.1":0.02986,"4.2-4.3":0.0627,"4.4":0,"4.4.3-4.4.4":0.43143},B:{"12":0,"13":0,"14":0.00526,"15":0,"16":0.0473,"17":0.0473,"18":1.0985,_:"79 80 81"},P:{"4":0.49083,"5.0-5.4":0.02181,"6.2-6.4":0,"7.2-7.4":0.02181,"8.2":0,"9.2":0.09817,"10.1":0.07635,"11.1":1.95241},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0378,"9":0.00945,"10":0.00945,"11":0.92617,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.11386},O:{"0":0.66416},Q:{"1.2":0.37003},S:{"2.5":0.00474},H:{"0":0.01797},L:{"0":24.21769}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MP.js b/website/www/node_modules/caniuse-lite/data/regions/MP.js new file mode 100644 index 000000000000..5341978253ae --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MP.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00622,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0373,"50":0,"51":0,"52":0,"53":0.01865,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00622,"65":0.00622,"66":0,"67":0.01865,"68":0,"69":0.00622,"70":0,"71":0,"72":0.09326,"73":0,"74":0.02487,"75":0.08082,"76":0.0746,"77":0.04974,"78":0.08082,"79":0.77713,"80":8.66028,"81":19.26027,"83":0.00622,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02487,"69":0,"70":0,"71":0.00622,"72":0.00622,"73":0.00622,"74":0.10569,"75":0.90768,"76":0.01243,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00622,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.53466,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00169,"3.2":0.00169,"4.0-4.1":0,"4.2-4.3":0.00339,"5.0-5.1":0.01694,"6.0-6.1":0.00508,"7.0-7.1":0.01694,"8.1-8.4":0.02372,"9.0-9.2":0.02033,"9.3":0.244,"10.0-10.2":0.06269,"10.3":0.21519,"11.0-11.2":0.13894,"11.3-11.4":0.23552,"12.0-12.1":0.29144,"12.2-12.4":1.90961,"13.0-13.1":0.40666,"13.2":0.19825,"13.3":11.10186,"13.4":2.05703},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01243,"12":0.01243,"13":1.65372,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.03109,"10.1":0.03109,"11.1":0.0746,"12.1":0.60305,"13.1":1.06311},I:{"3":0.00197,"4":0.01774,_:"81","2.1":0,"2.2":0.00591,"2.3":0.00197,"4.1":0.03941,"4.2-4.3":0.08276,"4.4":0,"4.4.3-4.4.4":0.5695},B:{"12":0,"13":0.06839,"14":0,"15":0.00622,"16":0.01243,"17":0.01243,"18":1.59777,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.0852,"8.2":0.09585,"9.2":0.05325,"10.1":0.41536,"11.1":4.07908},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.31085,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13619},O:{"0":0.21941},Q:{"1.2":0.00378},S:{"2.5":0},H:{"0":0.37964},L:{"0":36.86097}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MQ.js b/website/www/node_modules/caniuse-lite/data/regions/MQ.js new file mode 100644 index 000000000000..4c87ca5a10e1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MQ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.0043,"40":0.0086,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.1634,"50":0,"51":0,"52":0,"53":0.0043,"54":0,"55":0,"56":0,"57":0.0043,"58":0.0086,"59":0,"60":0,"61":0,"62":0,"63":0.0129,"64":0,"65":0.0043,"66":0.0043,"67":0.0043,"68":0,"69":0.0043,"70":0.0043,"71":0.0129,"72":0.0172,"73":0.0172,"74":0.0043,"75":0.0301,"76":0.0086,"77":0.0129,"78":0.0301,"79":0.1075,"80":5.2374,"81":4.2011,"83":0.0043,"84":0.0043,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.0043,"44":0,"45":0,"46":0,"47":0,"48":0.0043,"49":0,"50":0.0086,"51":0,"52":0.0043,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.0086,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.0043,"67":0.0387,"68":0.1204,"69":0,"70":0.0086,"71":0,"72":0.086,"73":0.0129,"74":0.6536,"75":1.1696,"76":0.0043,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0043,"32":0,"33":0,"34":0,"35":0,"36":0.0043,"37":0,"38":0,"39":0,"40":0.0043,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.3827,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00192,"3.2":0.00192,"4.0-4.1":0,"4.2-4.3":0.00385,"5.0-5.1":0.01924,"6.0-6.1":0.00577,"7.0-7.1":0.01924,"8.1-8.4":0.02693,"9.0-9.2":0.02309,"9.3":0.27702,"10.0-10.2":0.07118,"10.3":0.24432,"11.0-11.2":0.15775,"11.3-11.4":0.2674,"12.0-12.1":0.33089,"12.2-12.4":2.16808,"13.0-13.1":0.4617,"13.2":0.22508,"13.3":12.60448,"13.4":2.33545},E:{"4":0,"5":0,"6":0,"7":0.0043,"8":0,"9":0,"10":0,"11":0.0043,"12":0.0301,"13":1.0535,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0086,"10.1":0.0172,"11.1":0.1419,"12.1":0.2279,"13.1":0.8514},I:{"3":0.00129,"4":0.01159,_:"81","2.1":0,"2.2":0.00386,"2.3":0.00129,"4.1":0.02576,"4.2-4.3":0.05409,"4.4":0,"4.4.3-4.4.4":0.37222},B:{"12":0,"13":0.0043,"14":0.0086,"15":0.0086,"16":0.0129,"17":0.043,"18":1.5136,_:"79 80 81"},P:{"4":0.2674,"5.0-5.4":0.02139,"6.2-6.4":0.03209,"7.2-7.4":0.17114,"8.2":0.03209,"9.2":0.5348,"10.1":0.84499,"11.1":4.3319},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.5117,"5.5":0},N:{"10":0,"11":0.0057},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.1881},O:{"0":0.0228},Q:{"1.2":0.3078},S:{"2.5":0.0057},H:{"0":0.07015},L:{"0":53.543}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MR.js b/website/www/node_modules/caniuse-lite/data/regions/MR.js new file mode 100644 index 000000000000..77de306ad157 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0.00444,"9":0,"10":0,"11":0.00222,"12":0,"13":0,"14":0,"15":0,"16":0.00222,"17":0,"18":0,"19":0.00222,"20":0,"21":0,"22":0.00222,"23":0.00222,"24":0,"25":0,"26":0.00222,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00222,"34":0,"35":0.00222,"36":0,"37":0,"38":0,"39":0,"40":0.00222,"41":0,"42":0,"43":0.06666,"44":0.00222,"45":0,"46":0.00222,"47":0,"48":0.00444,"49":0.02,"50":0.00222,"51":0.00444,"52":0,"53":0,"54":0,"55":0,"56":0.00222,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00667,"64":0.04,"65":0.01778,"66":0,"67":0.00667,"68":0,"69":0.00889,"70":0.00444,"71":0.01111,"72":0.05111,"73":0.00889,"74":0.02444,"75":0.01111,"76":0.03777,"77":0.01778,"78":0.04444,"79":0.03777,"80":1.87537,"81":1.04212,"83":0,"84":0.00222,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00222,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00222,"35":0.00222,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00222,"42":0,"43":0.00222,"44":0,"45":0.00222,"46":0,"47":0.00667,"48":0.00222,"49":0,"50":0,"51":0,"52":0.00667,"53":0,"54":0,"55":0,"56":0.01778,"57":0,"58":0,"59":0,"60":0.00222,"61":0,"62":0,"63":0,"64":0,"65":0.00222,"66":0,"67":0.00444,"68":0.02889,"69":0.00444,"70":0.00222,"71":0.00889,"72":0.01778,"73":0.00444,"74":0.17554,"75":0.3133,"76":0.00222,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00222,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00222,"46":0,"47":0.00444,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.04666,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.09999,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00444},G:{"8":0.00088,"3.2":0.00088,"4.0-4.1":0,"4.2-4.3":0.00175,"5.0-5.1":0.00875,"6.0-6.1":0.00263,"7.0-7.1":0.00875,"8.1-8.4":0.01225,"9.0-9.2":0.0105,"9.3":0.12601,"10.0-10.2":0.03238,"10.3":0.11114,"11.0-11.2":0.07176,"11.3-11.4":0.12164,"12.0-12.1":0.15052,"12.2-12.4":0.98623,"13.0-13.1":0.21002,"13.2":0.10239,"13.3":5.73364,"13.4":1.06237},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00444,"12":0.00444,"13":0.07555,_:"0","3.1":0,"3.2":0,"5.1":0.01555,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00889,"11.1":0.01555,"12.1":0.01111,"13.1":0.03555},I:{"3":0.00121,"4":0.0109,_:"81","2.1":0,"2.2":0.00363,"2.3":0.00121,"4.1":0.02423,"4.2-4.3":0.05089,"4.4":0,"4.4.3-4.4.4":0.35014},B:{"12":0.00667,"13":0.00222,"14":0.00444,"15":0.00444,"16":0.00889,"17":0.02222,"18":0.09332,_:"79 80 81"},P:{"4":1.5644,"5.0-5.4":0.07065,"6.2-6.4":0.30279,"7.2-7.4":1.47356,"8.2":0.13121,"9.2":1.46347,"10.1":1.30198,"11.1":2.16997},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02955,"9":0.00328,"10":0.03612,"11":0.15103,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.03111},R:{_:"0"},M:{"0":0.11667},O:{"0":0.87114},Q:{"1.2":0.01556},S:{"2.5":0},H:{"0":1.24447},L:{"0":72.8337}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MS.js b/website/www/node_modules/caniuse-lite/data/regions/MS.js new file mode 100644 index 000000000000..acc98c4cb835 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00759,"39":0,"40":0,"41":0.04554,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00759,"50":0.01518,"51":0,"52":0.01139,"53":0.04934,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.0038,"61":0,"62":0.02657,"63":0.01139,"64":0,"65":0.01898,"66":0,"67":0.01139,"68":0,"69":0.01518,"70":0.06072,"71":0.36432,"72":0.03036,"73":0.0038,"74":0,"75":0,"76":0.02657,"77":0.03795,"78":0.00759,"79":0.06452,"80":6.2238,"81":0.44022,"83":0.0038,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00759,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00759,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01139,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.01518,"59":0,"60":0,"61":0,"62":0.01139,"63":0.03036,"64":0,"65":0,"66":0,"67":0,"68":0.03795,"69":0,"70":0,"71":0,"72":0,"73":0.01139,"74":0.55787,"75":0.35294,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.01139,"57":0,"58":0.16698,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.32258,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00174,"3.2":0.00174,"4.0-4.1":0,"4.2-4.3":0.00349,"5.0-5.1":0.01744,"6.0-6.1":0.00523,"7.0-7.1":0.01744,"8.1-8.4":0.02442,"9.0-9.2":0.02093,"9.3":0.25115,"10.0-10.2":0.06453,"10.3":0.2215,"11.0-11.2":0.14301,"11.3-11.4":0.24243,"12.0-12.1":0.29998,"12.2-12.4":1.96557,"13.0-13.1":0.41858,"13.2":0.20406,"13.3":11.42717,"13.4":2.11731},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.06072,"13":1.02465,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.0038,"7.1":0,"9.1":0.00759,"10.1":0.00759,"11.1":0.02657,"12.1":0.21252,"13.1":0.15939},I:{"3":0.00294,"4":0.02643,_:"81","2.1":0,"2.2":0.00881,"2.3":0.00294,"4.1":0.05873,"4.2-4.3":0.12333,"4.4":0,"4.4.3-4.4.4":0.84865},B:{"12":0.0038,"13":0.01139,"14":0.01518,"15":0.01139,"16":0.01139,"17":0.03795,"18":0.66792,_:"79 80 81"},P:{"4":1.01655,"5.0-5.4":0.02118,"6.2-6.4":0.04236,"7.2-7.4":0.88948,"8.2":0.03177,"9.2":0.0953,"10.1":0.36003,"11.1":3.2085},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01856,"9":0,"10":0,"11":0.26606,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.05585},O:{"0":0.02482},Q:{"1.2":0.01862},S:{"2.5":0},H:{"0":0.84005},L:{"0":60.58854}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MT.js b/website/www/node_modules/caniuse-lite/data/regions/MT.js new file mode 100644 index 000000000000..f73570ec338b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00583,"37":0,"38":0.00583,"39":0,"40":0,"41":0.01166,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00583,"48":0,"49":0.62392,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00583,"57":0.00583,"58":0.00583,"59":0.01166,"60":0,"61":0.22741,"62":0.00583,"63":0.00583,"64":0.00583,"65":0.01166,"66":0.00583,"67":0.03499,"68":0.00583,"69":0.15161,"70":0.01749,"71":0.01166,"72":0.01166,"73":0.01166,"74":0.01749,"75":0.03499,"76":0.05248,"77":0.03499,"78":0.06997,"79":0.11079,"80":15.37635,"81":7.77855,"83":0.01166,"84":0.01166,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00583,"49":0,"50":0,"51":0,"52":0.01749,"53":0,"54":0,"55":0,"56":0.04665,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00583,"63":0,"64":0.00583,"65":0.00583,"66":0.00583,"67":0.00583,"68":0.0933,"69":0.00583,"70":0.00583,"71":0,"72":0.01166,"73":0.01166,"74":0.47231,"75":0.78135,"76":0.00583,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00583,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.01166,"57":0,"58":0,"60":0,"62":0.01749,"63":0.01166,"64":0,"65":0,"66":0,"67":0.46648,"68":0.01749,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00167,"3.2":0.00167,"4.0-4.1":0,"4.2-4.3":0.00333,"5.0-5.1":0.01665,"6.0-6.1":0.005,"7.0-7.1":0.01665,"8.1-8.4":0.02331,"9.0-9.2":0.01998,"9.3":0.23979,"10.0-10.2":0.06161,"10.3":0.21148,"11.0-11.2":0.13655,"11.3-11.4":0.23146,"12.0-12.1":0.28641,"12.2-12.4":1.87667,"13.0-13.1":0.39965,"13.2":0.19483,"13.3":10.91035,"13.4":2.02155},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00583,"11":0.01166,"12":0.04665,"13":1.84843,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.01166,"7.1":0,"9.1":0.01166,"10.1":0.04665,"11.1":0.13411,"12.1":0.25073,"13.1":0.92713},I:{"3":0.00136,"4":0.01222,_:"81","2.1":0,"2.2":0.00407,"2.3":0.00136,"4.1":0.02717,"4.2-4.3":0.05705,"4.4":0,"4.4.3-4.4.4":0.39255},B:{"12":0.00583,"13":0.01166,"14":0.01749,"15":0.01749,"16":0.02332,"17":0.0933,"18":1.49857,_:"79 80 81"},P:{"4":0.12516,"5.0-5.4":0,"6.2-6.4":0.01043,"7.2-7.4":0.03129,"8.2":0.01043,"9.2":0.05215,"10.1":0.16688,"11.1":2.45108},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.62392,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.09172},O:{"0":0.13758},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.14209},L:{"0":44.85516}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MU.js b/website/www/node_modules/caniuse-lite/data/regions/MU.js new file mode 100644 index 000000000000..e7336eee5461 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00428,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00855,"32":0,"33":0,"34":0.00428,"35":0,"36":0.00428,"37":0,"38":0.04277,"39":0.00428,"40":0.00855,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00428,"47":0.00428,"48":0,"49":0.05988,"50":0.00428,"51":0.03422,"52":0,"53":0.02139,"54":0,"55":0.00855,"56":0.00428,"57":0.00428,"58":0.00855,"59":0,"60":0.00428,"61":0.00428,"62":0.00428,"63":0.01711,"64":0.00428,"65":0.01283,"66":0.00428,"67":0.00855,"68":0.00855,"69":0.01283,"70":0.01711,"71":0.04277,"72":0.00855,"73":0.01283,"74":0.02566,"75":0.02139,"76":0.02566,"77":0.03422,"78":0.05132,"79":0.09409,"80":7.19391,"81":3.65256,"83":0.02566,"84":0.00428,_:"85"},C:{"2":0,"3":0,"4":0.00428,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00428,"48":0.00428,"49":0,"50":0,"51":0,"52":0.02566,"53":0,"54":0,"55":0,"56":0.00855,"57":0.00428,"58":0,"59":0,"60":0.00428,"61":0,"62":0,"63":0,"64":0.11976,"65":0.00428,"66":0.01283,"67":0,"68":0.12831,"69":0.01283,"70":0.01711,"71":0.00428,"72":0.01283,"73":0.00855,"74":0.43198,"75":0.77414,"76":0.03422,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00428,"46":0.00428,"47":0.01283,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.04277,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00428,"67":0.40204,"68":0.00855,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00077,"3.2":0.00077,"4.0-4.1":0,"4.2-4.3":0.00153,"5.0-5.1":0.00767,"6.0-6.1":0.0023,"7.0-7.1":0.00767,"8.1-8.4":0.01074,"9.0-9.2":0.00921,"9.3":0.11049,"10.0-10.2":0.02839,"10.3":0.09745,"11.0-11.2":0.06292,"11.3-11.4":0.10665,"12.0-12.1":0.13197,"12.2-12.4":0.86473,"13.0-13.1":0.18415,"13.2":0.08977,"13.3":5.02725,"13.4":0.93148},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00428,"9":0,"10":0.00428,"11":0.01711,"12":0.04277,"13":0.59878,_:"0","3.1":0,"3.2":0,"5.1":0.07271,"6.1":0,"7.1":0,"9.1":0.00855,"10.1":0.03849,"11.1":0.20957,"12.1":0.21385,"13.1":0.62444},I:{"3":0.00103,"4":0.00926,_:"81","2.1":0,"2.2":0.00309,"2.3":0.00103,"4.1":0.02058,"4.2-4.3":0.04323,"4.4":0,"4.4.3-4.4.4":0.29744},B:{"12":0.00855,"13":0.02139,"14":0.01283,"15":0.00855,"16":0.02994,"17":0.06416,"18":0.7998,_:"79 80 81"},P:{"4":0.31981,"5.0-5.4":0.01032,"6.2-6.4":0.04127,"7.2-7.4":0.29918,"8.2":0.03095,"9.2":0.39203,"10.1":0.48488,"11.1":4.64246},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00434,"9":0,"10":0.00434,"11":1.24449,"5.5":0},N:{"10":0,"11":0.04578},J:{"7":0,"10":0.00572},R:{_:"0"},M:{"0":0.22892},O:{"0":1.08165},Q:{"1.2":0.00572},S:{"2.5":0},H:{"0":0.48222},L:{"0":62.34229}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MV.js b/website/www/node_modules/caniuse-lite/data/regions/MV.js new file mode 100644 index 000000000000..5c8c85f56678 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MV.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00873,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00437,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00437,"48":0,"49":0.02619,"50":0,"51":0,"52":0,"53":0,"54":0.00437,"55":0.00437,"56":0.0131,"57":0.00437,"58":0.00873,"59":0,"60":0,"61":0.00437,"62":0.00437,"63":0.0131,"64":0.00873,"65":0.02183,"66":0,"67":0.00437,"68":0.00437,"69":0.05675,"70":0.01746,"71":0.00873,"72":0.05238,"73":0.14841,"74":0.15278,"75":0.02183,"76":0.06984,"77":0.06111,"78":0.03492,"79":0.17897,"80":9.31928,"81":3.56184,"83":0.01746,"84":0.00437,_:"85"},C:{"2":0,"3":0,"4":0.00437,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0131,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00873,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00437,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00437,"51":0,"52":0.00437,"53":0,"54":0,"55":0,"56":0.00437,"57":0.00437,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.0131,"68":0.20516,"69":0.00873,"70":0.0131,"71":0.01746,"72":0.07421,"73":0.0131,"74":0.91665,"75":0.75515,"76":0.09603,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00437,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00437,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00437,"54":0,"55":0,"56":0,"57":0.00437,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.15278,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00188,"3.2":0.00188,"4.0-4.1":0,"4.2-4.3":0.00376,"5.0-5.1":0.01881,"6.0-6.1":0.00564,"7.0-7.1":0.01881,"8.1-8.4":0.02634,"9.0-9.2":0.02258,"9.3":0.27093,"10.0-10.2":0.06961,"10.3":0.23894,"11.0-11.2":0.15428,"11.3-11.4":0.26152,"12.0-12.1":0.32361,"12.2-12.4":2.12038,"13.0-13.1":0.45155,"13.2":0.22013,"13.3":12.3272,"13.4":2.28407},E:{"4":0.00437,"5":0,"6":0,"7":0,"8":0,"9":0.00437,"10":0.00437,"11":0.00437,"12":0.03929,"13":0.45396,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00437,"10.1":0.00437,"11.1":0.02619,"12.1":0.11786,"13.1":0.39285},I:{"3":0.00106,"4":0.0095,_:"81","2.1":0,"2.2":0.00317,"2.3":0.00106,"4.1":0.0211,"4.2-4.3":0.04431,"4.4":0,"4.4.3-4.4.4":0.3049},B:{"12":0.00873,"13":0.00437,"14":0.00437,"15":0.00873,"16":0.00873,"17":0.06548,"18":0.41904,_:"79 80 81"},P:{"4":0.11725,"5.0-5.4":0,"6.2-6.4":0.02132,"7.2-7.4":0.08527,"8.2":0.07462,"9.2":0.13857,"10.1":0.25582,"11.1":1.47098},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.04043,"9":0.01011,"10":0.01516,"11":0.12636,"5.5":0},N:{"10":0,"11":0.03381},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24794},O:{"0":2.29345},Q:{"1.2":0.05635},S:{"2.5":0},H:{"0":0.44813},L:{"0":55.15867}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MW.js b/website/www/node_modules/caniuse-lite/data/regions/MW.js new file mode 100644 index 000000000000..8733a1f392bf --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00348,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00348,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00348,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00348,"39":0,"40":0.00696,"41":0,"42":0,"43":0.01044,"44":0,"45":0,"46":0.01392,"47":0,"48":0.00348,"49":0.02436,"50":0.00348,"51":0.00348,"52":0,"53":0.00348,"54":0,"55":0.02088,"56":0.00348,"57":0.00348,"58":0.01044,"59":0,"60":0.01044,"61":0.00696,"62":0.00348,"63":0.04176,"64":0.0174,"65":0.00696,"66":0.01392,"67":0.0174,"68":0.00696,"69":0.02784,"70":0.0174,"71":0.0174,"72":0.02088,"73":0.04872,"74":0.0348,"75":0.0348,"76":0.03828,"77":0.02784,"78":0.04176,"79":0.10092,"80":3.2016,"81":2.12628,"83":0.00696,"84":0.00348,_:"85"},C:{"2":0,"3":0.00348,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00348,"15":0,"16":0,"17":0,"18":0.00696,"19":0,"20":0,"21":0,"22":0,"23":0.00348,"24":0,"25":0.00348,"26":0,"27":0,"28":0,"29":0.00696,"30":0.00348,"31":0,"32":0,"33":0,"34":0.00348,"35":0.00348,"36":0,"37":0,"38":0.00348,"39":0,"40":0.00348,"41":0.00348,"42":0.00348,"43":0.00696,"44":0.00348,"45":0.00696,"46":0.00348,"47":0.0522,"48":0.00348,"49":0.00348,"50":0.00348,"51":0,"52":0.01392,"53":0,"54":0.00348,"55":0,"56":0.00696,"57":0.00348,"58":0,"59":0.00696,"60":0.00348,"61":0.03132,"62":0.00696,"63":0.00348,"64":0.00348,"65":0.01044,"66":0.00696,"67":0.03828,"68":0.09396,"69":0.01392,"70":0.0174,"71":0.00696,"72":0.08004,"73":0.02784,"74":0.4872,"75":0.79692,"76":0.06612,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00348,"21":0,"22":0,"23":0.01044,"24":0,"25":0,"26":0,"27":0,"28":0.00348,"29":0.00348,"30":0.00348,"31":0,"32":0.00348,"33":0,"34":0.02088,"35":0.00348,"36":0.00696,"37":0.00348,"38":0.00348,"39":0,"40":0.00348,"41":0,"42":0.0174,"43":0,"44":0.00348,"45":0.00348,"46":0.02436,"47":0.0348,"48":0.00348,"49":0,"50":0,"51":0.00348,"52":0,"53":0.00696,"54":0.00348,"55":0,"56":0.00348,"57":0.00696,"58":0.00348,"60":0,"62":0,"63":0.00348,"64":0.00348,"65":0.0174,"66":0.01392,"67":0.32364,"68":0.01392,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00348,"12.1":0.05568},G:{"8":0.00055,"3.2":0.00055,"4.0-4.1":0,"4.2-4.3":0.0011,"5.0-5.1":0.00548,"6.0-6.1":0.00164,"7.0-7.1":0.00548,"8.1-8.4":0.00767,"9.0-9.2":0.00657,"9.3":0.0789,"10.0-10.2":0.02027,"10.3":0.06958,"11.0-11.2":0.04493,"11.3-11.4":0.07616,"12.0-12.1":0.09424,"12.2-12.4":0.61748,"13.0-13.1":0.13149,"13.2":0.0641,"13.3":3.58979,"13.4":0.66514},E:{"4":0,"5":0,"6":0,"7":0.00348,"8":0,"9":0,"10":0.02088,"11":0.00348,"12":0.02436,"13":0.1566,_:"0","3.1":0,"3.2":0,"5.1":0.66816,"6.1":0,"7.1":0,"9.1":0.00348,"10.1":0.01044,"11.1":0.02088,"12.1":0.1044,"13.1":0.13572},I:{"3":0.00177,"4":0.01591,_:"81","2.1":0,"2.2":0.0053,"2.3":0.00177,"4.1":0.03536,"4.2-4.3":0.07425,"4.4":0,"4.4.3-4.4.4":0.51089},B:{"12":0.08004,"13":0.03132,"14":0.02088,"15":0.04872,"16":0.12528,"17":0.10092,"18":0.81084,_:"79 80 81"},P:{"4":1.76952,"5.0-5.4":0.60001,"6.2-6.4":0.04068,"7.2-7.4":0.17288,"8.2":0.08136,"9.2":0.25424,"10.1":0.71187,"11.1":1.4746},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02229,"9":0.00371,"10":0.01114,"11":0.29345,"5.5":0},N:{"10":0.01159,"11":0.19705},J:{"7":0,"10":0.37164},R:{_:"0"},M:{"0":0.24776},O:{"0":7.73272},Q:{"1.2":0.22168},S:{"2.5":0},H:{"0":6.26531},L:{"0":54.57992}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MX.js b/website/www/node_modules/caniuse-lite/data/regions/MX.js new file mode 100644 index 000000000000..520bba25fbd2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MX.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00487,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00487,"37":0,"38":0.00973,"39":0,"40":0.00487,"41":0,"42":0,"43":0.00487,"44":0,"45":0,"46":0.00487,"47":0,"48":0,"49":0.15082,"50":0,"51":0.00487,"52":0,"53":0.00973,"54":0,"55":0.00487,"56":0.00487,"57":0,"58":0.00973,"59":0.00487,"60":0.00487,"61":0.00487,"62":0.00487,"63":0.0146,"64":0.00487,"65":0.02919,"66":0.00973,"67":0.03892,"68":0.00487,"69":0.0146,"70":0.02433,"71":0.02919,"72":0.02433,"73":0.03892,"74":0.03892,"75":0.04379,"76":0.03892,"77":0.04379,"78":0.06325,"79":0.13136,"80":10.29434,"81":5.9499,"83":0.00973,"84":0.00487,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00973,"49":0,"50":0,"51":0,"52":0.0146,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00487,"59":0,"60":0.00487,"61":0.00487,"62":0,"63":0,"64":0.00487,"65":0.00487,"66":0.00973,"67":0.00487,"68":0.06325,"69":0.00487,"70":0.00487,"71":0.00487,"72":0.01946,"73":0.0146,"74":0.46704,"75":0.7784,"76":0.00973,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00487,"67":0.46218,"68":0.00973,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00108,"3.2":0.00108,"4.0-4.1":0,"4.2-4.3":0.00217,"5.0-5.1":0.01083,"6.0-6.1":0.00325,"7.0-7.1":0.01083,"8.1-8.4":0.01516,"9.0-9.2":0.01299,"9.3":0.15592,"10.0-10.2":0.04006,"10.3":0.13752,"11.0-11.2":0.08879,"11.3-11.4":0.15051,"12.0-12.1":0.18624,"12.2-12.4":1.22032,"13.0-13.1":0.25987,"13.2":0.12669,"13.3":7.09452,"13.4":1.31452},E:{"4":0,"5":0,"6":0,"7":0,"8":0.08757,"9":0.00487,"10":0.00973,"11":0.02433,"12":0.07784,"13":0.84165,_:"0","3.1":0,"3.2":0,"5.1":0.14595,"6.1":0,"7.1":0,"9.1":0.0146,"10.1":0.05838,"11.1":0.10703,"12.1":0.23839,"13.1":0.76867},I:{"3":0.00061,"4":0.00552,_:"81","2.1":0,"2.2":0.00184,"2.3":0.00061,"4.1":0.01226,"4.2-4.3":0.02575,"4.4":0,"4.4.3-4.4.4":0.17719},B:{"12":0.00487,"13":0.00487,"14":0.00973,"15":0.00973,"16":0.00973,"17":0.04865,"18":0.74921,_:"79 80 81"},P:{"4":0.14431,"5.0-5.4":0.01031,"6.2-6.4":0.01031,"7.2-7.4":0.03092,"8.2":0.01031,"9.2":0.05154,"10.1":0.11339,"11.1":1.0205},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01509,"9":0.01006,"10":0.01006,"11":0.26156,"5.5":0},N:{"10":0,"11":0.03081},J:{"7":0,"10":0.00514},R:{_:"0"},M:{"0":0.1027},O:{"0":0.06162},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.10209},L:{"0":63.34}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MY.js b/website/www/node_modules/caniuse-lite/data/regions/MY.js new file mode 100644 index 000000000000..1ceeb6efb8c4 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00453,"23":0,"24":0,"25":0,"26":0.00453,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01359,"35":0,"36":0.00453,"37":0,"38":0.05436,"39":0,"40":0,"41":0,"42":0.00453,"43":0,"44":0,"45":0,"46":0.00453,"47":0.00453,"48":0,"49":0.10872,"50":0.00453,"51":0.00453,"52":0.00453,"53":0.09513,"54":0.00453,"55":0.04077,"56":0.01359,"57":0.00906,"58":0.02265,"59":0.01359,"60":0.00453,"61":0.00906,"62":0.01359,"63":0.02265,"64":0.00906,"65":0.02265,"66":0.01359,"67":0.03624,"68":0.01812,"69":0.03171,"70":0.0453,"71":0.06342,"72":0.0453,"73":0.15855,"74":0.09513,"75":0.07248,"76":0.05889,"77":0.06342,"78":0.09966,"79":0.14949,"80":9.62172,"81":4.75197,"83":0.01812,"84":0.00906,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00453,"48":0.00906,"49":0,"50":0,"51":0,"52":0.02265,"53":0,"54":0,"55":0,"56":0.00453,"57":0,"58":0,"59":0,"60":0.00906,"61":0.00453,"62":0,"63":0,"64":0.00453,"65":0.00453,"66":0.00453,"67":0.00453,"68":0.06795,"69":0.00453,"70":0.00906,"71":0.00453,"72":0.02718,"73":0.01359,"74":0.46659,"75":0.7701,"76":0.03624,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01359,"37":0.04077,"38":0,"39":0,"40":0.00906,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00453,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00453,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.16761,"68":0.00453,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00155,"3.2":0.00155,"4.0-4.1":0,"4.2-4.3":0.0031,"5.0-5.1":0.01549,"6.0-6.1":0.00465,"7.0-7.1":0.01549,"8.1-8.4":0.02168,"9.0-9.2":0.01858,"9.3":0.223,"10.0-10.2":0.0573,"10.3":0.19667,"11.0-11.2":0.12699,"11.3-11.4":0.21526,"12.0-12.1":0.26636,"12.2-12.4":1.74527,"13.0-13.1":0.37166,"13.2":0.18119,"13.3":10.14642,"13.4":1.88},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00906,"9":0,"10":0.00453,"11":0.00906,"12":0.03624,"13":0.67497,_:"0","3.1":0,"3.2":0,"5.1":0.02265,"6.1":0,"7.1":0,"9.1":0.00453,"10.1":0.03624,"11.1":0.05889,"12.1":0.11778,"13.1":0.34428},I:{"3":0.0005,"4":0.00453,_:"81","2.1":0,"2.2":0.00151,"2.3":0.0005,"4.1":0.01006,"4.2-4.3":0.02113,"4.4":0,"4.4.3-4.4.4":0.14536},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00453,"17":0.02265,"18":0.38052,_:"79 80 81"},P:{"4":0.66092,"5.0-5.4":0.02034,"6.2-6.4":0.04067,"7.2-7.4":0.05084,"8.2":0.04067,"9.2":0.16269,"10.1":0.26437,"11.1":1.28117},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01658,"9":0.00553,"10":0.00553,"11":0.2487,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.12581},O:{"0":1.38391},Q:{"1.2":0.01641},S:{"2.5":0},H:{"0":0.7768},L:{"0":57.36475}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/MZ.js b/website/www/node_modules/caniuse-lite/data/regions/MZ.js new file mode 100644 index 000000000000..c6a2d28917d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/MZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00373,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00373,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.0149,"27":0,"28":0,"29":0,"30":0.00373,"31":0,"32":0,"33":0.02981,"34":0,"35":0.00373,"36":0.0149,"37":0,"38":0,"39":0,"40":0.05589,"41":0,"42":0.00373,"43":0.23101,"44":0,"45":0,"46":0.00745,"47":0,"48":0,"49":0.03353,"50":0.01118,"51":0.00373,"52":0,"53":0,"54":0,"55":0.04471,"56":0.03726,"57":0.00745,"58":0.00745,"59":0,"60":0.01118,"61":0.01118,"62":0,"63":0.04471,"64":0.00373,"65":0.02608,"66":0.00373,"67":0.00745,"68":0.00373,"69":0.02236,"70":0.01118,"71":0.05216,"72":0.02981,"73":0.05589,"74":0.05589,"75":0.02981,"76":0.02608,"77":0.04099,"78":0.04471,"79":0.09688,"80":3.88249,"81":2.25796,"83":0.00745,"84":0.00745,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00373,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00373,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00373,"44":0,"45":0.00373,"46":0,"47":0.00373,"48":0.00373,"49":0,"50":0,"51":0,"52":0.02981,"53":0.00373,"54":0,"55":0,"56":0.00373,"57":0,"58":0,"59":0.00373,"60":0.00373,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00745,"67":0.00373,"68":0.05962,"69":0.00373,"70":0.00745,"71":0.00373,"72":0.01863,"73":0.0149,"74":0.33907,"75":0.63342,"76":0.01863,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00373,"21":0,"22":0,"23":0.00745,"24":0,"25":0,"26":0.00745,"27":0,"28":0.00373,"29":0,"30":0.00373,"31":0,"32":0.00373,"33":0,"34":0,"35":0.00745,"36":0,"37":0.00745,"38":0.00373,"39":0,"40":0,"41":0,"42":0.00373,"43":0,"44":0,"45":0.00373,"46":0.02608,"47":0.04099,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00373,"54":0,"55":0,"56":0.00373,"57":0.01118,"58":0.00373,"60":0,"62":0,"63":0.00373,"64":0.00373,"65":0.02608,"66":0.02981,"67":0.72284,"68":0.02608,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00373,"12.1":0.04471},G:{"8":0.00063,"3.2":0.00063,"4.0-4.1":0,"4.2-4.3":0.00125,"5.0-5.1":0.00627,"6.0-6.1":0.00188,"7.0-7.1":0.00627,"8.1-8.4":0.00878,"9.0-9.2":0.00753,"9.3":0.0903,"10.0-10.2":0.0232,"10.3":0.07964,"11.0-11.2":0.05142,"11.3-11.4":0.08717,"12.0-12.1":0.10786,"12.2-12.4":0.70675,"13.0-13.1":0.15051,"13.2":0.07337,"13.3":4.10883,"13.4":0.76131},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0149,"11":0.0149,"12":0.03726,"13":0.29435,_:"0","3.1":0,"3.2":0,"5.1":0.11551,"6.1":0,"7.1":0,"9.1":0.00745,"10.1":0.01118,"11.1":0.05216,"12.1":0.16022,"13.1":0.32789},I:{"3":0.00133,"4":0.01196,_:"81","2.1":0,"2.2":0.00399,"2.3":0.00133,"4.1":0.02658,"4.2-4.3":0.05582,"4.4":0,"4.4.3-4.4.4":0.38409},B:{"12":0.04844,"13":0.02608,"14":0.0149,"15":0.01118,"16":0.02236,"17":0.11923,"18":0.70421,_:"79 80 81"},P:{"4":1.66637,"5.0-5.4":0.07069,"6.2-6.4":0.0606,"7.2-7.4":0.26258,"8.2":0.08079,"9.2":0.29288,"10.1":0.48476,"11.1":1.04022},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03994,"9":0,"10":0.01498,"11":0.44436,"5.5":0},N:{"10":0.03251,"11":0.0867},J:{"7":0,"10":0.11921},R:{_:"0"},M:{"0":0.10038},O:{"0":0.85326},Q:{"1.2":0.07529},S:{"2.5":0},H:{"0":7.18124},L:{"0":63.48277}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NA.js b/website/www/node_modules/caniuse-lite/data/regions/NA.js new file mode 100644 index 000000000000..d97a4828a76c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00945,"37":0,"38":0.02363,"39":0.00473,"40":0.00945,"41":0.00473,"42":0,"43":0.00473,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0756,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00473,"56":0,"57":0.03308,"58":0.01418,"59":0,"60":0.00473,"61":0,"62":0.00473,"63":0.04725,"64":0.00473,"65":0.0189,"66":0.00945,"67":0.00473,"68":0.00473,"69":0.05198,"70":0.04253,"71":0.01418,"72":0.0189,"73":0.04253,"74":0.03308,"75":0.0378,"76":0.03308,"77":0.03308,"78":0.06143,"79":0.10395,"80":7.13003,"81":3.80363,"83":0.01418,"84":0.00945,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00473,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00945,"46":0,"47":0.00945,"48":0.00473,"49":0,"50":0,"51":0,"52":0.0378,"53":0,"54":0,"55":0,"56":0.00473,"57":0.0189,"58":0,"59":0,"60":0.01418,"61":0,"62":0,"63":0,"64":0.00473,"65":0,"66":0.00473,"67":0.00473,"68":0.20318,"69":0.00473,"70":0.03308,"71":0.00473,"72":0.0189,"73":0.0189,"74":0.65205,"75":1.43168,"76":0.03308,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00473,"47":0.00945,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00473,"54":0,"55":0,"56":0,"57":0.00945,"58":0.00473,"60":0,"62":0,"63":0.00945,"64":0,"65":0.0189,"66":0.02363,"67":1.01115,"68":0.0189,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00945},G:{"8":0.00098,"3.2":0.00098,"4.0-4.1":0,"4.2-4.3":0.00195,"5.0-5.1":0.00976,"6.0-6.1":0.00293,"7.0-7.1":0.00976,"8.1-8.4":0.01366,"9.0-9.2":0.01171,"9.3":0.14049,"10.0-10.2":0.0361,"10.3":0.12391,"11.0-11.2":0.08,"11.3-11.4":0.13561,"12.0-12.1":0.16781,"12.2-12.4":1.09955,"13.0-13.1":0.23415,"13.2":0.11415,"13.3":6.39241,"13.4":1.18443},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00945,"11":0.02363,"12":0.04253,"13":0.63315,_:"0","3.1":0,"3.2":0,"5.1":0.0378,"6.1":0,"7.1":0,"9.1":0.00473,"10.1":0.02363,"11.1":0.06143,"12.1":0.06615,"13.1":0.4725},I:{"3":0.00139,"4":0.01253,_:"81","2.1":0,"2.2":0.00418,"2.3":0.00139,"4.1":0.02785,"4.2-4.3":0.0585,"4.4":0,"4.4.3-4.4.4":0.4025},B:{"12":0.04725,"13":0.02835,"14":0.02363,"15":0.05198,"16":0.04253,"17":0.16065,"18":2.16405,_:"79 80 81"},P:{"4":0.61478,"5.0-5.4":0.03074,"6.2-6.4":0.07172,"7.2-7.4":0.54305,"8.2":0.03074,"9.2":0.30739,"10.1":0.54305,"11.1":3.19683},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0109,"9":0.00545,"10":0.0218,"11":1.06277,"5.5":0},N:{"10":0.01372,"11":0.05486},J:{"7":0,"10":0.01055},R:{_:"0"},M:{"0":0.32178},O:{"0":1.1816},Q:{"1.2":0.01055},S:{"2.5":0},H:{"0":1.55314},L:{"0":56.44165}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NC.js b/website/www/node_modules/caniuse-lite/data/regions/NC.js new file mode 100644 index 000000000000..025f23de2a41 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01805,"37":0,"38":0,"39":0,"40":0.00602,"41":0,"42":0.00602,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.10829,"50":0,"51":0,"52":0,"53":0.00602,"54":0,"55":0.00602,"56":0.01805,"57":0.02406,"58":0.00602,"59":0,"60":0,"61":0,"62":0.00602,"63":0.00602,"64":0,"65":0.12032,"66":0.04813,"67":0.1504,"68":0.01805,"69":0.00602,"70":0.00602,"71":0.01805,"72":0.06016,"73":0.07219,"74":0.08422,"75":0.03008,"76":0.02406,"77":0.22861,"78":0.1504,"79":0.10227,"80":12.03802,"81":5.34221,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00602,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00602,"39":0,"40":0,"41":0,"42":0,"43":0.00602,"44":0,"45":0.06618,"46":0,"47":0,"48":0.06016,"49":0,"50":0,"51":0.00602,"52":0.1865,"53":0,"54":0,"55":0,"56":0.00602,"57":0.00602,"58":0,"59":0,"60":0.12634,"61":0,"62":0,"63":0,"64":0.00602,"65":0,"66":0.00602,"67":0.01203,"68":0.37901,"69":0.00602,"70":0.00602,"71":0.00602,"72":0.08422,"73":0.01805,"74":2.5568,"75":2.74931,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00602,"65":0.01203,"66":0.00602,"67":0.95654,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00199,"3.2":0.00199,"4.0-4.1":0,"4.2-4.3":0.00398,"5.0-5.1":0.01989,"6.0-6.1":0.00597,"7.0-7.1":0.01989,"8.1-8.4":0.02785,"9.0-9.2":0.02387,"9.3":0.28644,"10.0-10.2":0.0736,"10.3":0.25262,"11.0-11.2":0.16311,"11.3-11.4":0.27649,"12.0-12.1":0.34213,"12.2-12.4":2.24177,"13.0-13.1":0.47739,"13.2":0.23273,"13.3":13.03288,"13.4":2.41482},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00602,"10":0.01805,"11":0.00602,"12":0.07219,"13":1.9191,_:"0","3.1":0,"3.2":0,"5.1":0.00602,"6.1":0,"7.1":0,"9.1":0.0361,"10.1":0.06618,"11.1":0.32486,"12.1":0.36096,"13.1":1.60627},I:{"3":0.00137,"4":0.01234,_:"81","2.1":0,"2.2":0.00411,"2.3":0.00137,"4.1":0.02742,"4.2-4.3":0.05759,"4.4":0,"4.4.3-4.4.4":0.39627},B:{"12":0.00602,"13":0.00602,"14":0.01203,"15":0.00602,"16":0.02406,"17":0.15642,"18":1.85293,_:"79 80 81"},P:{"4":0.27739,"5.0-5.4":0,"6.2-6.4":0.01067,"7.2-7.4":0.32007,"8.2":0.01067,"9.2":0.45877,"10.1":0.35208,"11.1":3.60613},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00602,"11":0.6016,"5.5":0},N:{"10":0.01107,"11":0.08853},J:{"7":0,"10":0.00398},R:{_:"0"},M:{"0":0.31474},O:{"0":0.0239},Q:{"1.2":0.00398},S:{"2.5":0},H:{"0":0.03772},L:{"0":37.08224}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NE.js b/website/www/node_modules/caniuse-lite/data/regions/NE.js new file mode 100644 index 000000000000..3c1769b793f7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00288,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00288,"32":0,"33":0,"34":0,"35":0.00288,"36":0.00577,"37":0,"38":0,"39":0,"40":0.00288,"41":0,"42":0,"43":0.00288,"44":0.00288,"45":0,"46":0,"47":0,"48":0,"49":0.0346,"50":0,"51":0,"52":0,"53":0.00288,"54":0,"55":0.02306,"56":0,"57":0,"58":0.05478,"59":0,"60":0,"61":0,"62":0,"63":0.00577,"64":0.00288,"65":0.01153,"66":0.00577,"67":0.00288,"68":0.00288,"69":0.04325,"70":0.01442,"71":0.00288,"72":0.00288,"73":0.00865,"74":0,"75":0,"76":0.20758,"77":0.00288,"78":0.04036,"79":0.09802,"80":1.63178,"81":0.60543,"83":0,"84":0,_:"85"},C:{"2":0,"3":0.00288,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00288,"16":0,"17":0,"18":0.00288,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00865,"32":0.00288,"33":0.00288,"34":0.00288,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00288,"44":0.01153,"45":0,"46":0,"47":0.00865,"48":0.02018,"49":0.00288,"50":0.00577,"51":0,"52":0.02306,"53":0.00577,"54":0,"55":0,"56":0.01442,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00288,"65":0,"66":0.04613,"67":0.00288,"68":0.04613,"69":0,"70":0.00288,"71":0.00865,"72":0.00865,"73":0.00577,"74":0.32866,"75":0.58237,"76":0.01153,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00288,"17":0,"18":0,"19":0,"20":0.00577,"21":0,"22":0.00288,"23":0.04036,"24":0,"25":0,"26":0.00288,"27":0.00288,"28":0.00288,"29":0,"30":0.00577,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00577,"47":0.0173,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00288,"54":0,"55":0,"56":0.01153,"57":0.00577,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.0173,"66":0.00577,"67":0.18451,"68":0.01442,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01442},G:{"8":0.00042,"3.2":0.00042,"4.0-4.1":0,"4.2-4.3":0.00084,"5.0-5.1":0.00418,"6.0-6.1":0.00125,"7.0-7.1":0.00418,"8.1-8.4":0.00585,"9.0-9.2":0.00502,"9.3":0.06021,"10.0-10.2":0.01547,"10.3":0.05311,"11.0-11.2":0.03429,"11.3-11.4":0.05812,"12.0-12.1":0.07192,"12.2-12.4":0.47126,"13.0-13.1":0.10036,"13.2":0.04892,"13.3":2.73976,"13.4":0.50764},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.02595,"10":0.02018,"11":0.00288,"12":0.01442,"13":0.09226,_:"0","3.1":0,"3.2":0,"5.1":0.29407,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00288,"11.1":0.01153,"12.1":0.02018,"13.1":0.1182},I:{"3":0.00797,"4":0.07172,_:"81","2.1":0,"2.2":0.02391,"2.3":0.00797,"4.1":0.15937,"4.2-4.3":0.33468,"4.4":0,"4.4.3-4.4.4":2.30294},B:{"12":0.00865,"13":0.00577,"14":0.01153,"15":0.06054,"16":0.0173,"17":0.09226,"18":0.26812,_:"79 80 81"},P:{"4":0.22382,"5.0-5.4":0.03052,"6.2-6.4":0.02035,"7.2-7.4":0.09156,"8.2":0.05087,"9.2":0.17295,"10.1":0.48834,"11.1":0.50868},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.06318,"9":0,"10":0.06318,"11":2.11661,"5.5":0},N:{"10":0,"11":0.02847},J:{"7":0,"10":0.18504},R:{_:"0"},M:{"0":0.24198},O:{"0":6.56187},Q:{"1.2":0.2918},S:{"2.5":0.01423},H:{"0":3.36896},L:{"0":69.03112}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NF.js b/website/www/node_modules/caniuse-lite/data/regions/NF.js new file mode 100644 index 000000000000..758917cef1d7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.07899,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.44572,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":8.28246,"79":0,"80":9.04977,"81":3.81399,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.20311,"46":0,"47":0.16362,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.93093,"75":0.85194,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.12412,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00381,"3.2":0.00381,"4.0-4.1":0,"4.2-4.3":0.00763,"5.0-5.1":0.03813,"6.0-6.1":0.01144,"7.0-7.1":0.03813,"8.1-8.4":0.05338,"9.0-9.2":0.04575,"9.3":0.54902,"10.0-10.2":0.14107,"10.3":0.48421,"11.0-11.2":0.31264,"11.3-11.4":0.52996,"12.0-12.1":0.65578,"12.2-12.4":4.29687,"13.0-13.1":0.91504,"13.2":0.44608,"13.3":24.98058,"13.4":4.62857},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":1.99163,"13":0.48521,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.24261,"10.1":0.07899,"11.1":0,"12.1":0.12412,"13.1":0},I:{"3":0.00066,"4":0.00598,_:"81","2.1":0,"2.2":0.00199,"2.3":0.00066,"4.1":0.01329,"4.2-4.3":0.02792,"4.4":0,"4.4.3-4.4.4":0.19209},B:{"12":0,"13":0,"14":0,"15":0.60934,"16":0,"17":0,"18":1.25817,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.07346,"11.1":2.26679},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":1.8675,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":25.95456}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NG.js b/website/www/node_modules/caniuse-lite/data/regions/NG.js new file mode 100644 index 000000000000..3ccf96fa3c9b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00241,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00241,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00241,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00723,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01445,"48":0,"49":0.00964,"50":0.00241,"51":0,"52":0,"53":0,"54":0,"55":0.00482,"56":0.00241,"57":0.00241,"58":0.00723,"59":0,"60":0.00241,"61":0.00241,"62":0.00482,"63":0.01927,"64":0.00964,"65":0.00482,"66":0.00241,"67":0.00482,"68":0.00241,"69":0.01445,"70":0.0265,"71":0.02409,"72":0.03132,"73":0.01927,"74":0.02891,"75":0.01686,"76":0.02409,"77":0.03373,"78":0.03373,"79":0.07227,"80":2.00429,"81":1.07682,"83":0.00723,"84":0.00482,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00241,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00241,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.0265,"44":0.00241,"45":0,"46":0,"47":0.00964,"48":0.00241,"49":0.00241,"50":0.00241,"51":0,"52":0.00482,"53":0,"54":0.00241,"55":0.00241,"56":0.00482,"57":0.00241,"58":0,"59":0.00241,"60":0.00241,"61":0.00241,"62":0.00241,"63":0.00482,"64":0.00241,"65":0.00723,"66":0.00482,"67":0.00964,"68":0.08913,"69":0.00482,"70":0.00241,"71":0.00482,"72":0.01686,"73":0.00964,"74":0.2144,"75":0.32762,"76":0.02891,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00241,"17":0,"18":0,"19":0.00241,"20":0.01205,"21":0,"22":0,"23":0.04095,"24":0.13009,"25":0.00723,"26":0.09395,"27":0.19754,"28":0.10118,"29":0.01927,"30":0.11804,"31":0.04095,"32":0.11081,"33":0.053,"34":0.00241,"35":0.01686,"36":0.00482,"37":0.00964,"38":0.08191,"39":0.00482,"40":0,"41":0.00482,"42":0.08672,"43":0.00482,"44":0.01205,"45":0.06986,"46":0.40471,"47":0.59984,"48":0.00964,"49":0.00241,"50":0,"51":0,"52":0,"53":0.01445,"54":0.00482,"55":0.00482,"56":0.00723,"57":0.01445,"58":0.00241,"60":0,"62":0,"63":0.00241,"64":0,"65":0.00723,"66":0.00964,"67":0.18549,"68":0.00482,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.08432},G:{"8":0.00075,"3.2":0.00075,"4.0-4.1":0,"4.2-4.3":0.0015,"5.0-5.1":0.00751,"6.0-6.1":0.00225,"7.0-7.1":0.00751,"8.1-8.4":0.01052,"9.0-9.2":0.00902,"9.3":0.10819,"10.0-10.2":0.0278,"10.3":0.09542,"11.0-11.2":0.06161,"11.3-11.4":0.10443,"12.0-12.1":0.12923,"12.2-12.4":0.84674,"13.0-13.1":0.18032,"13.2":0.0879,"13.3":4.92264,"13.4":0.9121},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00241,"9":0,"10":0,"11":0.00482,"12":0.01205,"13":0.08191,_:"0","3.1":0,"3.2":0,"5.1":0.10841,"6.1":0,"7.1":0,"9.1":0.00241,"10.1":0.00482,"11.1":0.01205,"12.1":0.0265,"13.1":0.04577},I:{"3":0.00078,"4":0.007,_:"81","2.1":0,"2.2":0.00233,"2.3":0.00078,"4.1":0.01555,"4.2-4.3":0.03265,"4.4":0,"4.4.3-4.4.4":0.22465},B:{"12":0.00964,"13":0.00482,"14":0.00482,"15":0.00964,"16":0.00723,"17":0.01927,"18":0.13009,_:"79 80 81"},P:{"4":0.12285,"5.0-5.4":0.03071,"6.2-6.4":0.03071,"7.2-7.4":0.09214,"8.2":0.02048,"9.2":0.25595,"10.1":0.35833,"11.1":0.64499},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02313,"9":0.00385,"10":0.01156,"11":0.05782,"5.5":0},N:{"10":0.01139,"11":0.05693},J:{"7":0,"10":0.07591},R:{_:"0"},M:{"0":0.4251},O:{"0":3.65127},Q:{"1.2":0.04555},S:{"2.5":0.02277},H:{"0":19.49743},L:{"0":53.92093}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NI.js b/website/www/node_modules/caniuse-lite/data/regions/NI.js new file mode 100644 index 000000000000..247babb16650 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.02349,"39":0,"40":0.00587,"41":0.00587,"42":0.01762,"43":0.00587,"44":0,"45":0,"46":0,"47":0,"48":0.00587,"49":0.25254,"50":0,"51":0,"52":0,"53":0.04698,"54":0,"55":0.00587,"56":0.01175,"57":0,"58":0.00587,"59":0,"60":0.00587,"61":0,"62":0,"63":0.02937,"64":0.00587,"65":0.00587,"66":0.01175,"67":0.01175,"68":0.02349,"69":0.02349,"70":0.04111,"71":0.09397,"72":0.03524,"73":0.09397,"74":0.08222,"75":0.0881,"76":0.11746,"77":0.0646,"78":0.10571,"79":0.21143,"80":15.52821,"81":9.29109,"83":0.00587,"84":0.01175,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00587,"44":0,"45":0,"46":0,"47":0.00587,"48":0.02937,"49":0.00587,"50":0,"51":0.00587,"52":0.01175,"53":0,"54":0,"55":0,"56":0.01175,"57":0,"58":0.00587,"59":0,"60":0.00587,"61":0.00587,"62":0.00587,"63":0,"64":0,"65":0.01175,"66":0,"67":0.00587,"68":0.0881,"69":0.01175,"70":0.01175,"71":0.00587,"72":0.05873,"73":0.0646,"74":0.64603,"75":1.15698,"76":0.01175,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00587,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00587,"30":0,"31":0,"32":0.00587,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00587,"47":0.00587,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00587,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00587,"64":0,"65":0,"66":0.00587,"67":0.77524,"68":0.01175,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00065,"3.2":0.00065,"4.0-4.1":0,"4.2-4.3":0.0013,"5.0-5.1":0.00648,"6.0-6.1":0.00194,"7.0-7.1":0.00648,"8.1-8.4":0.00907,"9.0-9.2":0.00777,"9.3":0.09325,"10.0-10.2":0.02396,"10.3":0.08224,"11.0-11.2":0.0531,"11.3-11.4":0.09001,"12.0-12.1":0.11138,"12.2-12.4":0.72977,"13.0-13.1":0.15541,"13.2":0.07576,"13.3":4.24265,"13.4":0.78611},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00587,"10":0,"11":0.01175,"12":0.05286,"13":0.55794,_:"0","3.1":0,"3.2":0,"5.1":1.00428,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01762,"11.1":0.05286,"12.1":0.1527,"13.1":0.48746},I:{"3":0.00129,"4":0.01163,_:"81","2.1":0,"2.2":0.00388,"2.3":0.00129,"4.1":0.02585,"4.2-4.3":0.05428,"4.4":0,"4.4.3-4.4.4":0.37352},B:{"12":0.00587,"13":0.00587,"14":0.01762,"15":0.01175,"16":0.01762,"17":0.02937,"18":0.41698,_:"79 80 81"},P:{"4":0.38692,"5.0-5.4":0.05091,"6.2-6.4":0.06109,"7.2-7.4":0.19346,"8.2":0.05091,"9.2":0.35637,"10.1":0.43783,"11.1":2.49459},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00612,"9":0,"10":0.00612,"11":0.13459,"5.5":0},N:{"10":0,"11":0.04127},J:{"7":0,"10":0.00413},R:{_:"0"},M:{"0":0.11968},O:{"0":0.26},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.23834},L:{"0":52.78166}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NL.js b/website/www/node_modules/caniuse-lite/data/regions/NL.js new file mode 100644 index 000000000000..515e04484728 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0055,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0055,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0055,"47":0,"48":0.01099,"49":0.23087,"50":0,"51":0.0055,"52":0,"53":0.0055,"54":0,"55":0.0055,"56":0.0055,"57":0.0055,"58":0.0055,"59":0.01099,"60":0.01099,"61":0.01099,"62":0.0055,"63":0.01649,"64":0.01099,"65":0.01649,"66":0.01649,"67":0.02199,"68":0.01649,"69":0.04947,"70":0.10444,"71":0.07696,"72":0.07146,"73":0.06596,"74":0.03298,"75":0.05497,"76":0.07696,"77":0.05497,"78":0.08246,"79":0.25286,"80":11.34031,"81":5.42004,"83":0.01099,"84":0.0055,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.0055,"49":0.0055,"50":0.0055,"51":0,"52":0.02749,"53":0,"54":0,"55":0,"56":0.01099,"57":0.0055,"58":0.01099,"59":0.0055,"60":0.01099,"61":0,"62":0.01099,"63":0.0055,"64":0.0055,"65":0.01099,"66":0.01099,"67":0.0055,"68":0.1924,"69":0.0055,"70":0.0055,"71":0.01099,"72":0.03298,"73":0.02749,"74":0.7366,"75":1.21484,"76":0.01099,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0055,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0055,"57":0.0055,"58":0.01099,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.0055,"67":0.35181,"68":0.0055,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00283,"3.2":0.00283,"4.0-4.1":0,"4.2-4.3":0.00566,"5.0-5.1":0.02831,"6.0-6.1":0.00849,"7.0-7.1":0.02831,"8.1-8.4":0.03964,"9.0-9.2":0.03398,"9.3":0.40773,"10.0-10.2":0.10476,"10.3":0.3596,"11.0-11.2":0.23218,"11.3-11.4":0.39357,"12.0-12.1":0.48701,"12.2-12.4":3.19106,"13.0-13.1":0.67955,"13.2":0.33128,"13.3":18.55177,"13.4":3.4374},E:{"4":0.0055,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0055,"11":0.01649,"12":0.06596,"13":2.28126,_:"0","3.1":0,"3.2":0,"5.1":0.0055,"6.1":0,"7.1":0,"9.1":0.0055,"10.1":0.04398,"11.1":0.12093,"12.1":0.24187,"13.1":1.38524},I:{"3":0.0007,"4":0.00629,_:"81","2.1":0,"2.2":0.0021,"2.3":0.0007,"4.1":0.01397,"4.2-4.3":0.02934,"4.4":0,"4.4.3-4.4.4":0.20188},B:{"12":0,"13":0.0055,"14":0.0055,"15":0.01099,"16":0.01099,"17":0.07146,"18":2.05038,_:"79 80 81"},P:{"4":0.07328,"5.0-5.4":0.01047,"6.2-6.4":0,"7.2-7.4":0.04188,"8.2":0.01047,"9.2":0.1361,"10.1":0.3036,"11.1":5.19256},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00666,"7":0.00666,"8":0.04665,"9":0.01999,"10":0.01999,"11":1.09289,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.0045},R:{_:"0"},M:{"0":0.28819},O:{"0":0.35123},Q:{"1.2":0.01801},S:{"2.5":0},H:{"0":0.18758},L:{"0":32.09078}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NO.js b/website/www/node_modules/caniuse-lite/data/regions/NO.js new file mode 100644 index 000000000000..ebb0eab1d17a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01114,"39":0,"40":0.01671,"41":0.02228,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.10585,"50":0,"51":0.00557,"52":0,"53":0.00557,"54":0,"55":0,"56":0.09471,"57":0.00557,"58":0.00557,"59":0.02228,"60":0.00557,"61":0.01114,"62":0.00557,"63":0.01671,"64":0.00557,"65":0.01671,"66":0.07242,"67":0.039,"68":0.01671,"69":0.10028,"70":0.039,"71":0.03343,"72":0.03343,"73":0.04457,"74":0.01671,"75":0.039,"76":0.07242,"77":0.08357,"78":0.12256,"79":0.53482,"80":11.65453,"81":5.48744,"83":0.01671,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01114,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01114,"49":0,"50":0.00557,"51":0,"52":0.01671,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.02228,"59":0.01671,"60":0.00557,"61":0,"62":0,"63":0.01114,"64":0.01114,"65":0.01114,"66":0.00557,"67":0.00557,"68":0.13928,"69":0.00557,"70":0.00557,"71":0.01114,"72":0.02786,"73":0.03343,"74":0.72423,"75":1.35375,"76":0.00557,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00557,"67":0.60724,"68":0.00557,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00375,"3.2":0.00375,"4.0-4.1":0,"4.2-4.3":0.00751,"5.0-5.1":0.03755,"6.0-6.1":0.01126,"7.0-7.1":0.03755,"8.1-8.4":0.05257,"9.0-9.2":0.04506,"9.3":0.54071,"10.0-10.2":0.13893,"10.3":0.47688,"11.0-11.2":0.3079,"11.3-11.4":0.52194,"12.0-12.1":0.64585,"12.2-12.4":4.23181,"13.0-13.1":0.90118,"13.2":0.43933,"13.3":24.60233,"13.4":4.55849},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00557,"9":0,"10":0.00557,"11":0.02228,"12":0.07242,"13":2.84121,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01671,"10.1":0.07242,"11.1":0.15599,"12.1":0.30641,"13.1":1.22562},I:{"3":0.00071,"4":0.00638,_:"81","2.1":0,"2.2":0.00213,"2.3":0.00071,"4.1":0.01418,"4.2-4.3":0.02977,"4.4":0,"4.4.3-4.4.4":0.20485},B:{"12":0,"13":0.00557,"14":0.01114,"15":0.01671,"16":0.02228,"17":0.08914,"18":1.90528,_:"79 80 81"},P:{"4":0.0524,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02096,"8.2":0.01048,"9.2":0.06288,"10.1":0.15721,"11.1":3.61573},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00582,"9":0.00582,"10":0.00582,"11":1.03547,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.23031},O:{"0":0.05315},Q:{"1.2":0.00443},S:{"2.5":0},H:{"0":0.15934},L:{"0":25.39497}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NP.js b/website/www/node_modules/caniuse-lite/data/regions/NP.js new file mode 100644 index 000000000000..30d7ff2a1546 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NP.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00286,"32":0.00286,"33":0.00286,"34":0,"35":0,"36":0.00286,"37":0,"38":0,"39":0,"40":0.00286,"41":0,"42":0,"43":0.00286,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01715,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00286,"59":0,"60":0,"61":0,"62":0,"63":0.00857,"64":0.00286,"65":0.00286,"66":0.00286,"67":0.00572,"68":0.00286,"69":0.00286,"70":0.00572,"71":0.00857,"72":0.00286,"73":0.01143,"74":0.00857,"75":0.01143,"76":0.01143,"77":0.00857,"78":0.02001,"79":0.02858,"80":2.44645,"81":1.45186,"83":0.01715,"84":0.00572,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00286,"48":0,"49":0,"50":0,"51":0,"52":0.01429,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02572,"69":0,"70":0,"71":0,"72":0.00572,"73":0.00572,"74":0.12575,"75":0.27437,"76":0.03144,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00572,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00572,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00286,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.17148,"68":0.00286,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00286},G:{"8":0.00063,"3.2":0.00063,"4.0-4.1":0,"4.2-4.3":0.00126,"5.0-5.1":0.00632,"6.0-6.1":0.0019,"7.0-7.1":0.00632,"8.1-8.4":0.00885,"9.0-9.2":0.00759,"9.3":0.09107,"10.0-10.2":0.0234,"10.3":0.08032,"11.0-11.2":0.05186,"11.3-11.4":0.08791,"12.0-12.1":0.10878,"12.2-12.4":0.71277,"13.0-13.1":0.15179,"13.2":0.074,"13.3":4.14383,"13.4":0.7678},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00286,"12":0.00286,"13":0.04573,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00572,"11.1":0.00572,"12.1":0.01143,"13.1":0.03715},I:{"3":0.00132,"4":0.01187,_:"81","2.1":0,"2.2":0.00396,"2.3":0.00132,"4.1":0.02638,"4.2-4.3":0.0554,"4.4":0,"4.4.3-4.4.4":0.3812},B:{"12":0.00286,"13":0.00286,"14":0.00286,"15":0.00286,"16":0.00286,"17":0.00857,"18":0.09146,_:"79 80 81"},P:{"4":0.38607,"5.0-5.4":0.01016,"6.2-6.4":0.02032,"7.2-7.4":0.13208,"8.2":0.04064,"9.2":0.11176,"10.1":0.25399,"11.1":1.20901},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00286,"9":0,"10":0,"11":0.02001,"5.5":0},N:{"10":0,"11":0.02143},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.05714},O:{"0":1.96405},Q:{"1.2":0.00714},S:{"2.5":0},H:{"0":1.13595},L:{"0":78.26073}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NR.js b/website/www/node_modules/caniuse-lite/data/regions/NR.js new file mode 100644 index 000000000000..5c5d42ffa488 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0091,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00364,"57":0,"58":0,"59":0,"60":0.00182,"61":0,"62":0,"63":0.00182,"64":0,"65":0.00182,"66":0,"67":0,"68":0.0455,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00728,"76":0.00364,"77":0.02366,"78":0.00182,"79":0.12922,"80":0.8827,"81":0.6552,"83":0.00182,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00364,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.02002,"75":0.11284,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00182,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00728,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00728,"46":0,"47":0.0091,"48":0,"49":0.00182,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00364,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00048,"3.2":0.00048,"4.0-4.1":0,"4.2-4.3":0.00097,"5.0-5.1":0.00483,"6.0-6.1":0.00145,"7.0-7.1":0.00483,"8.1-8.4":0.00676,"9.0-9.2":0.00579,"9.3":0.06948,"10.0-10.2":0.01785,"10.3":0.06128,"11.0-11.2":0.03957,"11.3-11.4":0.06707,"12.0-12.1":0.08299,"12.2-12.4":0.5438,"13.0-13.1":0.11581,"13.2":0.05646,"13.3":3.16149,"13.4":0.58578},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.10374,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01456},I:{"3":0.00012,"4":0.0011,_:"81","2.1":0,"2.2":0.00037,"2.3":0.00012,"4.1":0.00244,"4.2-4.3":0.00513,"4.4":0,"4.4.3-4.4.4":0.03528},B:{"12":0,"13":0.01092,"14":0.00364,"15":0,"16":0.01092,"17":0.00364,"18":0.74984,_:"79 80 81"},P:{"4":0.04056,"5.0-5.4":0.13183,"6.2-6.4":0,"7.2-7.4":0.2231,"8.2":0.07099,"9.2":6.40918,"10.1":0.16226,"11.1":0.87213},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.2821,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.03272},O:{"0":7.16568},Q:{"1.2":0.00818},S:{"2.5":0},H:{"0":0.68924},L:{"0":73.30314}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NU.js b/website/www/node_modules/caniuse-lite/data/regions/NU.js new file mode 100644 index 000000000000..99bc59f53d7d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.38056,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":4.90253,"69":0,"70":0.18655,"71":0,"72":0,"73":0,"74":0,"75":0.18655,"76":0,"77":0,"78":0,"79":0.38056,"80":7.91718,"81":7.53662,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":8.85739,"75":11.68549,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00046,"3.2":0.00046,"4.0-4.1":0,"4.2-4.3":0.00091,"5.0-5.1":0.00457,"6.0-6.1":0.00137,"7.0-7.1":0.00457,"8.1-8.4":0.00639,"9.0-9.2":0.00548,"9.3":0.06575,"10.0-10.2":0.01689,"10.3":0.05799,"11.0-11.2":0.03744,"11.3-11.4":0.06347,"12.0-12.1":0.07854,"12.2-12.4":0.51461,"13.0-13.1":0.10959,"13.2":0.05342,"13.3":2.99178,"13.4":0.55434},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.38056,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0},I:{"3":0.00104,"4":0.00938,_:"81","2.1":0,"2.2":0.00313,"2.3":0.00104,"4.1":0.02085,"4.2-4.3":0.04379,"4.4":0,"4.4.3-4.4.4":0.30132},B:{"12":0.56711,"13":0,"14":0,"15":0,"16":0.18655,"17":0.75366,"18":1.32077,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":2.30704,"11.1":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.18655,"9":0,"10":0,"11":8.47683,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":36.21972}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/NZ.js b/website/www/node_modules/caniuse-lite/data/regions/NZ.js new file mode 100644 index 000000000000..2067d60a47c3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/NZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00533,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00533,"35":0,"36":0,"37":0,"38":0.01598,"39":0,"40":0.04262,"41":0,"42":0,"43":0.00533,"44":0,"45":0,"46":0,"47":0.00533,"48":0,"49":0.15448,"50":0.00533,"51":0.00533,"52":0,"53":0.02131,"54":0.01065,"55":0.00533,"56":0.00533,"57":0.02664,"58":0.00533,"59":0.01065,"60":0.00533,"61":0.00533,"62":0.01598,"63":0.02664,"64":0.01065,"65":0.03196,"66":0.01598,"67":0.03729,"68":0.03729,"69":0.06925,"70":0.03196,"71":0.07458,"72":0.04794,"73":0.12785,"74":0.07458,"75":0.09056,"76":0.12252,"77":0.09056,"78":0.17046,"79":0.30364,"80":10.44625,"81":4.96476,"83":0.01598,"84":0.00533,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01065,"49":0,"50":0.00533,"51":0,"52":0.03196,"53":0,"54":0.00533,"55":0,"56":0,"57":0.00533,"58":0.01598,"59":0.01065,"60":0.00533,"61":0,"62":0,"63":0,"64":0,"65":0.02131,"66":0.00533,"67":0.00533,"68":0.20775,"69":0.00533,"70":0.00533,"71":0.00533,"72":0.03729,"73":0.01598,"74":0.64989,"75":1.14531,"76":0.00533,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01065,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00533,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00533,"64":0,"65":0,"66":0.00533,"67":0.19177,"68":0.00533,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00305,"3.2":0.00305,"4.0-4.1":0,"4.2-4.3":0.0061,"5.0-5.1":0.03048,"6.0-6.1":0.00915,"7.0-7.1":0.03048,"8.1-8.4":0.04268,"9.0-9.2":0.03658,"9.3":0.43898,"10.0-10.2":0.11279,"10.3":0.38715,"11.0-11.2":0.24997,"11.3-11.4":0.42373,"12.0-12.1":0.52433,"12.2-12.4":3.4356,"13.0-13.1":0.73163,"13.2":0.35667,"13.3":19.97345,"13.4":3.70082},E:{"4":0,"5":0,"6":0,"7":0.00533,"8":0.00533,"9":0,"10":0.01065,"11":0.02664,"12":0.04794,"13":2.17342,_:"0","3.1":0,"3.2":0,"5.1":0.00533,"6.1":0,"7.1":0,"9.1":0.02664,"10.1":0.06925,"11.1":0.12785,"12.1":0.25037,"13.1":1.07073},I:{"3":0.00144,"4":0.01294,_:"81","2.1":0,"2.2":0.00431,"2.3":0.00144,"4.1":0.02875,"4.2-4.3":0.06038,"4.4":0,"4.4.3-4.4.4":0.4155},B:{"12":0,"13":0.01065,"14":0.01065,"15":0.01598,"16":0.01598,"17":0.07991,"18":1.56081,_:"79 80 81"},P:{"4":0.107,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.0321,"8.2":0.0107,"9.2":0.0642,"10.1":0.214,"11.1":3.00666},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.02901,"10":0,"11":1.12162,"5.5":0},N:{"10":0,"11":0.01402},J:{"7":0,"10":0.00935},R:{_:"0"},M:{"0":0.35982},O:{"0":0.35982},Q:{"1.2":0.12617},S:{"2.5":0},H:{"0":0.16812},L:{"0":35.44197}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/OM.js b/website/www/node_modules/caniuse-lite/data/regions/OM.js new file mode 100644 index 000000000000..3b448ed597f6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/OM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00258,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00258,"34":0.00258,"35":0,"36":0,"37":0,"38":0.00775,"39":0,"40":0,"41":0.00517,"42":0,"43":0.00258,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03358,"50":0,"51":0,"52":0,"53":0.01033,"54":0,"55":0,"56":0.00258,"57":0,"58":0.00258,"59":0,"60":0.00258,"61":0.00258,"62":0.00258,"63":0.01292,"64":0.00258,"65":0.00775,"66":0.00258,"67":0.00517,"68":0.00258,"69":0.00517,"70":0.00775,"71":0.01033,"72":0.00517,"73":0.0155,"74":0.02325,"75":0.00775,"76":0.0155,"77":0.01033,"78":0.01808,"79":0.02841,"80":2.57009,"81":1.46973,"83":0.01292,"84":0.00258,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00258,"49":0,"50":0,"51":0,"52":0.00517,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03875,"69":0,"70":0.00258,"71":0,"72":0.00258,"73":0.00258,"74":0.09557,"75":0.15498,"76":0.00517,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00258,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00258,"46":0.00517,"47":0.01808,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00258,"64":0,"65":0,"66":0,"67":0.09557,"68":0.00258,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00123,"3.2":0.00123,"4.0-4.1":0,"4.2-4.3":0.00247,"5.0-5.1":0.01235,"6.0-6.1":0.0037,"7.0-7.1":0.01235,"8.1-8.4":0.01729,"9.0-9.2":0.01482,"9.3":0.17779,"10.0-10.2":0.04568,"10.3":0.1568,"11.0-11.2":0.10124,"11.3-11.4":0.17162,"12.0-12.1":0.21236,"12.2-12.4":1.39145,"13.0-13.1":0.29632,"13.2":0.14445,"13.3":8.08941,"13.4":1.49886},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00258,"9":0,"10":0.00258,"11":0.0155,"12":0.0155,"13":0.3642,_:"0","3.1":0,"3.2":0,"5.1":0.01033,"6.1":0,"7.1":0,"9.1":0.00775,"10.1":0.02841,"11.1":0.05166,"12.1":0.1059,"13.1":0.31254},I:{"3":0.00057,"4":0.00512,_:"81","2.1":0,"2.2":0.00171,"2.3":0.00057,"4.1":0.01138,"4.2-4.3":0.02391,"4.4":0,"4.4.3-4.4.4":0.16449},B:{"12":0.01033,"13":0.01033,"14":0.01033,"15":0.01033,"16":0.01292,"17":0.04133,"18":0.43653,_:"79 80 81"},P:{"4":0.28475,"5.0-5.4":0.03051,"6.2-6.4":0.04068,"7.2-7.4":0.18305,"8.2":0.1017,"9.2":0.39661,"10.1":0.55933,"11.1":3.96613},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00526,"9":0.00263,"10":0.00526,"11":0.26322,"5.5":0},N:{"10":0,"11":0.01483},J:{"7":0,"10":0.00742},R:{_:"0"},M:{"0":0.089},O:{"0":0.56369},Q:{"1.2":0.11867},S:{"2.5":0},H:{"0":0.42132},L:{"0":72.30286}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PA.js b/website/www/node_modules/caniuse-lite/data/regions/PA.js new file mode 100644 index 000000000000..042745f2bcf6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0.04277,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00535,"37":0,"38":0.02673,"39":0,"40":0.00535,"41":0.00535,"42":0,"43":0,"44":0,"45":0,"46":0.02138,"47":0,"48":0,"49":0.31541,"50":0.01069,"51":0,"52":0,"53":0.02138,"54":0,"55":0.00535,"56":0.02138,"57":0.00535,"58":0.00535,"59":0.00535,"60":0,"61":0.00535,"62":0.01069,"63":0.01069,"64":0.00535,"65":0.02673,"66":0.00535,"67":0.0695,"68":0.01069,"69":0.03208,"70":0.05881,"71":0.03742,"72":0.05881,"73":0.04277,"74":0.04277,"75":0.08554,"76":0.06415,"77":0.04277,"78":0.07484,"79":0.2673,"80":12.78229,"81":5.55984,"83":0.01069,"84":0.00535,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00535,"49":0,"50":0,"51":0,"52":0.01069,"53":0,"54":0,"55":0,"56":0.00535,"57":0.01069,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00535,"65":0,"66":0.06415,"67":0,"68":0.09088,"69":0.00535,"70":0.00535,"71":0.00535,"72":0.02138,"73":0.04277,"74":0.51322,"75":0.69498,"76":0.01069,"77":0,"78":0,"3.5":0.00535,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00535,"58":0,"60":0,"62":0,"63":0.00535,"64":0,"65":0,"66":0.00535,"67":0.34749,"68":0.00535,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00118,"3.2":0.00118,"4.0-4.1":0,"4.2-4.3":0.00236,"5.0-5.1":0.01182,"6.0-6.1":0.00354,"7.0-7.1":0.01182,"8.1-8.4":0.01654,"9.0-9.2":0.01418,"9.3":0.17014,"10.0-10.2":0.04372,"10.3":0.15005,"11.0-11.2":0.09688,"11.3-11.4":0.16423,"12.0-12.1":0.20322,"12.2-12.4":1.33155,"13.0-13.1":0.28356,"13.2":0.13824,"13.3":7.74121,"13.4":1.43434},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00535,"9":0,"10":0.00535,"11":0.03742,"12":0.10692,"13":1.38996,_:"0","3.1":0,"3.2":0,"5.1":0.81794,"6.1":0,"7.1":0,"9.1":0.01604,"10.1":0.12296,"11.1":0.14434,"12.1":0.4651,"13.1":1.30442},I:{"3":0.00065,"4":0.00587,_:"81","2.1":0,"2.2":0.00196,"2.3":0.00065,"4.1":0.01305,"4.2-4.3":0.0274,"4.4":0,"4.4.3-4.4.4":0.18853},B:{"12":0.00535,"13":0.01069,"14":0.00535,"15":0.01069,"16":0.03742,"17":0.05881,"18":0.90347,_:"79 80 81"},P:{"4":0.29768,"5.0-5.4":0.01026,"6.2-6.4":0.03079,"7.2-7.4":0.24636,"8.2":0.03079,"9.2":0.26689,"10.1":0.56457,"11.1":2.94603},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00682,"9":0.00682,"10":0.00682,"11":0.2522,"5.5":0},N:{"10":0,"11":0.01396},J:{"7":0,"10":0.00465},R:{_:"0"},M:{"0":0.26062},O:{"0":0.13497},Q:{"1.2":0.00931},S:{"2.5":0.00931},H:{"0":0.08372},L:{"0":52.53795}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PE.js b/website/www/node_modules/caniuse-lite/data/regions/PE.js new file mode 100644 index 000000000000..f316294dbb00 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01275,"23":0,"24":0,"25":0,"26":0.01275,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01912,"35":0,"36":0.00637,"37":0,"38":0.13383,"39":0,"40":0,"41":0,"42":0.00637,"43":0,"44":0,"45":0,"46":0.00637,"47":0.00637,"48":0.00637,"49":0.21668,"50":0.00637,"51":0.00637,"52":0,"53":0.11471,"54":0,"55":0.00637,"56":0.00637,"57":0.00637,"58":0.01912,"59":0.00637,"60":0.00637,"61":0.03187,"62":0.00637,"63":0.02549,"64":0.00637,"65":0.02549,"66":0.01275,"67":0.02549,"68":0.01912,"69":0.04461,"70":0.05098,"71":0.06373,"72":0.05098,"73":0.0701,"74":0.07648,"75":0.08285,"76":0.07648,"77":0.08922,"78":0.12746,"79":0.22306,"80":20.12593,"81":13.30045,"83":0.01912,"84":0.00637,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01912,"53":0,"54":0,"55":0,"56":0.00637,"57":0,"58":0,"59":0,"60":0.00637,"61":0,"62":0,"63":0.00637,"64":0.00637,"65":0.01275,"66":0.01275,"67":0.00637,"68":0.05736,"69":0.00637,"70":0.00637,"71":0.00637,"72":0.01275,"73":0.01275,"74":0.40787,"75":0.84124,"76":0.01275,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00637,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00637,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00637,"66":0.00637,"67":0.74564,"68":0.01912,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0005,"3.2":0.0005,"4.0-4.1":0,"4.2-4.3":0.00099,"5.0-5.1":0.00497,"6.0-6.1":0.00149,"7.0-7.1":0.00497,"8.1-8.4":0.00696,"9.0-9.2":0.00596,"9.3":0.07155,"10.0-10.2":0.01838,"10.3":0.0631,"11.0-11.2":0.04074,"11.3-11.4":0.06906,"12.0-12.1":0.08546,"12.2-12.4":0.55996,"13.0-13.1":0.11925,"13.2":0.05813,"13.3":3.25543,"13.4":0.60319},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00637,"11":0.01275,"12":0.05098,"13":0.46523,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00637,"10.1":0.03187,"11.1":0.0701,"12.1":0.15933,"13.1":0.52259},I:{"3":0.00058,"4":0.00522,_:"81","2.1":0,"2.2":0.00174,"2.3":0.00058,"4.1":0.0116,"4.2-4.3":0.02437,"4.4":0,"4.4.3-4.4.4":0.16767},B:{"12":0.00637,"13":0.00637,"14":0.00637,"15":0.00637,"16":0.00637,"17":0.02549,"18":0.4015,_:"79 80 81"},P:{"4":0.45658,"5.0-5.4":0.01015,"6.2-6.4":0,"7.2-7.4":0.04058,"8.2":0.01015,"9.2":0.10146,"10.1":0.17248,"11.1":0.76096},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01319,"9":0.00659,"10":0.00659,"11":0.16482,"5.5":0},N:{"10":0,"11":0.03264},J:{"7":0,"10":0.00363},R:{_:"0"},M:{"0":0.08342},O:{"0":0.04715},Q:{"1.2":0.00363},S:{"2.5":0},H:{"0":0.14079},L:{"0":51.83959}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PF.js b/website/www/node_modules/caniuse-lite/data/regions/PF.js new file mode 100644 index 000000000000..e8dcd493c9f0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.16977,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00585,"59":0,"60":0,"61":0,"62":0,"63":0.04683,"64":0.00585,"65":0.07025,"66":0.00585,"67":0.03512,"68":0,"69":0.00585,"70":0.00585,"71":0.01756,"72":0.00585,"73":0.12879,"74":0.03512,"75":0.03512,"76":0.2166,"77":0.01171,"78":0.04683,"79":0.13464,"80":9.54202,"81":5.5613,"83":0,"84":0.00585,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.01171,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00585,"44":0,"45":0.00585,"46":0,"47":0.00585,"48":0.05269,"49":0,"50":0,"51":0,"52":0.07025,"53":0,"54":0,"55":0,"56":0.02342,"57":0.01756,"58":0,"59":0.01756,"60":0.33368,"61":0,"62":0.00585,"63":0,"64":0.01171,"65":0,"66":0.00585,"67":0.01756,"68":0.38051,"69":0.01171,"70":0.01756,"71":0.03512,"72":0.09952,"73":0.02342,"74":1.63912,"75":3.13774,"76":0.00585,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00585,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00585,"64":0,"65":0.00585,"66":0.00585,"67":0.3688,"68":0.01171,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00202,"3.2":0.00202,"4.0-4.1":0,"4.2-4.3":0.00403,"5.0-5.1":0.02017,"6.0-6.1":0.00605,"7.0-7.1":0.02017,"8.1-8.4":0.02823,"9.0-9.2":0.0242,"9.3":0.29038,"10.0-10.2":0.07461,"10.3":0.2561,"11.0-11.2":0.16535,"11.3-11.4":0.2803,"12.0-12.1":0.34684,"12.2-12.4":2.27262,"13.0-13.1":0.48396,"13.2":0.23593,"13.3":13.21224,"13.4":2.44806},E:{"4":0,"5":0,"6":0,"7":0,"8":0.04098,"9":0,"10":0.04683,"11":0.02342,"12":0.22245,"13":2.54064,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.08781,"10.1":0.24587,"11.1":0.74346,"12.1":0.28685,"13.1":1.55131},I:{"3":0.00082,"4":0.00739,_:"81","2.1":0,"2.2":0.00246,"2.3":0.00082,"4.1":0.01641,"4.2-4.3":0.03447,"4.4":0,"4.4.3-4.4.4":0.23715},B:{"12":0.02342,"13":0.00585,"14":0.02342,"15":0.01171,"16":0.01756,"17":0.13464,"18":1.76791,_:"79 80 81"},P:{"4":0.06438,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.1824,"8.2":0.02146,"9.2":0.27897,"10.1":0.49356,"11.1":3.41203},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00585,"10":0.01171,"11":0.49174,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.18657},O:{"0":0.30266},Q:{"1.2":0.0539},S:{"2.5":0},H:{"0":0.10205},L:{"0":39.79732}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PG.js b/website/www/node_modules/caniuse-lite/data/regions/PG.js new file mode 100644 index 000000000000..a187b8c04a1a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00656,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00328,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00656,"35":0,"36":0,"37":0.00328,"38":0.00328,"39":0,"40":0.02624,"41":0,"42":0.01312,"43":0,"44":0.00328,"45":0,"46":0.0164,"47":0,"48":0,"49":0.01968,"50":0.00328,"51":0.00328,"52":0,"53":0.0164,"54":0,"55":0.01312,"56":0.00328,"57":0.00328,"58":0.00984,"59":0.00328,"60":0.00328,"61":0.00328,"62":0.00328,"63":0.01312,"64":0.00328,"65":0.00984,"66":0.00656,"67":0.0164,"68":0.0164,"69":0.01968,"70":0.06232,"71":0.10824,"72":0.01968,"73":0.00984,"74":0.01312,"75":0.03608,"76":0.0164,"77":0.0492,"78":0.04592,"79":0.08528,"80":2.83064,"81":1.63672,"83":0.00328,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00328,"23":0.00328,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.01312,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00328,"39":0,"40":0.00328,"41":0,"42":0.00328,"43":0.00656,"44":0.00328,"45":0.00328,"46":0,"47":0.00984,"48":0.00328,"49":0.00328,"50":0,"51":0,"52":0.00328,"53":0,"54":0,"55":0,"56":0.00328,"57":0.00328,"58":0.00984,"59":0.00328,"60":0.00656,"61":0.00328,"62":0.00656,"63":0.00328,"64":0.00328,"65":0.00328,"66":0.00656,"67":0.02296,"68":0.06888,"69":0.00656,"70":0.00656,"71":0.00328,"72":0.02296,"73":0.01968,"74":0.32144,"75":0.58056,"76":0.02296,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00328,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0492,"38":0,"39":0,"40":0,"41":0.00328,"42":0,"43":0,"44":0,"45":0.00656,"46":0.00328,"47":0.00656,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00328,"54":0,"55":0.00328,"56":0.00656,"57":0.00328,"58":0,"60":0,"62":0,"63":0.00328,"64":0,"65":0.00328,"66":0.00984,"67":0.3936,"68":0.01312,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00328},G:{"8":0.00041,"3.2":0.00041,"4.0-4.1":0,"4.2-4.3":0.00082,"5.0-5.1":0.00411,"6.0-6.1":0.00123,"7.0-7.1":0.00411,"8.1-8.4":0.00575,"9.0-9.2":0.00493,"9.3":0.05912,"10.0-10.2":0.01519,"10.3":0.05214,"11.0-11.2":0.03366,"11.3-11.4":0.05707,"12.0-12.1":0.07061,"12.2-12.4":0.46269,"13.0-13.1":0.09853,"13.2":0.04803,"13.3":2.68991,"13.4":0.49841},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00328,"10":0.00328,"11":0.00328,"12":0.03936,"13":0.16072,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00656,"10.1":0.00328,"11.1":0.05904,"12.1":0.04264,"13.1":0.05904},I:{"3":0.00563,"4":0.05068,_:"81","2.1":0,"2.2":0.01689,"2.3":0.00563,"4.1":0.11262,"4.2-4.3":0.23651,"4.4":0,"4.4.3-4.4.4":1.62739},B:{"12":0.03608,"13":0.09512,"14":0.02624,"15":0.06232,"16":0.05248,"17":0.082,"18":0.72816,_:"79 80 81"},P:{"4":0.58564,"5.0-5.4":0.02055,"6.2-6.4":0.09247,"7.2-7.4":0.38015,"8.2":0.10274,"9.2":1.04799,"10.1":1.25347,"11.1":1.48979},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02537,"9":0.00846,"10":0.01268,"11":0.68493,"5.5":0},N:{"10":0,"11":0.04032},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2352},O:{"0":3.93792},Q:{"1.2":0.88032},S:{"2.5":0.02016},H:{"0":2.35396},L:{"0":67.63176}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PH.js b/website/www/node_modules/caniuse-lite/data/regions/PH.js new file mode 100644 index 000000000000..09d5f2714d43 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00394,"35":0,"36":0.00394,"37":0,"38":0.01181,"39":0,"40":0.00394,"41":0,"42":0.00394,"43":0,"44":0,"45":0,"46":0.00394,"47":0.00394,"48":0,"49":0.09449,"50":0.00394,"51":0.00394,"52":0,"53":0.01575,"54":0,"55":0.00394,"56":0.00394,"57":0.00394,"58":0.01575,"59":0.00394,"60":0.00394,"61":0.00787,"62":0.00394,"63":0.0315,"64":0.00787,"65":0.01575,"66":0.00787,"67":0.01969,"68":0.00787,"69":0.01969,"70":0.02362,"71":0.0315,"72":0.01969,"73":0.0315,"74":0.06693,"75":0.05118,"76":0.05118,"77":0.06693,"78":0.08268,"79":0.1378,"80":7.09447,"81":3.94881,"83":0.02756,"84":0.01181,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00394,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00394,"48":0,"49":0,"50":0,"51":0,"52":0.00787,"53":0,"54":0,"55":0,"56":0.00394,"57":0,"58":0,"59":0,"60":0.00394,"61":0,"62":0,"63":0.00394,"64":0,"65":0.00394,"66":0.00394,"67":0.00394,"68":0.04724,"69":0.00394,"70":0.00394,"71":0.00394,"72":0.02362,"73":0.01575,"74":0.38976,"75":0.59449,"76":0.02362,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00394,"37":0.02362,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00394,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00394,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.20472,"68":0.00394,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00127,"3.2":0.00127,"4.0-4.1":0,"4.2-4.3":0.00254,"5.0-5.1":0.01272,"6.0-6.1":0.00382,"7.0-7.1":0.01272,"8.1-8.4":0.01781,"9.0-9.2":0.01526,"9.3":0.18317,"10.0-10.2":0.04706,"10.3":0.16154,"11.0-11.2":0.1043,"11.3-11.4":0.17681,"12.0-12.1":0.21878,"12.2-12.4":1.43354,"13.0-13.1":0.30528,"13.2":0.14882,"13.3":8.33411,"13.4":1.5442},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00394,"9":0,"10":0.00394,"11":0.00787,"12":0.02756,"13":0.3937,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00787,"10.1":0.01575,"11.1":0.0315,"12.1":0.07874,"13.1":0.20079},I:{"3":0.00123,"4":0.0111,_:"81","2.1":0,"2.2":0.0037,"2.3":0.00123,"4.1":0.02467,"4.2-4.3":0.0518,"4.4":0,"4.4.3-4.4.4":0.35643},B:{"12":0.00394,"13":0.00394,"14":0.00394,"15":0.00394,"16":0.00787,"17":0.01969,"18":0.27165,_:"79 80 81"},P:{"4":0.19709,"5.0-5.4":0.01037,"6.2-6.4":0.02075,"7.2-7.4":0.04149,"8.2":0.03112,"9.2":0.1556,"10.1":0.28008,"11.1":1.45225},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00469,"9":0.00469,"10":0,"11":0.08905,"5.5":0},N:{"10":0,"11":0.01213},J:{"7":0,"10":0.00606},R:{_:"0"},M:{"0":0.09701},O:{"0":0.97008},Q:{"1.2":0.05457},S:{"2.5":0},H:{"0":0.74047},L:{"0":65.67569}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PK.js b/website/www/node_modules/caniuse-lite/data/regions/PK.js new file mode 100644 index 000000000000..5b71b43b25be --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PK.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00277,"30":0,"31":0,"32":0,"33":0.00277,"34":0,"35":0,"36":0.00554,"37":0,"38":0,"39":0,"40":0.00554,"41":0,"42":0.00277,"43":0.01108,"44":0,"45":0,"46":0.00277,"47":0,"48":0.00277,"49":0.06369,"50":0.00277,"51":0,"52":0,"53":0,"54":0.00277,"55":0.00277,"56":0.00277,"57":0.00277,"58":0.00554,"59":0,"60":0.00277,"61":0.00831,"62":0.00277,"63":0.02769,"64":0.00277,"65":0.00554,"66":0.00277,"67":0.00554,"68":0.00554,"69":0.00831,"70":0.02769,"71":0.036,"72":0.03323,"73":0.02492,"74":0.03323,"75":0.01938,"76":0.01938,"77":0.02215,"78":0.036,"79":0.06092,"80":3.43079,"81":1.95491,"83":0.01938,"84":0.01108,_:"85"},C:{"2":0,"3":0,"4":0.01108,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00277,"44":0,"45":0.00277,"46":0,"47":0.00277,"48":0.00277,"49":0,"50":0,"51":0,"52":0.01385,"53":0,"54":0,"55":0,"56":0.00277,"57":0,"58":0,"59":0,"60":0.00277,"61":0,"62":0,"63":0.01108,"64":0.00554,"65":0.00831,"66":0.00831,"67":0,"68":0.02492,"69":0.00277,"70":0.00277,"71":0,"72":0.00831,"73":0.00554,"74":0.13291,"75":0.24921,"76":0.02492,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0.00554,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00277,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01661,"38":0.00277,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00554,"46":0.02492,"47":0.07753,"48":0.00277,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00277,"57":0.00277,"58":0.00277,"60":0,"62":0,"63":0,"64":0,"65":0.00277,"66":0.00277,"67":0.22983,"68":0.00554,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00044,"3.2":0.00044,"4.0-4.1":0,"4.2-4.3":0.00088,"5.0-5.1":0.00442,"6.0-6.1":0.00133,"7.0-7.1":0.00442,"8.1-8.4":0.00619,"9.0-9.2":0.00531,"9.3":0.06368,"10.0-10.2":0.01636,"10.3":0.05616,"11.0-11.2":0.03626,"11.3-11.4":0.06147,"12.0-12.1":0.07606,"12.2-12.4":0.49837,"13.0-13.1":0.10613,"13.2":0.05174,"13.3":2.89735,"13.4":0.53684},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00277,"12":0.00554,"13":0.05538,_:"0","3.1":0,"3.2":0,"5.1":0.04154,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00277,"11.1":0.00554,"12.1":0.01108,"13.1":0.03323},I:{"3":0.00188,"4":0.01694,_:"81","2.1":0,"2.2":0.00565,"2.3":0.00188,"4.1":0.03765,"4.2-4.3":0.07906,"4.4":0,"4.4.3-4.4.4":0.54401},B:{"12":0.00831,"13":0.00277,"14":0.00554,"15":0.00554,"16":0.00554,"17":0.01108,"18":0.09138,_:"79 80 81"},P:{"4":0.48067,"5.0-5.4":0.05114,"6.2-6.4":0.04091,"7.2-7.4":0.09204,"8.2":0.03068,"9.2":0.15341,"10.1":0.30681,"11.1":1.41134},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03115,"9":0.00312,"10":0.00623,"11":0.05919,"5.5":0},N:{"10":0,"11":0.06508},J:{"7":0,"10":0.01446},R:{_:"0"},M:{"0":0.06508},O:{"0":5.92219},Q:{"1.2":0.00723},S:{"2.5":0.02169},H:{"0":1.86207},L:{"0":73.91681}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PL.js b/website/www/node_modules/caniuse-lite/data/regions/PL.js new file mode 100644 index 000000000000..a43adbeb64a6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00452,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00452,"23":0,"24":0,"25":0,"26":0.00452,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00452,"35":0,"36":0,"37":0,"38":0.00452,"39":0,"40":0.00452,"41":0,"42":0.00452,"43":0.00452,"44":0,"45":0,"46":0.00452,"47":0,"48":0,"49":0.21258,"50":0.00452,"51":0,"52":0,"53":0.00452,"54":0,"55":0.00452,"56":0.00452,"57":0.00452,"58":0.01357,"59":0.01809,"60":0.00452,"61":0.00905,"62":0.00452,"63":0.03166,"64":0.00905,"65":0.00452,"66":0.00452,"67":0.00905,"68":0.00905,"69":0.00905,"70":0.01809,"71":0.02262,"72":0.01809,"73":0.02714,"74":0.06332,"75":0.04071,"76":0.03618,"77":0.03166,"78":0.04975,"79":0.14926,"80":7.04231,"81":3.63197,"83":0.00452,"84":0.00452,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00452,"46":0,"47":0.00452,"48":0.00905,"49":0,"50":0.00452,"51":0.00452,"52":0.23067,"53":0.00452,"54":0.00452,"55":0.00452,"56":0.00905,"57":0.00452,"58":0.00452,"59":0.00452,"60":0.01357,"61":0.00452,"62":0.00452,"63":0.00452,"64":0.00452,"65":0.00905,"66":0.01357,"67":0.00905,"68":0.2171,"69":0.01357,"70":0.01357,"71":0.01357,"72":0.05428,"73":0.03618,"74":1.38404,"75":2.41528,"76":0.01357,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00452,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.02714,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00452,"46":0.00905,"47":0.02262,"48":0.00905,"49":0,"50":0,"51":0,"52":0,"53":0.00452,"54":0,"55":0,"56":0.00452,"57":0.00452,"58":0.00452,"60":0,"62":0,"63":0.00452,"64":0,"65":0.00905,"66":0.01809,"67":1.91323,"68":0.03166,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00452},G:{"8":0.00044,"3.2":0.00044,"4.0-4.1":0,"4.2-4.3":0.00087,"5.0-5.1":0.00436,"6.0-6.1":0.00131,"7.0-7.1":0.00436,"8.1-8.4":0.0061,"9.0-9.2":0.00523,"9.3":0.06271,"10.0-10.2":0.01611,"10.3":0.05531,"11.0-11.2":0.03571,"11.3-11.4":0.06054,"12.0-12.1":0.07491,"12.2-12.4":0.49082,"13.0-13.1":0.10452,"13.2":0.05095,"13.3":2.85344,"13.4":0.52871},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00452,"10":0,"11":0.00452,"12":0.01357,"13":0.28043,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00452,"10.1":0.00905,"11.1":0.02714,"12.1":0.04975,"13.1":0.24424},I:{"3":0.00107,"4":0.00965,_:"81","2.1":0,"2.2":0.00322,"2.3":0.00107,"4.1":0.02144,"4.2-4.3":0.04501,"4.4":0,"4.4.3-4.4.4":0.30975},B:{"12":0,"13":0.00452,"14":0.01357,"15":0.03618,"16":0.01357,"17":0.04071,"18":0.8458,_:"79 80 81"},P:{"4":0.27346,"5.0-5.4":0.03038,"6.2-6.4":0.03038,"7.2-7.4":0.10128,"8.2":0.05064,"9.2":0.39499,"10.1":0.47602,"11.1":3.00802},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00905,"9":0.00452,"10":0,"11":0.31209,"5.5":0},N:{"10":0,"11":0.13693},J:{"7":0,"10":0.01095},R:{_:"0"},M:{"0":0.25742},O:{"0":0.03286},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.95409},L:{"0":66.46638}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PM.js b/website/www/node_modules/caniuse-lite/data/regions/PM.js new file mode 100644 index 000000000000..18ba3c2dfd29 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.0305,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.3813,"50":0,"51":0,"52":0,"53":0,"54":0.00763,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00763,"68":0.09151,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.02288,"78":0.02288,"79":0.00763,"80":14.20724,"81":7.36672,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00763,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00763,"48":0.00763,"49":0,"50":0,"51":0.00763,"52":0.01525,"53":0.00763,"54":0,"55":0,"56":0.06101,"57":0,"58":0,"59":0,"60":0.02288,"61":0,"62":0.00763,"63":0,"64":0,"65":0,"66":0.02288,"67":0.00763,"68":0.14489,"69":0.01525,"70":0,"71":0,"72":0.01525,"73":0.01525,"74":2.04377,"75":2.45557,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00763,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.98375,"68":0.00763,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00244,"3.2":0.00244,"4.0-4.1":0,"4.2-4.3":0.00488,"5.0-5.1":0.02439,"6.0-6.1":0.00732,"7.0-7.1":0.02439,"8.1-8.4":0.03415,"9.0-9.2":0.02927,"9.3":0.35121,"10.0-10.2":0.09024,"10.3":0.30974,"11.0-11.2":0.19999,"11.3-11.4":0.33901,"12.0-12.1":0.4195,"12.2-12.4":2.74867,"13.0-13.1":0.58534,"13.2":0.28535,"13.3":15.97987,"13.4":2.96086},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01525,"12":0.01525,"13":3.6071,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01525,"10.1":0.04576,"11.1":0.27454,"12.1":0.06101,"13.1":1.76923},I:{"3":0.0012,"4":0.01078,_:"81","2.1":0,"2.2":0.00359,"2.3":0.0012,"4.1":0.02396,"4.2-4.3":0.05032,"4.4":0,"4.4.3-4.4.4":0.34622},B:{"12":0,"13":0,"14":0,"15":0.00763,"16":0,"17":0.02288,"18":16.62468,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01127,"8.2":0,"9.2":0.0338,"10.1":0.05633,"11.1":0.56332},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00763,"9":0,"10":0,"11":0.22878,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.18755},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.00674},L:{"0":22.16532}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PN.js b/website/www/node_modules/caniuse-lite/data/regions/PN.js new file mode 100644 index 000000000000..64a5d6ce4d72 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":64.287,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":4.284,"76":0,"77":0,"78":0,"79":0,"80":8.568,"81":0,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00043,"3.2":0.00043,"4.0-4.1":0,"4.2-4.3":0.00086,"5.0-5.1":0.00428,"6.0-6.1":0.00128,"7.0-7.1":0.00428,"8.1-8.4":0.006,"9.0-9.2":0.00514,"9.3":0.06166,"10.0-10.2":0.01584,"10.3":0.05439,"11.0-11.2":0.03511,"11.3-11.4":0.05952,"12.0-12.1":0.07366,"12.2-12.4":0.48261,"13.0-13.1":0.10277,"13.2":0.0501,"13.3":2.80575,"13.4":0.51987},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0},I:{"3":0,"4":0,_:"81","2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":18.568}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PR.js b/website/www/node_modules/caniuse-lite/data/regions/PR.js new file mode 100644 index 000000000000..44fbbde0a70e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00227,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00227,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00227,"32":0,"33":0.00453,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.05892,"50":0,"51":0,"52":0,"53":0.00227,"54":0,"55":0,"56":0,"57":0,"58":0.00453,"59":0,"60":0,"61":0.00227,"62":0,"63":0.00227,"64":0,"65":0.00453,"66":0,"67":0.0068,"68":0.00227,"69":0.00453,"70":0.00227,"71":0.00227,"72":0.00227,"73":0.00453,"74":0.00453,"75":0.0068,"76":0.00906,"77":0.0068,"78":0.0068,"79":0.02266,"80":1.80147,"81":0.92453,"83":0.00453,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00453,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01133,"67":0,"68":0.03626,"69":0,"70":0.00227,"71":0,"72":0.0068,"73":0.00906,"74":0.09744,"75":0.16995,"76":0.00227,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00227,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.06118,"68":0.00227,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00328,"3.2":0.00328,"4.0-4.1":0,"4.2-4.3":0.00656,"5.0-5.1":0.03282,"6.0-6.1":0.00985,"7.0-7.1":0.03282,"8.1-8.4":0.04595,"9.0-9.2":0.03939,"9.3":0.47268,"10.0-10.2":0.12145,"10.3":0.41688,"11.0-11.2":0.26916,"11.3-11.4":0.45627,"12.0-12.1":0.56459,"12.2-12.4":3.69937,"13.0-13.1":0.7878,"13.2":0.38405,"13.3":21.50688,"13.4":3.98494},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00227,"9":0,"10":0.00227,"11":0.00453,"12":0.02266,"13":0.38749,_:"0","3.1":0,"3.2":0,"5.1":0.00453,"6.1":0,"7.1":0,"9.1":0.00227,"10.1":0.02493,"11.1":0.02946,"12.1":0.07025,"13.1":0.33084},I:{"3":0.00066,"4":0.00598,_:"81","2.1":0,"2.2":0.00199,"2.3":0.00066,"4.1":0.01328,"4.2-4.3":0.02789,"4.4":0,"4.4.3-4.4.4":0.1919},B:{"12":0.00227,"13":0.00227,"14":0.00453,"15":0.00227,"16":0.00453,"17":0.02039,"18":0.54837,_:"79 80 81"},P:{"4":0.07255,"5.0-5.4":0.01036,"6.2-6.4":0.03109,"7.2-7.4":0.06218,"8.2":0.03109,"9.2":0.23837,"10.1":0.29019,"11.1":2.86047},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0997,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.20108},O:{"0":0.0464},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.10983},L:{"0":56.80711}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PS.js b/website/www/node_modules/caniuse-lite/data/regions/PS.js new file mode 100644 index 000000000000..e09b5e7e6028 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00554,"35":0,"36":0.01107,"37":0,"38":0.01661,"39":0,"40":0,"41":0.00554,"42":0,"43":0.01661,"44":0,"45":0,"46":0.00554,"47":0.00554,"48":0.00554,"49":0.17159,"50":0,"51":0,"52":0,"53":0.02768,"54":0,"55":0,"56":0.03875,"57":0,"58":0.02214,"59":0,"60":0,"61":0.02768,"62":0.00554,"63":0.09963,"64":0.00554,"65":0.02214,"66":0.00554,"67":0.01661,"68":0.07196,"69":0.04982,"70":0.0941,"71":0.32103,"72":0.23247,"73":0.0941,"74":0.06089,"75":0.04982,"76":0.06089,"77":0.07196,"78":0.13284,"79":0.25461,"80":14.54598,"81":8.26376,"83":0.01107,"84":0.00554,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00554,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01661,"53":0,"54":0,"55":0,"56":0.00554,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00554,"65":0,"66":0,"67":0.00554,"68":0.03875,"69":0.00554,"70":0.00554,"71":0.00554,"72":0.01107,"73":0.01107,"74":0.58671,"75":0.95756,"76":0.01661,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00554,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.02768,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00554,"67":1.48892,"68":0.03321,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00081,"3.2":0.00081,"4.0-4.1":0,"4.2-4.3":0.00161,"5.0-5.1":0.00806,"6.0-6.1":0.00242,"7.0-7.1":0.00806,"8.1-8.4":0.01128,"9.0-9.2":0.00967,"9.3":0.11601,"10.0-10.2":0.02981,"10.3":0.10231,"11.0-11.2":0.06606,"11.3-11.4":0.11198,"12.0-12.1":0.13856,"12.2-12.4":0.90791,"13.0-13.1":0.19334,"13.2":0.09426,"13.3":5.27831,"13.4":0.978},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00554,"9":0,"10":0.00554,"11":0.01661,"12":0.03875,"13":0.5369,_:"0","3.1":0,"3.2":0,"5.1":0.00554,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01107,"11.1":0.07749,"12.1":0.21587,"13.1":0.39852},I:{"3":0.00151,"4":0.01355,_:"81","2.1":0,"2.2":0.00452,"2.3":0.00151,"4.1":0.03011,"4.2-4.3":0.06323,"4.4":0,"4.4.3-4.4.4":0.43507},B:{"12":0,"13":0.01661,"14":0.01107,"15":0.00554,"16":0.00554,"17":0.03875,"18":0.48708,_:"79 80 81"},P:{"4":0.13088,"5.0-5.4":0.02013,"6.2-6.4":0.02013,"7.2-7.4":0.09061,"8.2":0.05034,"9.2":0.18121,"10.1":0.32215,"11.1":2.38595},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0344,"9":0,"10":0.00573,"11":0.12039,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.04912},O:{"0":0.06698},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.16486},L:{"0":55.4497}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PT.js b/website/www/node_modules/caniuse-lite/data/regions/PT.js new file mode 100644 index 000000000000..7a8a4cc02f3e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00639,"36":0.01277,"37":0,"38":0.00639,"39":0,"40":0.01277,"41":0,"42":0,"43":0.13411,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.37677,"50":0,"51":0,"52":0,"53":0.01277,"54":0.00639,"55":0,"56":0.00639,"57":0.00639,"58":0.01277,"59":0.01277,"60":0.00639,"61":0.02554,"62":0.01916,"63":0.01916,"64":0.00639,"65":0.03193,"66":0.01277,"67":0.03832,"68":0.01277,"69":0.01277,"70":0.03832,"71":0.06386,"72":0.03832,"73":0.0894,"74":0.03832,"75":0.0447,"76":0.10218,"77":0.0447,"78":0.07025,"79":0.15965,"80":18.04684,"81":10.35171,"83":0.02554,"84":0.01277,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00639,"46":0,"47":0,"48":0.01277,"49":0,"50":0,"51":0,"52":0.05747,"53":0,"54":0,"55":0,"56":0.00639,"57":0,"58":0.01916,"59":0,"60":0.00639,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00639,"67":0.00639,"68":0.12133,"69":0.00639,"70":0.00639,"71":0.00639,"72":0.02554,"73":0.02554,"74":0.9132,"75":1.69868,"76":0.01277,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00639,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00639,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00639,"67":0.78548,"68":0.01277,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0012,"3.2":0.0012,"4.0-4.1":0,"4.2-4.3":0.0024,"5.0-5.1":0.01202,"6.0-6.1":0.00361,"7.0-7.1":0.01202,"8.1-8.4":0.01682,"9.0-9.2":0.01442,"9.3":0.17304,"10.0-10.2":0.04446,"10.3":0.15261,"11.0-11.2":0.09854,"11.3-11.4":0.16703,"12.0-12.1":0.20669,"12.2-12.4":1.3543,"13.0-13.1":0.28841,"13.2":0.1406,"13.3":7.87346,"13.4":1.45885},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00639,"10":0.00639,"11":0.01916,"12":0.08302,"13":1.37299,_:"0","3.1":0,"3.2":0,"5.1":0.00639,"6.1":0,"7.1":0,"9.1":0.01277,"10.1":0.05109,"11.1":0.14049,"12.1":0.24905,"13.1":1.28997},I:{"3":0.00121,"4":0.01085,_:"81","2.1":0,"2.2":0.00362,"2.3":0.00121,"4.1":0.02411,"4.2-4.3":0.05063,"4.4":0,"4.4.3-4.4.4":0.34838},B:{"12":0.00639,"13":0.00639,"14":0.01916,"15":0.01277,"16":0.01916,"17":0.05109,"18":1.46878,_:"79 80 81"},P:{"4":0.03122,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02081,"8.2":0,"9.2":0.05204,"10.1":0.09367,"11.1":1.44663},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01335,"9":0.00667,"10":0.01335,"11":0.70741,"5.5":0},N:{"10":0,"11":0.01084},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.1301},O:{"0":0.27105},Q:{"1.2":0.00723},S:{"2.5":0},H:{"0":0.10265},L:{"0":44.1318}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PW.js b/website/www/node_modules/caniuse-lite/data/regions/PW.js new file mode 100644 index 000000000000..db6cf3ef755d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.02208,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00883,"46":0,"47":0,"48":0.0839,"49":0.02208,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00442,"57":0.00442,"58":0,"59":0,"60":0.01766,"61":0,"62":0.00883,"63":0.00442,"64":0,"65":0.09715,"66":0.01325,"67":0.00442,"68":0.0265,"69":0.00883,"70":0,"71":0.04858,"72":0.01325,"73":0.04416,"74":0.01325,"75":0.09274,"76":0.00883,"77":0.05299,"78":0.04858,"79":0.06182,"80":7.79424,"81":3.3385,"83":0,"84":0.03091,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00883,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00883,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00442,"68":0.06624,"69":0,"70":0.01325,"71":0.00883,"72":0.00442,"73":0,"74":0.09715,"75":0.85229,"76":0.0839,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.03533,"68":0.00442,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00144,"3.2":0.00144,"4.0-4.1":0,"4.2-4.3":0.00288,"5.0-5.1":0.01442,"6.0-6.1":0.00433,"7.0-7.1":0.01442,"8.1-8.4":0.02019,"9.0-9.2":0.01731,"9.3":0.20772,"10.0-10.2":0.05337,"10.3":0.18319,"11.0-11.2":0.11828,"11.3-11.4":0.2005,"12.0-12.1":0.24811,"12.2-12.4":1.62566,"13.0-13.1":0.34619,"13.2":0.16877,"13.3":9.45107,"13.4":1.75116},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01325,"11":0.01325,"12":0.02208,"13":0.60058,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01325,"11.1":0.03974,"12.1":0.07066,"13.1":0.16781},I:{"3":0.00806,"4":0.0725,_:"81","2.1":0,"2.2":0.02417,"2.3":0.00806,"4.1":0.16111,"4.2-4.3":0.33833,"4.4":0,"4.4.3-4.4.4":2.32804},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00883,"18":0.92736,_:"79 80 81"},P:{"4":0.20364,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.29415,"8.2":0.27152,"9.2":0.15839,"10.1":0.2489,"11.1":4.46882},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.07831,"9":0,"10":0,"11":1.09635,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.10051},O:{"0":2.46813},Q:{"1.2":0.05026},S:{"2.5":0},H:{"0":0.03172},L:{"0":54.16514}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/PY.js b/website/www/node_modules/caniuse-lite/data/regions/PY.js new file mode 100644 index 000000000000..66b2bbe9745d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/PY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03436,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00202,"63":0.00202,"64":0,"65":0.00202,"66":0,"67":0.00202,"68":0.00808,"69":0.00202,"70":0.00202,"71":0.02021,"72":0.00404,"73":0.00606,"74":0.00606,"75":0.00606,"76":0.00808,"77":0.00808,"78":0.01819,"79":0.02627,"80":1.67743,"81":1.26515,"83":0.00202,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.01617,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00202,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00202,"48":0,"49":0,"50":0,"51":0,"52":0.01415,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00202,"68":0.01213,"69":0.00202,"70":0,"71":0,"72":0.00404,"73":0.01213,"74":0.08488,"75":0.14955,"76":0.00202,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.06669,"68":0.00202,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00045,"3.2":0.00045,"4.0-4.1":0,"4.2-4.3":0.00089,"5.0-5.1":0.00447,"6.0-6.1":0.00134,"7.0-7.1":0.00447,"8.1-8.4":0.00626,"9.0-9.2":0.00536,"9.3":0.06435,"10.0-10.2":0.01653,"10.3":0.05675,"11.0-11.2":0.03664,"11.3-11.4":0.06212,"12.0-12.1":0.07686,"12.2-12.4":0.50364,"13.0-13.1":0.10725,"13.2":0.05229,"13.3":2.928,"13.4":0.54252},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00606,"13":0.05659,_:"0","3.1":0,"3.2":0,"5.1":0.2506,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00606,"11.1":0.00606,"12.1":0.01617,"13.1":0.05861},I:{"3":0.00072,"4":0.00646,_:"81","2.1":0,"2.2":0.00215,"2.3":0.00072,"4.1":0.01436,"4.2-4.3":0.03016,"4.4":0,"4.4.3-4.4.4":0.20755},B:{"12":0,"13":0,"14":0,"15":0.00202,"16":0,"17":0.00404,"18":0.04648,_:"79 80 81"},P:{"4":0.68166,"5.0-5.4":0.06015,"6.2-6.4":0.07017,"7.2-7.4":0.39095,"8.2":0.09022,"9.2":0.411,"10.1":0.63154,"11.1":2.39585},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00404,"9":0,"10":0,"11":0.01617,"5.5":0},N:{"10":0,"11":0.01596},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.04787},O:{"0":0.04787},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.09065},L:{"0":85.27826}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/QA.js b/website/www/node_modules/caniuse-lite/data/regions/QA.js new file mode 100644 index 000000000000..0778f14bce01 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/QA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00362,"35":0,"36":0,"37":0,"38":0.01448,"39":0,"40":0,"41":0,"42":0,"43":0.00724,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.07962,"50":0,"51":0,"52":0,"53":0.01086,"54":0,"55":0,"56":0.00362,"57":0,"58":0.00724,"59":0,"60":0.00362,"61":0.0579,"62":0.00362,"63":0.00724,"64":0.00362,"65":0.00724,"66":0.00362,"67":0.01448,"68":0.00362,"69":0.01448,"70":0.01448,"71":0.04343,"72":0.0181,"73":0.02895,"74":0.0181,"75":0.0181,"76":0.0181,"77":0.02171,"78":0.08324,"79":0.07238,"80":5.84469,"81":2.98206,"83":0.01086,"84":0.00362,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.02171,"45":0,"46":0,"47":0,"48":0.00362,"49":0,"50":0,"51":0,"52":0.00724,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00362,"61":0,"62":0.02533,"63":0,"64":0.00362,"65":0,"66":0.00724,"67":0,"68":0.03981,"69":0,"70":0.00362,"71":0.02171,"72":0.01086,"73":0.00724,"74":0.18819,"75":0.27866,"76":0.01086,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00362,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00724,"47":0.0181,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00362,"57":0.00362,"58":0.00362,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.18457,"68":0.00362,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00186,"3.2":0.00186,"4.0-4.1":0,"4.2-4.3":0.00373,"5.0-5.1":0.01865,"6.0-6.1":0.00559,"7.0-7.1":0.01865,"8.1-8.4":0.02611,"9.0-9.2":0.02238,"9.3":0.26853,"10.0-10.2":0.069,"10.3":0.23683,"11.0-11.2":0.15291,"11.3-11.4":0.25921,"12.0-12.1":0.32075,"12.2-12.4":2.10164,"13.0-13.1":0.44755,"13.2":0.21818,"13.3":12.21823,"13.4":2.26388},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00362,"9":0,"10":0.00362,"11":0.00724,"12":0.02533,"13":0.61523,_:"0","3.1":0,"3.2":0,"5.1":0.00724,"6.1":0,"7.1":0,"9.1":0.01448,"10.1":0.02171,"11.1":0.05429,"12.1":0.10495,"13.1":0.41619},I:{"3":0.00033,"4":0.00298,_:"81","2.1":0,"2.2":0.00099,"2.3":0.00033,"4.1":0.00662,"4.2-4.3":0.01391,"4.4":0,"4.4.3-4.4.4":0.09569},B:{"12":0.00362,"13":0.00724,"14":0.01086,"15":0.00362,"16":0.00724,"17":0.05429,"18":0.61523,_:"79 80 81"},P:{"4":0.15259,"5.0-5.4":0.01017,"6.2-6.4":0.01017,"7.2-7.4":0.07121,"8.2":0.03052,"9.2":0.18311,"10.1":0.26449,"11.1":2.78729},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01119,"9":0.00373,"10":0.00373,"11":0.35049,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.01914},R:{_:"0"},M:{"0":0.08295},O:{"0":7.16586},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.82763},L:{"0":52.52049}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/RE.js b/website/www/node_modules/caniuse-lite/data/regions/RE.js new file mode 100644 index 000000000000..d64e13390db8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/RE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01612,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0376,"35":0,"36":0.00537,"37":0,"38":0,"39":0,"40":0,"41":0.00537,"42":0,"43":0,"44":0.00537,"45":0,"46":0,"47":0,"48":0.01612,"49":0.24174,"50":0.00537,"51":0,"52":0,"53":0.00537,"54":0.0376,"55":0,"56":0,"57":0,"58":0.00537,"59":0,"60":0,"61":0.02149,"62":0.0376,"63":0.02149,"64":0.00537,"65":0.11281,"66":0.01612,"67":0.02686,"68":0.00537,"69":0.02686,"70":0.01074,"71":0.04298,"72":0.0376,"73":0.01074,"74":0.02149,"75":0.04835,"76":0.04835,"77":0.02686,"78":0.04298,"79":0.27934,"80":8.21916,"81":6.46789,"83":0.00537,"84":0.00537,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00537,"31":0,"32":0.00537,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00537,"39":0,"40":0,"41":0.01074,"42":0,"43":0,"44":0.00537,"45":0.00537,"46":0,"47":0.00537,"48":0.02686,"49":0.04835,"50":0.00537,"51":0,"52":0.06984,"53":0.00537,"54":0.01612,"55":0.03223,"56":0.0376,"57":0.01074,"58":0,"59":0.00537,"60":0.04835,"61":0.01612,"62":0,"63":0,"64":0.00537,"65":0.00537,"66":0.01074,"67":0.09132,"68":0.231,"69":0.01074,"70":0.00537,"71":0.00537,"72":0.11281,"73":0.0376,"74":1.19796,"75":2.37442,"76":0.01612,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.03223,"66":0.00537,"67":0.45662,"68":0.00537,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00163,"3.2":0.00163,"4.0-4.1":0,"4.2-4.3":0.00326,"5.0-5.1":0.01632,"6.0-6.1":0.00489,"7.0-7.1":0.01632,"8.1-8.4":0.02284,"9.0-9.2":0.01958,"9.3":0.23495,"10.0-10.2":0.06037,"10.3":0.20721,"11.0-11.2":0.13379,"11.3-11.4":0.22679,"12.0-12.1":0.28063,"12.2-12.4":1.83881,"13.0-13.1":0.39158,"13.2":0.1909,"13.3":10.6902,"13.4":1.98075},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00537,"11":0.02686,"12":0.06446,"13":1.36449,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0.02149,"9.1":0.01612,"10.1":0.08595,"11.1":0.26323,"12.1":0.3062,"13.1":1.13886},I:{"3":0.00062,"4":0.00555,_:"81","2.1":0,"2.2":0.00185,"2.3":0.00062,"4.1":0.01234,"4.2-4.3":0.02591,"4.4":0,"4.4.3-4.4.4":0.17832},B:{"12":0.00537,"13":0.01074,"14":0.01074,"15":0.05909,"16":0.03223,"17":0.12893,"18":1.89094,_:"79 80 81"},P:{"4":0.10379,"5.0-5.4":0.01038,"6.2-6.4":0.03114,"7.2-7.4":0.20759,"8.2":0.02076,"9.2":0.20759,"10.1":0.46707,"11.1":3.95455},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01612,"9":0.00537,"10":0,"11":0.28472,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.199},O:{"0":0.12496},Q:{"1.2":0.00463},S:{"2.5":0},H:{"0":0.13144},L:{"0":47.87429}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/RO.js b/website/www/node_modules/caniuse-lite/data/regions/RO.js new file mode 100644 index 000000000000..a9f5a4f1a389 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/RO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00477,"35":0,"36":0,"37":0,"38":0.00953,"39":0.00477,"40":0.00477,"41":0.00477,"42":0,"43":0.00477,"44":0,"45":0,"46":0.00477,"47":0,"48":0.00477,"49":0.39081,"50":0.00477,"51":0.00477,"52":0,"53":0.01906,"54":0,"55":0.00477,"56":0.00477,"57":0,"58":0.00953,"59":0.00477,"60":0.06196,"61":0.04766,"62":0.00477,"63":0.0143,"64":0.00953,"65":0.00477,"66":0.0143,"67":0.02383,"68":0.00953,"69":0.04766,"70":0.03813,"71":0.04766,"72":0.04766,"73":0.04766,"74":0.02383,"75":0.03336,"76":0.03336,"77":0.03336,"78":0.05719,"79":0.11438,"80":9.62255,"81":5.34745,"83":0.00953,"84":0.00953,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00953,"45":0.00477,"46":0,"47":0.00477,"48":0.00477,"49":0,"50":0.00477,"51":0,"52":0.08102,"53":0,"54":0,"55":0,"56":0.00953,"57":0.00477,"58":0.00953,"59":0.00477,"60":0.00953,"61":0.00477,"62":0.00477,"63":0.0143,"64":0.00953,"65":0.0143,"66":0.00953,"67":0.00953,"68":0.15251,"69":0.00477,"70":0.00953,"71":0.00953,"72":0.0286,"73":0.0143,"74":0.77209,"75":1.4012,"76":0.0143,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00953,"37":0,"38":0,"39":0,"40":0.00477,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00477,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00477,"58":0,"60":0,"62":0,"63":0.00477,"64":0,"65":0.00477,"66":0.00953,"67":1.16767,"68":0.02383,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00133,"3.2":0.00133,"4.0-4.1":0,"4.2-4.3":0.00267,"5.0-5.1":0.01333,"6.0-6.1":0.004,"7.0-7.1":0.01333,"8.1-8.4":0.01867,"9.0-9.2":0.016,"9.3":0.19201,"10.0-10.2":0.04934,"10.3":0.16935,"11.0-11.2":0.10934,"11.3-11.4":0.18535,"12.0-12.1":0.22935,"12.2-12.4":1.50277,"13.0-13.1":0.32002,"13.2":0.15601,"13.3":8.7366,"13.4":1.61878},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00477,"12":0.0143,"13":0.30979,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00953,"11.1":0.01906,"12.1":0.04289,"13.1":0.24783},I:{"3":0.00083,"4":0.0075,_:"81","2.1":0,"2.2":0.0025,"2.3":0.00083,"4.1":0.01667,"4.2-4.3":0.03502,"4.4":0,"4.4.3-4.4.4":0.24094},B:{"12":0.00477,"13":0.00477,"14":0.00477,"15":0.00953,"16":0.00953,"17":0.03813,"18":0.65294,_:"79 80 81"},P:{"4":0.28542,"5.0-5.4":0.03058,"6.2-6.4":0.03058,"7.2-7.4":0.08155,"8.2":0.03058,"9.2":0.28542,"10.1":0.49949,"11.1":4.00608},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03629,"9":0.00518,"10":0.01037,"11":0.41998,"5.5":0},N:{"10":0,"11":0.02094},J:{"7":0,"10":0.00523},R:{_:"0"},M:{"0":0.246},O:{"0":0.16225},Q:{"1.2":0.00523},S:{"2.5":0},H:{"0":0.31218},L:{"0":55.26466}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/RS.js b/website/www/node_modules/caniuse-lite/data/regions/RS.js new file mode 100644 index 000000000000..ae6be765f247 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/RS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00445,"23":0,"24":0,"25":0,"26":0.00445,"27":0,"28":0,"29":0.00445,"30":0,"31":0.00445,"32":0,"33":0.00445,"34":0.00889,"35":0,"36":0,"37":0,"38":0.00889,"39":0,"40":0,"41":0,"42":0.00445,"43":0.00445,"44":0,"45":0,"46":0,"47":0,"48":0.00445,"49":0.34679,"50":0.00445,"51":0,"52":0.00445,"53":0.01334,"54":0,"55":0.00445,"56":0.00445,"57":0.00445,"58":0.01778,"59":0.00445,"60":0.00445,"61":0.04446,"62":0.00445,"63":0.01334,"64":0.00445,"65":0.00889,"66":0.00889,"67":0.01334,"68":0.01334,"69":0.01334,"70":0.03557,"71":0.07114,"72":0.06224,"73":0.05335,"74":0.03112,"75":0.03557,"76":0.04001,"77":0.04001,"78":0.0578,"79":0.10226,"80":8.36293,"81":4.22815,"83":0.01778,"84":0.00889,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00445,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00445,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00445,"44":0,"45":0,"46":0,"47":0.00445,"48":0.01334,"49":0.00445,"50":0.03112,"51":0.00445,"52":0.16895,"53":0.00445,"54":0.00445,"55":0.00445,"56":0.00889,"57":0.00445,"58":0.00445,"59":0.00445,"60":0.00889,"61":0.00445,"62":0.00445,"63":0.00889,"64":0.00889,"65":0.00445,"66":0.00889,"67":0.00445,"68":0.12893,"69":0.00889,"70":0.00889,"71":0.01334,"72":0.03112,"73":0.02668,"74":0.87142,"75":1.6139,"76":0.03557,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.02223,"37":0,"38":0,"39":0,"40":0.00445,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00445,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00445,"57":0.00889,"58":0.00445,"60":0,"62":0,"63":0,"64":0,"65":0.00445,"66":0.00889,"67":1.0537,"68":0.01778,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00445},G:{"8":0.0007,"3.2":0.0007,"4.0-4.1":0,"4.2-4.3":0.0014,"5.0-5.1":0.00701,"6.0-6.1":0.0021,"7.0-7.1":0.00701,"8.1-8.4":0.00981,"9.0-9.2":0.00841,"9.3":0.10088,"10.0-10.2":0.02592,"10.3":0.08897,"11.0-11.2":0.05745,"11.3-11.4":0.09738,"12.0-12.1":0.1205,"12.2-12.4":0.78953,"13.0-13.1":0.16813,"13.2":0.08197,"13.3":4.59008,"13.4":0.85048},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00889,"13":0.15116,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01334,"11.1":0.02223,"12.1":0.03557,"13.1":0.15561},I:{"3":0.00094,"4":0.00844,_:"81","2.1":0,"2.2":0.00281,"2.3":0.00094,"4.1":0.01875,"4.2-4.3":0.03938,"4.4":0,"4.4.3-4.4.4":0.27097},B:{"12":0,"13":0.00445,"14":0.01334,"15":0.03557,"16":0.00445,"17":0.02668,"18":0.3379,_:"79 80 81"},P:{"4":0.12264,"5.0-5.4":0,"6.2-6.4":0.02044,"7.2-7.4":0.04088,"8.2":0.03066,"9.2":0.19419,"10.1":0.32705,"11.1":3.74066},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02397,"9":0.00479,"10":0.00959,"11":0.20617,"5.5":0},N:{"10":0,"11":0.07776},J:{"7":0,"10":0.01666},R:{_:"0"},M:{"0":0.17217},O:{"0":0.03332},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.35756},L:{"0":65.76889}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/RU.js b/website/www/node_modules/caniuse-lite/data/regions/RU.js new file mode 100644 index 000000000000..2f324bc80d91 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/RU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00672,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00672,"29":0,"30":0,"31":0,"32":0,"33":0.00672,"34":0,"35":0,"36":0.01344,"37":0,"38":0.00672,"39":0.00672,"40":0.00672,"41":0.02688,"42":0.00672,"43":0.00672,"44":0,"45":0.00672,"46":0.00672,"47":0.00672,"48":0.0336,"49":0.34267,"50":0.00672,"51":0.07391,"52":0,"53":0.01344,"54":0.00672,"55":0.01344,"56":0.02016,"57":0.01344,"58":0.04031,"59":0.02688,"60":0.01344,"61":0.08063,"62":0.02016,"63":0.0336,"64":0.02016,"65":0.0336,"66":0.02688,"67":0.05375,"68":0.0336,"69":0.05375,"70":0.32923,"71":0.34939,"72":0.30907,"73":0.25532,"74":0.1075,"75":0.10079,"76":0.23517,"77":0.12766,"78":0.23517,"79":0.26204,"80":14.27788,"81":6.83322,"83":0.05375,"84":0.02016,_:"85"},C:{"2":0,"3":0.00672,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00672,"43":0.00672,"44":0.00672,"45":0.04031,"46":0.02016,"47":0.02688,"48":0.04031,"49":0.02016,"50":0.04031,"51":0.02688,"52":0.19485,"53":0.02016,"54":0.02016,"55":0.02688,"56":0.04703,"57":0.01344,"58":0.00672,"59":0.00672,"60":0.02016,"61":0.01344,"62":0.00672,"63":0.04031,"64":0.05375,"65":0.06719,"66":0.0336,"67":0.01344,"68":0.18813,"69":0.02016,"70":0.02016,"71":0.02016,"72":0.05375,"73":0.0336,"74":0.88019,"75":1.33708,"76":0.02016,"77":0,"78":0,"3.5":0.00672,"3.6":0.00672},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.04703,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00672,"45":0.00672,"46":0,"47":0.01344,"48":0.00672,"49":0,"50":0,"51":0,"52":0,"53":0.00672,"54":0.00672,"55":0.00672,"56":0.02016,"57":0.02688,"58":0.02016,"60":0.00672,"62":0.00672,"63":0.00672,"64":0.00672,"65":0.02016,"66":0.0336,"67":3.14449,"68":0.05375,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0336},G:{"8":0.00098,"3.2":0.00098,"4.0-4.1":0,"4.2-4.3":0.00196,"5.0-5.1":0.00981,"6.0-6.1":0.00294,"7.0-7.1":0.00981,"8.1-8.4":0.01373,"9.0-9.2":0.01177,"9.3":0.1412,"10.0-10.2":0.03628,"10.3":0.12453,"11.0-11.2":0.08041,"11.3-11.4":0.1363,"12.0-12.1":0.16865,"12.2-12.4":1.10508,"13.0-13.1":0.23533,"13.2":0.11472,"13.3":6.42457,"13.4":1.19039},E:{"4":0.00672,"5":0,"6":0,"7":0,"8":0,"9":0.00672,"10":0,"11":0.01344,"12":0.08063,"13":1.14223,_:"0","3.1":0,"3.2":0,"5.1":0.04031,"6.1":0,"7.1":0,"9.1":0.00672,"10.1":0.0336,"11.1":0.08063,"12.1":0.2486,"13.1":0.90707},I:{"3":0.00089,"4":0.00803,_:"81","2.1":0,"2.2":0.00268,"2.3":0.00089,"4.1":0.01785,"4.2-4.3":0.03749,"4.4":0,"4.4.3-4.4.4":0.25794},B:{"12":0.00672,"13":0.00672,"14":0.02016,"15":0.01344,"16":0.02016,"17":0.09407,"18":0.77269,_:"79 80 81"},P:{"4":0.11392,"5.0-5.4":0.01036,"6.2-6.4":0.01036,"7.2-7.4":0.05178,"8.2":0.02071,"9.2":0.06214,"10.1":0.13464,"11.1":0.7871},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00759,"7":0.00759,"8":0.08347,"9":0.03035,"10":0.03035,"11":0.48567,"5.5":0},N:{"10":0.01094,"11":0.02187},J:{"7":0,"10":0.00984},R:{_:"0"},M:{"0":0.17717},O:{"0":0.38716},Q:{"1.2":0.01312},S:{"2.5":0},H:{"0":0.34169},L:{"0":38.29541}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/RW.js b/website/www/node_modules/caniuse-lite/data/regions/RW.js new file mode 100644 index 000000000000..67cef0391a37 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/RW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00342,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00342,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00342,"35":0,"36":0.01027,"37":0.00342,"38":0,"39":0.00342,"40":0.00685,"41":0,"42":0,"43":0.0137,"44":0,"45":0,"46":0,"47":0,"48":0.00342,"49":0.02397,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00342,"56":0.00342,"57":0,"58":0.0137,"59":0,"60":0.00342,"61":0,"62":0,"63":0.03424,"64":0.00342,"65":0.01027,"66":0.01027,"67":0.00342,"68":0.00342,"69":0.03082,"70":0.02054,"71":0.02739,"72":0.00685,"73":0.01027,"74":0.04794,"75":0.0137,"76":0.02739,"77":0.06848,"78":0.06506,"79":0.0993,"80":4.27658,"81":2.38995,"83":0.03766,"84":0.00685,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00342,"11":0,"12":0,"13":0.00342,"14":0,"15":0,"16":0,"17":0,"18":0.00342,"19":0,"20":0,"21":0.00342,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00342,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00342,"38":0,"39":0.00342,"40":0.00342,"41":0.00342,"42":0,"43":0.02397,"44":0.00342,"45":0.00342,"46":0,"47":0.04794,"48":0.00342,"49":0.00342,"50":0.00685,"51":0,"52":0.00342,"53":0,"54":0,"55":0,"56":0.00342,"57":0.00342,"58":0,"59":0,"60":0.00342,"61":0.0137,"62":0.00342,"63":0.00342,"64":0.00342,"65":0.00685,"66":0.00685,"67":0.00342,"68":0.09245,"69":0.00342,"70":0.00342,"71":0.00685,"72":0.04109,"73":0.01712,"74":0.37664,"75":0.81834,"76":0.11984,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00342,"15":0,"16":0.00342,"17":0,"18":0.00342,"19":0.01027,"20":0.02054,"21":0,"22":0,"23":0.02397,"24":0,"25":0,"26":0,"27":0,"28":0.00342,"29":0,"30":0.00342,"31":0,"32":0,"33":0,"34":0,"35":0.00342,"36":0,"37":0.00342,"38":0.00685,"39":0,"40":0,"41":0,"42":0.00342,"43":0,"44":0,"45":0.00685,"46":0.04794,"47":0.05821,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00685,"54":0.00342,"55":0.00342,"56":0.0137,"57":0.01712,"58":0.00342,"60":0.00342,"62":0,"63":0,"64":0,"65":0.0137,"66":0.0137,"67":0.54442,"68":0.0137,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00342,"12.1":0.02739},G:{"8":0.00058,"3.2":0.00058,"4.0-4.1":0,"4.2-4.3":0.00115,"5.0-5.1":0.00576,"6.0-6.1":0.00173,"7.0-7.1":0.00576,"8.1-8.4":0.00807,"9.0-9.2":0.00691,"9.3":0.08296,"10.0-10.2":0.02132,"10.3":0.07317,"11.0-11.2":0.04724,"11.3-11.4":0.08008,"12.0-12.1":0.09909,"12.2-12.4":0.6493,"13.0-13.1":0.13827,"13.2":0.06741,"13.3":3.77482,"13.4":0.69943},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04109,"12":0.04451,"13":0.23968,_:"0","3.1":0,"3.2":0,"5.1":0.13011,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01027,"11.1":0.02054,"12.1":0.05136,"13.1":0.07533},I:{"3":0.00113,"4":0.0102,_:"81","2.1":0,"2.2":0.0034,"2.3":0.00113,"4.1":0.02267,"4.2-4.3":0.0476,"4.4":0,"4.4.3-4.4.4":0.32756},B:{"12":0.04451,"13":0.04451,"14":0.02739,"15":0.01712,"16":0.02397,"17":0.05478,"18":0.24653,_:"79 80 81"},P:{"4":0.29073,"5.0-5.4":0.03115,"6.2-6.4":0.01038,"7.2-7.4":0.13498,"8.2":0.02077,"9.2":0.20766,"10.1":0.41533,"11.1":0.8618},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01019,"9":0,"10":0.01019,"11":0.19875,"5.5":0},N:{"10":0,"11":0.05261},J:{"7":0,"10":0.04603},R:{_:"0"},M:{"0":0.24989},O:{"0":2.6567},Q:{"1.2":0.08549},S:{"2.5":0.3025},H:{"0":17.56902},L:{"0":50.64451}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SA.js b/website/www/node_modules/caniuse-lite/data/regions/SA.js new file mode 100644 index 000000000000..58be3459b8b1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00238,"35":0,"36":0,"37":0,"38":0.00238,"39":0,"40":0,"41":0,"42":0,"43":0.00238,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03099,"50":0,"51":0,"52":0.00238,"53":0.00477,"54":0,"55":0.00238,"56":0.00477,"57":0,"58":0.00238,"59":0,"60":0,"61":0.00238,"62":0,"63":0.00715,"64":0.00238,"65":0.00238,"66":0.00238,"67":0.00477,"68":0,"69":0.00477,"70":0.00715,"71":0.01192,"72":0.00954,"73":0.00715,"74":0.00954,"75":0.00715,"76":0.00954,"77":0.01192,"78":0.01669,"79":0.03576,"80":2.74398,"81":1.21584,"83":0.00477,"84":0.00238,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00238,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00238,"64":0,"65":0,"66":0,"67":0,"68":0.01907,"69":0.00238,"70":0,"71":0,"72":0.00477,"73":0.00238,"74":0.1049,"75":0.1645,"76":0.00477,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00238,"57":0.00238,"58":0.00238,"60":0,"62":0,"63":0.00238,"64":0.00238,"65":0.00238,"66":0.00715,"67":0.01907,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00339,"3.2":0.00339,"4.0-4.1":0,"4.2-4.3":0.00677,"5.0-5.1":0.03385,"6.0-6.1":0.01016,"7.0-7.1":0.03385,"8.1-8.4":0.0474,"9.0-9.2":0.04063,"9.3":0.4875,"10.0-10.2":0.12526,"10.3":0.42995,"11.0-11.2":0.27761,"11.3-11.4":0.47057,"12.0-12.1":0.58229,"12.2-12.4":3.81538,"13.0-13.1":0.8125,"13.2":0.3961,"13.3":22.18133,"13.4":4.10991},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00238,"9":0,"10":0.00238,"11":0.00477,"12":0.02146,"13":0.29085,_:"0","3.1":0,"3.2":0,"5.1":0.01192,"6.1":0,"7.1":0,"9.1":0.00238,"10.1":0.00954,"11.1":0.02146,"12.1":0.06198,"13.1":0.1931},I:{"3":0.00052,"4":0.00467,_:"81","2.1":0,"2.2":0.00156,"2.3":0.00052,"4.1":0.01039,"4.2-4.3":0.02181,"4.4":0,"4.4.3-4.4.4":0.15007},B:{"12":0.00238,"13":0.00238,"14":0.00238,"15":0.00238,"16":0.00477,"17":0.01669,"18":0.24078,_:"79 80 81"},P:{"4":0.19359,"5.0-5.4":0.03057,"6.2-6.4":0.03057,"7.2-7.4":0.18341,"8.2":0.07132,"9.2":0.38719,"10.1":0.59097,"11.1":3.00582},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0054,"9":0.0027,"10":0.0027,"11":0.09172,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.08378},O:{"0":1.11955},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.137},L:{"0":52.95366}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SB.js b/website/www/node_modules/caniuse-lite/data/regions/SB.js new file mode 100644 index 000000000000..aea75aacac5b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SB.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0.00717,"9":0,"10":0,"11":0.00359,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.05738,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01434,"41":0,"42":0,"43":0.05379,"44":0.00359,"45":0,"46":0.00359,"47":0,"48":0,"49":0.05379,"50":0,"51":0,"52":0,"53":0.00359,"54":0.00717,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.02152,"64":0,"65":0.00717,"66":0,"67":0.01076,"68":0.0251,"69":0.03945,"70":0.03945,"71":0.0251,"72":0.00717,"73":0.03945,"74":0.01076,"75":0.02869,"76":0.02152,"77":0.01793,"78":0.03227,"79":0.02869,"80":2.51737,"81":1.82527,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00359,"15":0.00359,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00359,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00717,"50":0.00359,"51":0,"52":0,"53":0,"54":0,"55":0.0251,"56":0.01434,"57":0,"58":0,"59":0.00717,"60":0.00359,"61":0,"62":0.04303,"63":0,"64":0.00717,"65":0,"66":0.00717,"67":0.00359,"68":0.05738,"69":0.00717,"70":0.00717,"71":0.03227,"72":0.03586,"73":0.01076,"74":0.86064,"75":1.36268,"76":0.01076,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00359,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00359,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0251,"38":0,"39":0,"40":0,"41":0.00359,"42":0,"43":0.00359,"44":0,"45":0.01434,"46":0.02152,"47":0.00717,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.01076,"67":0.1793,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.05738},G:{"8":0.00036,"3.2":0.00036,"4.0-4.1":0,"4.2-4.3":0.00072,"5.0-5.1":0.00359,"6.0-6.1":0.00108,"7.0-7.1":0.00359,"8.1-8.4":0.00503,"9.0-9.2":0.00431,"9.3":0.05172,"10.0-10.2":0.01329,"10.3":0.04561,"11.0-11.2":0.02945,"11.3-11.4":0.04992,"12.0-12.1":0.06177,"12.2-12.4":0.40474,"13.0-13.1":0.08619,"13.2":0.04202,"13.3":2.35304,"13.4":0.43599},E:{"4":0,"5":0,"6":0,"7":0,"8":0.03227,"9":0,"10":0.00717,"11":0,"12":0.04662,"13":0.39087,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00717,"10.1":0.00359,"11.1":0.04303,"12.1":0.00359,"13.1":0.0502},I:{"3":0.00313,"4":0.0282,_:"81","2.1":0,"2.2":0.0094,"2.3":0.00313,"4.1":0.06266,"4.2-4.3":0.13159,"4.4":0,"4.4.3-4.4.4":0.90547},B:{"12":0.0251,"13":0.05738,"14":0.04662,"15":0.07889,"16":0.10041,"17":0.13627,"18":0.49128,_:"79 80 81"},P:{"4":1.27096,"5.0-5.4":0.33824,"6.2-6.4":0.07175,"7.2-7.4":0.63548,"8.2":0.03075,"9.2":0.44074,"10.1":0.67648,"11.1":0.66623},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03945,"9":0,"10":0.0251,"11":1.17621,"5.5":0},N:{"10":0,"11":0.02566},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.19883},O:{"0":7.87639},Q:{"1.2":0.28222},S:{"2.5":0},H:{"0":2.44109},L:{"0":63.84258}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SC.js b/website/www/node_modules/caniuse-lite/data/regions/SC.js new file mode 100644 index 000000000000..51cd0491a99b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00669,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00669,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00669,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00669,"43":0,"44":0,"45":0,"46":0.00669,"47":0,"48":0,"49":0.10701,"50":0,"51":0,"52":0,"53":0,"54":0.01338,"55":0.04682,"56":0,"57":0.00669,"58":0.01338,"59":0,"60":0.03344,"61":0.00669,"62":0.02006,"63":0.0535,"64":0.04013,"65":0.00669,"66":0.02006,"67":0.04013,"68":0.07357,"69":0.04682,"70":0.3879,"71":0.10032,"72":0.03344,"73":0.69555,"74":0.07357,"75":0.04682,"76":0.06019,"77":0.04682,"78":1.09683,"79":0.80256,"80":17.20154,"81":3.344,"83":0.02006,"84":0.00669,_:"85"},C:{"2":0.00669,"3":0,"4":0.00669,"5":0.01338,"6":0,"7":0.01338,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00669,"18":0.00669,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00669,"35":0,"36":0.00669,"37":0,"38":0.00669,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.03344,"46":0.00669,"47":0.00669,"48":0.00669,"49":0.02006,"50":0.04013,"51":0,"52":0.15382,"53":0,"54":0.01338,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.06688,"61":0.01338,"62":0,"63":0,"64":0,"65":0.00669,"66":0,"67":0.01338,"68":0.5551,"69":0.02006,"70":0.02006,"71":0.10701,"72":0.20733,"73":0.6688,"74":2.6217,"75":2.10003,"76":0.04013,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00669,"58":0.06019,"60":0,"62":0,"63":0,"64":0,"65":0.00669,"66":0.00669,"67":0.74237,"68":0.01338,"9.5-9.6":0,"10.0-10.1":0,"10.5":0.00669,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00066,"3.2":0.00066,"4.0-4.1":0,"4.2-4.3":0.00133,"5.0-5.1":0.00663,"6.0-6.1":0.00199,"7.0-7.1":0.00663,"8.1-8.4":0.00928,"9.0-9.2":0.00796,"9.3":0.09549,"10.0-10.2":0.02454,"10.3":0.08422,"11.0-11.2":0.05438,"11.3-11.4":0.09217,"12.0-12.1":0.11406,"12.2-12.4":0.74734,"13.0-13.1":0.15915,"13.2":0.07759,"13.3":4.34479,"13.4":0.80503},E:{"4":0,"5":0,"6":0,"7":0.00669,"8":0,"9":0,"10":0,"11":0,"12":0.04682,"13":0.56848,_:"0","3.1":0,"3.2":0,"5.1":0.01338,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02006,"11.1":0.04682,"12.1":0.08694,"13.1":0.84938},I:{"3":0.00091,"4":0.00821,_:"81","2.1":0,"2.2":0.00274,"2.3":0.00091,"4.1":0.01824,"4.2-4.3":0.03831,"4.4":0,"4.4.3-4.4.4":0.26361},B:{"12":0.02675,"13":0.07357,"14":0.04682,"15":0.01338,"16":1.0032,"17":0.92963,"18":6.94883,_:"79 80 81"},P:{"4":0.15201,"5.0-5.4":0.0304,"6.2-6.4":0,"7.2-7.4":0.15201,"8.2":0.07094,"9.2":0.27363,"10.1":0.55739,"11.1":2.14848},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.03623,"7":0.02174,"8":0.02898,"9":0.05796,"10":0.02174,"11":0.7028,"5.5":0},N:{"10":0,"11":0.02318},J:{"7":0,"10":0.14242},R:{_:"0"},M:{"0":0.46037},O:{"0":2.0137},Q:{"1.2":0.18547},S:{"2.5":0},H:{"0":0.73059},L:{"0":36.99616}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SD.js b/website/www/node_modules/caniuse-lite/data/regions/SD.js new file mode 100644 index 000000000000..38e1a3da00b9 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SD.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00187,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00373,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00187,"27":0,"28":0,"29":0.00373,"30":0,"31":0.00187,"32":0,"33":0.00373,"34":0,"35":0,"36":0.00187,"37":0,"38":0,"39":0,"40":0.00933,"41":0.00187,"42":0,"43":0.02053,"44":0,"45":0,"46":0.00187,"47":0,"48":0.01306,"49":0.02239,"50":0.00187,"51":0.00373,"52":0.00187,"53":0.00187,"54":0,"55":0.00746,"56":0.00187,"57":0.00187,"58":0.0056,"59":0.00187,"60":0.00187,"61":0,"62":0.00187,"63":0.01679,"64":0.00746,"65":0.00746,"66":0.00187,"67":0.00373,"68":0.00746,"69":0.00746,"70":0.00746,"71":0.00746,"72":0.0112,"73":0.0112,"74":0.01493,"75":0.00373,"76":0.01679,"77":0.0056,"78":0.02612,"79":0.03172,"80":0.9274,"81":0.43478,"83":0.00187,"84":0.00187,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.01306,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00187,"31":0,"32":0,"33":0,"34":0,"35":0.00187,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00187,"42":0,"43":0.00373,"44":0.00187,"45":0.00373,"46":0,"47":0.00746,"48":0.0056,"49":0.00187,"50":0,"51":0,"52":0.0112,"53":0,"54":0,"55":0,"56":0.0056,"57":0.00187,"58":0.00187,"59":0.00373,"60":0.00187,"61":0.00187,"62":0.00187,"63":0.00187,"64":0.00187,"65":0.00187,"66":0.0056,"67":0.00187,"68":0.04665,"69":0.00746,"70":0.00373,"71":0.00373,"72":0.06531,"73":0.01306,"74":0.24258,"75":0.35454,"76":0.0112,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0.00187,"16":0.00187,"17":0,"18":0.00187,"19":0.00187,"20":0.0056,"21":0,"22":0,"23":0.00746,"24":0,"25":0,"26":0,"27":0,"28":0.00187,"29":0,"30":0,"31":0,"32":0,"33":0.00187,"34":0,"35":0,"36":0,"37":0.00187,"38":0,"39":0,"40":0,"41":0,"42":0.00187,"43":0,"44":0,"45":0.00187,"46":0.00373,"47":0.00933,"48":0,"49":0.00187,"50":0,"51":0,"52":0,"53":0.02612,"54":0.0056,"55":0.0056,"56":0.01679,"57":0.0112,"58":0.00187,"60":0,"62":0,"63":0,"64":0,"65":0.00373,"66":0.00373,"67":0.21646,"68":0.00187,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0.00373,"11.6":0,"12.1":0.00746},G:{"8":0.00062,"3.2":0.00062,"4.0-4.1":0,"4.2-4.3":0.00124,"5.0-5.1":0.00621,"6.0-6.1":0.00186,"7.0-7.1":0.00621,"8.1-8.4":0.0087,"9.0-9.2":0.00746,"9.3":0.08948,"10.0-10.2":0.02299,"10.3":0.07892,"11.0-11.2":0.05095,"11.3-11.4":0.08637,"12.0-12.1":0.10688,"12.2-12.4":0.7003,"13.0-13.1":0.14913,"13.2":0.0727,"13.3":4.0713,"13.4":0.75436},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00746,"10":0.00746,"11":0.0112,"12":0.00187,"13":0.05038,_:"0","3.1":0,"3.2":0,"5.1":0.04665,"6.1":0.00187,"7.1":0,"9.1":0.00187,"10.1":0.00933,"11.1":0.01679,"12.1":0.03919,"13.1":0.02799},I:{"3":0.00275,"4":0.02474,_:"81","2.1":0,"2.2":0.00825,"2.3":0.00275,"4.1":0.05497,"4.2-4.3":0.11544,"4.4":0,"4.4.3-4.4.4":0.79432},B:{"12":0.0056,"13":0.00187,"14":0.0056,"15":0.00373,"16":0.00373,"17":0.02426,"18":0.1045,_:"79 80 81"},P:{"4":2.28808,"5.0-5.4":0.17211,"6.2-6.4":0.22273,"7.2-7.4":0.57708,"8.2":0.15186,"9.2":0.90106,"10.1":1.0023,"11.1":1.34652},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01244,"9":0.00311,"10":0.00311,"11":0.10263,"5.5":0},N:{"10":0,"11":0.0244},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24402},O:{"0":6.00289},Q:{"1.2":0.0488},S:{"2.5":0.01627},H:{"0":6.49943},L:{"0":65.69123}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SE.js b/website/www/node_modules/caniuse-lite/data/regions/SE.js new file mode 100644 index 000000000000..8cf8d9de5cb2 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00524,"35":0,"36":0,"37":0,"38":0.01047,"39":0,"40":0.01047,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00524,"47":0,"48":0,"49":0.15708,"50":0,"51":0,"52":0,"53":0.01047,"54":0,"55":0,"56":0,"57":0.00524,"58":0.00524,"59":0.01047,"60":0,"61":0.02094,"62":0.00524,"63":0.01047,"64":0.00524,"65":0.02094,"66":0.02094,"67":0.02618,"68":0.01571,"69":0.04189,"70":0.02618,"71":0.06283,"72":0.02094,"73":0.05236,"74":0.01571,"75":0.03665,"76":0.0733,"77":0.0576,"78":0.13614,"79":0.28798,"80":10.60814,"81":5.07368,"83":0.01571,"84":0.00524,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00524,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00524,"46":0,"47":0,"48":0.01047,"49":0,"50":0.01047,"51":0,"52":0.02618,"53":0,"54":0,"55":0,"56":0.01571,"57":0,"58":0.00524,"59":0.00524,"60":0.00524,"61":0,"62":0,"63":0.00524,"64":0.00524,"65":0.00524,"66":0.00524,"67":0.00524,"68":0.1885,"69":0.00524,"70":0.00524,"71":0.00524,"72":0.03142,"73":0.03142,"74":0.5969,"75":1.00008,"76":0.00524,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00524,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00524,"67":0.23038,"68":0.00524,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00351,"3.2":0.00351,"4.0-4.1":0,"4.2-4.3":0.00703,"5.0-5.1":0.03513,"6.0-6.1":0.01054,"7.0-7.1":0.03513,"8.1-8.4":0.04918,"9.0-9.2":0.04215,"9.3":0.50585,"10.0-10.2":0.12997,"10.3":0.44613,"11.0-11.2":0.28805,"11.3-11.4":0.48828,"12.0-12.1":0.60421,"12.2-12.4":3.95897,"13.0-13.1":0.84308,"13.2":0.411,"13.3":23.01611,"13.4":4.26458},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00524,"9":0,"10":0.00524,"11":0.01047,"12":0.04712,"13":2.4138,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01047,"10.1":0.06283,"11.1":0.12043,"12.1":0.23562,"13.1":1.00531},I:{"3":0.00047,"4":0.0042,_:"81","2.1":0,"2.2":0.0014,"2.3":0.00047,"4.1":0.00934,"4.2-4.3":0.01962,"4.4":0,"4.4.3-4.4.4":0.13498},B:{"12":0,"13":0.00524,"14":0.01047,"15":0.01571,"16":0.06283,"17":0.16232,"18":1.79071,_:"79 80 81"},P:{"4":0.10474,"5.0-5.4":0.01047,"6.2-6.4":0,"7.2-7.4":0.03142,"8.2":0.01047,"9.2":0.12569,"10.1":0.28281,"11.1":4.02212},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00533,"9":0.00533,"10":0.00533,"11":0.92127,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2906},O:{"0":0.06193},Q:{"1.2":0.00953},S:{"2.5":0},H:{"0":0.12629},L:{"0":30.60974}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SG.js b/website/www/node_modules/caniuse-lite/data/regions/SG.js new file mode 100644 index 000000000000..00701a49bbac --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00462,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00462,"23":0,"24":0,"25":0,"26":0.00924,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.04618,"35":0,"36":0,"37":0,"38":0.09236,"39":0,"40":0.00924,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00462,"47":0.00462,"48":0.00462,"49":0.17087,"50":0,"51":0.00462,"52":0,"53":0.09698,"54":0.00462,"55":0.01385,"56":0.00924,"57":0.00924,"58":0.00924,"59":0.00462,"60":0.00924,"61":0.00924,"62":0.01385,"63":0.01385,"64":0.00462,"65":0.03694,"66":0.00462,"67":0.03694,"68":0.01847,"69":0.02309,"70":0.13392,"71":0.13854,"72":0.12007,"73":0.08312,"74":0.0508,"75":0.05542,"76":0.07389,"77":0.08312,"78":0.09698,"79":0.18472,"80":8.58486,"81":4.21623,"83":0.01385,"84":0.00924,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00462,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00924,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00462,"49":0,"50":0.00462,"51":0,"52":0.00924,"53":0,"54":0.00462,"55":0,"56":0.00462,"57":0,"58":0.00462,"59":0,"60":0.00462,"61":0.00462,"62":0,"63":0.02771,"64":0.00924,"65":0.02309,"66":0.02309,"67":0.00924,"68":0.13392,"69":0.00462,"70":0.00462,"71":0.00462,"72":0.02309,"73":0.02771,"74":0.43871,"75":0.72041,"76":0.00924,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00462,"37":0.04156,"38":0,"39":0,"40":0.00462,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00462,"47":0.02309,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00462,"54":0,"55":0,"56":0,"57":0.00924,"58":0.00924,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.14316,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00924},G:{"8":0.00249,"3.2":0.00249,"4.0-4.1":0,"4.2-4.3":0.00498,"5.0-5.1":0.02492,"6.0-6.1":0.00748,"7.0-7.1":0.02492,"8.1-8.4":0.03488,"9.0-9.2":0.0299,"9.3":0.35881,"10.0-10.2":0.09219,"10.3":0.31645,"11.0-11.2":0.20432,"11.3-11.4":0.34635,"12.0-12.1":0.42858,"12.2-12.4":2.80821,"13.0-13.1":0.59802,"13.2":0.29154,"13.3":16.32598,"13.4":3.02499},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00924,"9":0,"10":0.00462,"11":0.01385,"12":0.0508,"13":1.28842,_:"0","3.1":0,"3.2":0,"5.1":0.00924,"6.1":0,"7.1":0,"9.1":0.00924,"10.1":0.04618,"11.1":0.08774,"12.1":0.17087,"13.1":0.69732},I:{"3":0.00626,"4":0.05631,_:"81","2.1":0,"2.2":0.01877,"2.3":0.00626,"4.1":0.12512,"4.2-4.3":0.26276,"4.4":0,"4.4.3-4.4.4":1.80804},B:{"12":0,"13":0.00462,"14":0.00462,"15":0.00462,"16":0.00924,"17":0.04618,"18":0.7435,_:"79 80 81"},P:{"4":0.44947,"5.0-5.4":0.01045,"6.2-6.4":0.01045,"7.2-7.4":0.02091,"8.2":0.02091,"9.2":0.06272,"10.1":0.24041,"11.1":3.52258},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00577,"7":0,"8":0.01732,"9":0.01155,"10":0.01155,"11":0.60034,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.01615},R:{_:"0"},M:{"0":0.33907},O:{"0":1.49081},Q:{"1.2":0.07535},S:{"2.5":0},H:{"0":0.86111},L:{"0":35.6394}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SH.js b/website/www/node_modules/caniuse-lite/data/regions/SH.js new file mode 100644 index 000000000000..9141e8331058 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.63925,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.8385,"69":0,"70":0.12453,"71":0,"72":0,"73":0,"74":0,"75":0.06642,"76":0.58114,"77":0.06642,"78":0,"79":2.18343,"80":17.8493,"81":23.11277,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.06642,"49":0,"50":0,"51":0,"52":0,"53":0.06642,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.06642,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.19095,"75":0.12453,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.12453,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.12453,"66":0,"67":0,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00023,"3.2":0.00023,"4.0-4.1":0,"4.2-4.3":0.00045,"5.0-5.1":0.00225,"6.0-6.1":0.00068,"7.0-7.1":0.00225,"8.1-8.4":0.00315,"9.0-9.2":0.0027,"9.3":0.03245,"10.0-10.2":0.00834,"10.3":0.02862,"11.0-11.2":0.01848,"11.3-11.4":0.03132,"12.0-12.1":0.03876,"12.2-12.4":0.25396,"13.0-13.1":0.05408,"13.2":0.02636,"13.3":1.47642,"13.4":0.27356},E:{"4":0,"5":0,"6":0,"7":0,"8":0.12453,"9":0,"10":0.25736,"11":0.06642,"12":0,"13":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.25736,"11.1":0,"12.1":0,"13.1":0},I:{"3":0.00123,"4":0.01105,_:"81","2.1":0,"2.2":0.00368,"2.3":0.00123,"4.1":0.02456,"4.2-4.3":0.05159,"4.4":0,"4.4.3-4.4.4":0.35496},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.06642,"18":2.24984,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.39632,"10.1":0.31503,"11.1":1.9613},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.38189,"10":0,"11":18.04025,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.1495},L:{"0":24.48098}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SI.js b/website/www/node_modules/caniuse-lite/data/regions/SI.js new file mode 100644 index 000000000000..aaba7593ee02 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SI.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00591,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00591,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00591,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.15363,"47":0,"48":0,"49":0.24227,"50":0,"51":0,"52":0,"53":0.00591,"54":0,"55":0,"56":0.01182,"57":0,"58":0.01773,"59":0,"60":0,"61":0.09454,"62":0.01773,"63":0.02955,"64":0,"65":0.00591,"66":0,"67":0.02364,"68":0.00591,"69":0.01773,"70":0.02955,"71":0.02364,"72":0.02364,"73":0.02364,"74":0.02955,"75":0.01773,"76":0.02955,"77":0.02364,"78":0.04727,"79":0.13,"80":14.58932,"81":6.61217,"83":0.01182,"84":0.00591,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00591,"44":0,"45":0,"46":0,"47":0,"48":0.01182,"49":0,"50":0.01773,"51":0.00591,"52":0.14182,"53":0.00591,"54":0.00591,"55":0,"56":0.00591,"57":0.01182,"58":0.01182,"59":0.00591,"60":0.03545,"61":0,"62":0,"63":0.01773,"64":0.01773,"65":0.01182,"66":0.01773,"67":0.00591,"68":0.23045,"69":0.01182,"70":0.01182,"71":0.00591,"72":0.07682,"73":0.04136,"74":1.92043,"75":3.10813,"76":0.01773,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00591,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00591,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.84499,"68":0.01182,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0011,"3.2":0.0011,"4.0-4.1":0,"4.2-4.3":0.0022,"5.0-5.1":0.01099,"6.0-6.1":0.0033,"7.0-7.1":0.01099,"8.1-8.4":0.01539,"9.0-9.2":0.01319,"9.3":0.15825,"10.0-10.2":0.04066,"10.3":0.13956,"11.0-11.2":0.09011,"11.3-11.4":0.15275,"12.0-12.1":0.18902,"12.2-12.4":1.2385,"13.0-13.1":0.26374,"13.2":0.12858,"13.3":7.2002,"13.4":1.3341},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00591,"11":0.01182,"12":0.04727,"13":0.83317,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01773,"10.1":0.02955,"11.1":0.07682,"12.1":0.16545,"13.1":0.72681},I:{"3":0.00067,"4":0.00607,_:"81","2.1":0,"2.2":0.00202,"2.3":0.00067,"4.1":0.0135,"4.2-4.3":0.02835,"4.4":0,"4.4.3-4.4.4":0.19507},B:{"12":0,"13":0.00591,"14":0.01182,"15":0.02364,"16":0.01182,"17":0.18909,"18":1.42998,_:"79 80 81"},P:{"4":0.08178,"5.0-5.4":0.02044,"6.2-6.4":0.01022,"7.2-7.4":0.03067,"8.2":0.03067,"9.2":0.17377,"10.1":0.31688,"11.1":3.10747},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00593,"9":0.00593,"10":0.00593,"11":1.35308,"5.5":0},N:{"10":0,"11":0.01227},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.24955},O:{"0":0.00818},Q:{"1.2":0},S:{"2.5":0.00409},H:{"0":0.18204},L:{"0":47.73494}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SK.js b/website/www/node_modules/caniuse-lite/data/regions/SK.js new file mode 100644 index 000000000000..82b43314bf83 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SK.js @@ -0,0 +1 @@ +module.exports={D:{"33":0.01805,"34":0.01203,"38":0.04814,"40":0.0722,"43":0.01203,"48":0.00602,"49":0.63179,"53":0.06619,"56":0.00602,"58":0.01203,"61":0.01805,"62":0.01805,"63":0.07822,"65":0.01203,"66":0.00602,"67":0.03009,"68":0.01203,"69":0.06619,"70":0.06017,"71":0.13839,"72":0.0361,"73":0.04814,"74":0.03009,"75":0.0722,"76":0.03009,"77":0.04814,"78":0.10831,"79":0.24068,"80":23.79122,"81":12.53943,"83":0.01805,"84":0.01203,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 35 36 37 39 41 42 44 45 46 47 50 51 52 54 55 57 59 60 64 85"},C:{"33":0.01805,"47":0.01203,"48":0.01805,"49":0.01203,"50":0.01805,"52":0.25873,"56":0.03009,"57":0.01203,"58":0.27678,"59":0.00602,"60":0.01805,"61":0.00602,"63":0.00602,"64":0.00602,"65":0.01203,"66":0.02407,"67":0.01203,"68":0.16246,"69":0.02407,"70":0.02407,"71":0.0361,"72":0.08424,"73":0.12034,"74":2.76782,"75":5.19267,"76":0.03009,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 51 53 54 55 62 77 78 3.5 3.6"},F:{"36":0.02407,"57":0.01805,"65":0.01203,"66":0.01805,"67":3.55605,"68":0.05415,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 58 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.0361},G:{"8":0.00078,"3.2":0.00078,"4.0-4.1":0,"4.2-4.3":0.00156,"5.0-5.1":0.00782,"6.0-6.1":0.00235,"7.0-7.1":0.00782,"8.1-8.4":0.01095,"9.0-9.2":0.00939,"9.3":0.11266,"10.0-10.2":0.02895,"10.3":0.09936,"11.0-11.2":0.06415,"11.3-11.4":0.10875,"12.0-12.1":0.13456,"12.2-12.4":0.8817,"13.0-13.1":0.18776,"13.2":0.09153,"13.3":5.12593,"13.4":0.94977},E:{"4":0,"9":0.18051,"11":0.01805,"12":0.09627,"13":1.75095,_:"0 5 6 7 8 10 3.1 3.2 5.1 6.1 7.1","9.1":0.14441,"10.1":0.04814,"11.1":0.11432,"12.1":0.25873,"13.1":1.42603},I:{"3":0.00051,"4":0.00462,_:"81","2.1":0,"2.2":0.00154,"2.3":0.00051,"4.1":0.01026,"4.2-4.3":0.02154,"4.4":0,"4.4.3-4.4.4":0.14822},B:{"13":0.00602,"14":0.01203,"15":0.01203,"16":0.01805,"17":0.11432,"18":2.20222,_:"12 79 80 81"},P:{"4":0.25168,"5.0-5.4":0.01045,"6.2-6.4":0.01045,"7.2-7.4":0.02091,"8.2":0.02091,"9.2":0.07341,"10.1":0.18876,"11.1":2.1707},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.03056,"9":0.00611,"10":0.01223,"11":1.10636,_:"6 7 5.5"},N:{"10":0,"11":0.01593},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.25093},O:{"0":0.05576},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.40348},L:{"0":28.76269}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SL.js b/website/www/node_modules/caniuse-lite/data/regions/SL.js new file mode 100644 index 000000000000..995fba05f9f5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00368,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.01472,"23":0,"24":0,"25":0,"26":0.00368,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.03312,"34":0,"35":0,"36":0.00368,"37":0,"38":0.00368,"39":0,"40":0.01104,"41":0,"42":0,"43":0.00736,"44":0,"45":0,"46":0.00368,"47":0.00368,"48":0,"49":0.01472,"50":0.00736,"51":0,"52":0.00368,"53":0,"54":0,"55":0,"56":0.00368,"57":0,"58":0.04048,"59":0,"60":0.00736,"61":0,"62":0,"63":0.04784,"64":0.0184,"65":0.00368,"66":0.00368,"67":0.00736,"68":0.00368,"69":0.02944,"70":0.00736,"71":0.00368,"72":0.05152,"73":0.0368,"74":0.11776,"75":0.02576,"76":0.0184,"77":0.15456,"78":0.02576,"79":0.12512,"80":2.96608,"81":1.932,"83":0.00736,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.00368,"8":0,"9":0,"10":0,"11":0,"12":0.00368,"13":0.00368,"14":0,"15":0,"16":0.00368,"17":0,"18":0.00368,"19":0.00368,"20":0.00368,"21":0,"22":0.00736,"23":0.00368,"24":0,"25":0,"26":0.00368,"27":0.00368,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.02208,"39":0,"40":0.00368,"41":0,"42":0.00368,"43":0.01104,"44":0.01104,"45":0.00368,"46":0.00368,"47":0.00368,"48":0.00368,"49":0.00368,"50":0,"51":0,"52":0.00368,"53":0,"54":0,"55":0,"56":0.00368,"57":0,"58":0.00368,"59":0.00368,"60":0.00368,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00368,"67":0.0368,"68":0.06256,"69":0.01472,"70":0,"71":0,"72":0.02944,"73":0.01472,"74":0.37536,"75":0.644,"76":0.1104,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0.00368,"12":0,"15":0.00368,"16":0.00368,"17":0,"18":0,"19":0.01104,"20":0.04784,"21":0.00368,"22":0,"23":0.05888,"24":0.00368,"25":0,"26":0.00368,"27":0,"28":0.01104,"29":0,"30":0.00368,"31":0.00368,"32":0,"33":0.00736,"34":0.00736,"35":0.00368,"36":0.00368,"37":0.00368,"38":0.00736,"39":0,"40":0,"41":0,"42":0.01104,"43":0,"44":0.00736,"45":0.00368,"46":0.04784,"47":0.02576,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00736,"54":0.00368,"55":0,"56":0.00736,"57":0.02576,"58":0,"60":0,"62":0,"63":0.00368,"64":0,"65":0.04784,"66":0.03312,"67":0.92368,"68":0.02208,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00736,"12.1":0.28704},G:{"8":0.0005,"3.2":0.0005,"4.0-4.1":0,"4.2-4.3":0.00099,"5.0-5.1":0.00496,"6.0-6.1":0.00149,"7.0-7.1":0.00496,"8.1-8.4":0.00695,"9.0-9.2":0.00596,"9.3":0.07146,"10.0-10.2":0.01836,"10.3":0.06303,"11.0-11.2":0.04069,"11.3-11.4":0.06898,"12.0-12.1":0.08536,"12.2-12.4":0.5593,"13.0-13.1":0.11911,"13.2":0.05806,"13.3":3.25158,"13.4":0.60248},E:{"4":0,"5":0,"6":0.00368,"7":0.00368,"8":0,"9":0,"10":0,"11":0,"12":0.00736,"13":0.12144,_:"0","3.1":0,"3.2":0,"5.1":1.43888,"6.1":0,"7.1":0,"9.1":0.01104,"10.1":0.01104,"11.1":0.01104,"12.1":0.06256,"13.1":0.28704},I:{"3":0.0023,"4":0.02067,_:"81","2.1":0,"2.2":0.00689,"2.3":0.0023,"4.1":0.04594,"4.2-4.3":0.09646,"4.4":0,"4.4.3-4.4.4":0.66377},B:{"12":0.0552,"13":0.02576,"14":0.01472,"15":0.0184,"16":0.0368,"17":0.04048,"18":1.24016,_:"79 80 81"},P:{"4":0.30832,"5.0-5.4":0.03083,"6.2-6.4":0.04111,"7.2-7.4":0.13361,"8.2":0,"9.2":0.08222,"10.1":0.4522,"11.1":1.15107},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05475,"9":0.0438,"10":0.05475,"11":0.29566,"5.5":0},N:{"10":0.01124,"11":0.08988},J:{"7":0,"10":0.01264},R:{_:"0"},M:{"0":0.19592},O:{"0":5.87128},Q:{"1.2":0.0632},S:{"2.5":0},H:{"0":9.36995},L:{"0":56.50304}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SM.js b/website/www/node_modules/caniuse-lite/data/regions/SM.js new file mode 100644 index 000000000000..d36a695ef6d3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00737,"37":0,"38":0.00737,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1.10475,"50":0,"51":0,"52":0,"53":0.00737,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.03683,"64":0.0221,"65":0.01473,"66":0.00737,"67":0.02946,"68":0.0221,"69":0.0221,"70":0,"71":0.00737,"72":0.00737,"73":0,"74":0,"75":0.07365,"76":0.02946,"77":0.05156,"78":0.02946,"79":0.1473,"80":18.42723,"81":15.67272,"83":0.05156,"84":0.00737,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.02946,"49":0,"50":0,"51":0,"52":0.03683,"53":0,"54":0,"55":0,"56":0.05892,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00737,"67":0,"68":0.07365,"69":0.01473,"70":0.0221,"71":0,"72":0.0221,"73":0.01473,"74":0.83225,"75":2.51147,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.25041,"68":0.00737,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0014,"3.2":0.0014,"4.0-4.1":0,"4.2-4.3":0.0028,"5.0-5.1":0.01401,"6.0-6.1":0.0042,"7.0-7.1":0.01401,"8.1-8.4":0.01962,"9.0-9.2":0.01681,"9.3":0.20178,"10.0-10.2":0.05185,"10.3":0.17796,"11.0-11.2":0.1149,"11.3-11.4":0.19477,"12.0-12.1":0.24101,"12.2-12.4":1.57918,"13.0-13.1":0.33629,"13.2":0.16394,"13.3":9.18083,"13.4":1.70109},E:{"4":0.00737,"5":0,"6":0,"7":0,"8":0.01473,"9":0,"10":0,"11":0.00737,"12":0.28724,"13":3.89609,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0221,"10.1":0.464,"11.1":0.22095,"12.1":0.57447,"13.1":3.66041},I:{"3":0.00052,"4":0.00466,_:"81","2.1":0,"2.2":0.00155,"2.3":0.00052,"4.1":0.01036,"4.2-4.3":0.02175,"4.4":0,"4.4.3-4.4.4":0.14963},B:{"12":0,"13":0.00737,"14":0.00737,"15":0,"16":0.00737,"17":0.06629,"18":2.92391,_:"79 80 81"},P:{"4":0.08248,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0.01031,"9.2":0.01031,"10.1":0.14434,"11.1":1.52591},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00737,"9":0.00737,"10":0,"11":0.54501,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.08696},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.13721},L:{"0":29.58362}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SN.js b/website/www/node_modules/caniuse-lite/data/regions/SN.js new file mode 100644 index 000000000000..12d99e1292fa --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00286,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00286,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00286,"31":0.00286,"32":0.00286,"33":0,"34":0,"35":0.00286,"36":0,"37":0,"38":0.00286,"39":0,"40":0.00286,"41":0,"42":0,"43":0.00573,"44":0,"45":0,"46":0,"47":0.00286,"48":0,"49":0.08878,"50":0,"51":0,"52":0,"53":0.00286,"54":0,"55":0.00286,"56":0.00573,"57":0,"58":0.00573,"59":0.00286,"60":0,"61":0.00286,"62":0.00286,"63":0.01432,"64":0.01718,"65":0.02005,"66":0.03723,"67":0.01718,"68":0.00286,"69":0.02291,"70":0.01432,"71":0.00859,"72":0.01432,"73":0.04296,"74":0.02005,"75":0.02578,"76":0.09738,"77":0.01718,"78":0.0315,"79":0.04582,"80":2.82677,"81":1.44059,"83":0.00286,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00286,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00573,"33":0,"34":0,"35":0.00286,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00859,"44":0,"45":0.00286,"46":0,"47":0.00573,"48":0.00286,"49":0,"50":0,"51":0.00286,"52":0.01146,"53":0,"54":0,"55":0.01432,"56":0.00573,"57":0.00573,"58":0,"59":0,"60":0.00573,"61":0,"62":0.00286,"63":0.00286,"64":0.01432,"65":0.00859,"66":0.00286,"67":0.01146,"68":0.06301,"69":0.00573,"70":0.00573,"71":0.00286,"72":0.01718,"73":0.01718,"74":0.32936,"75":0.51552,"76":0.01146,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00286,"54":0,"55":0,"56":0.00286,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00286,"66":0.00286,"67":0.27781,"68":0.00286,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00108,"3.2":0.00108,"4.0-4.1":0,"4.2-4.3":0.00216,"5.0-5.1":0.0108,"6.0-6.1":0.00324,"7.0-7.1":0.0108,"8.1-8.4":0.01512,"9.0-9.2":0.01296,"9.3":0.15554,"10.0-10.2":0.03996,"10.3":0.13718,"11.0-11.2":0.08857,"11.3-11.4":0.15014,"12.0-12.1":0.18578,"12.2-12.4":1.2173,"13.0-13.1":0.25923,"13.2":0.12637,"13.3":7.077,"13.4":1.31128},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00286,"9":0.06301,"10":0.00859,"11":0.00573,"12":0.01146,"13":0.14893,_:"0","3.1":0,"3.2":0,"5.1":0.01146,"6.1":0.00286,"7.1":0,"9.1":0.00859,"10.1":0.02578,"11.1":0.04296,"12.1":0.07733,"13.1":0.11456},I:{"3":0.00102,"4":0.00916,_:"81","2.1":0,"2.2":0.00305,"2.3":0.00102,"4.1":0.02036,"4.2-4.3":0.04275,"4.4":0,"4.4.3-4.4.4":0.29415},B:{"12":0.02291,"13":0.01146,"14":0.00573,"15":0.01432,"16":0.01146,"17":0.02578,"18":0.29499,_:"79 80 81"},P:{"4":0.55739,"5.0-5.4":0.04054,"6.2-6.4":0.09121,"7.2-7.4":0.34457,"8.2":0.04054,"9.2":0.60806,"10.1":0.74994,"11.1":2.3917},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00656,"9":0,"10":0.00656,"11":0.16731,"5.5":0},N:{"10":0,"11":0.12131},J:{"7":0,"10":0.02141},R:{_:"0"},M:{"0":0.23549},O:{"0":0.21408},Q:{"1.2":0.02141},S:{"2.5":0.00714},H:{"0":1.11472},L:{"0":72.81992}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SO.js b/website/www/node_modules/caniuse-lite/data/regions/SO.js new file mode 100644 index 000000000000..877bf1ba5efd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.0028,"22":0,"23":0,"24":0,"25":0,"26":0.0028,"27":0,"28":0,"29":0.0028,"30":0.01121,"31":0.0028,"32":0,"33":0.01401,"34":0,"35":0.0028,"36":0,"37":0.01961,"38":0,"39":0,"40":0.01401,"41":0.0028,"42":0,"43":0.05044,"44":0,"45":0.0028,"46":0.0028,"47":0,"48":0,"49":0.0056,"50":0.0028,"51":0,"52":0,"53":0.0056,"54":0,"55":0.0056,"56":0,"57":0,"58":0.0028,"59":0,"60":0,"61":0,"62":0.00841,"63":0.03643,"64":0.01401,"65":0.0028,"66":0.0056,"67":0.0056,"68":0.0056,"69":0.01121,"70":0.00841,"71":0.0056,"72":0.0028,"73":0.0056,"74":0.02802,"75":0.0028,"76":0.02242,"77":0.01121,"78":0.03643,"79":0.04763,"80":3.41564,"81":2.21918,"83":0.02522,"84":0.0028,_:"85"},C:{"2":0,"3":0.0028,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.0028,"42":0,"43":0.0028,"44":0.0028,"45":0.0028,"46":0,"47":0,"48":0.0028,"49":0,"50":0,"51":0.0056,"52":0,"53":0,"54":0,"55":0,"56":0.00841,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.0028,"63":0,"64":0,"65":0,"66":0,"67":0.0028,"68":0.01681,"69":0,"70":0.0056,"71":0.0028,"72":0.0056,"73":0.0028,"74":0.08966,"75":0.20455,"76":0.03923,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.0028,"21":0,"22":0,"23":0.0028,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00841,"47":0.01961,"48":0,"49":0,"50":0,"51":0.0028,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00841,"58":0.0028,"60":0,"62":0,"63":0,"64":0,"65":0.00841,"66":0.01681,"67":0.34184,"68":0.0056,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0056},G:{"8":0.00057,"3.2":0.00057,"4.0-4.1":0,"4.2-4.3":0.00115,"5.0-5.1":0.00575,"6.0-6.1":0.00172,"7.0-7.1":0.00575,"8.1-8.4":0.00805,"9.0-9.2":0.0069,"9.3":0.08278,"10.0-10.2":0.02127,"10.3":0.07301,"11.0-11.2":0.04714,"11.3-11.4":0.07991,"12.0-12.1":0.09888,"12.2-12.4":0.64789,"13.0-13.1":0.13797,"13.2":0.06726,"13.3":3.76662,"13.4":0.69791},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0028,"12":0,"13":0.06164,_:"0","3.1":0,"3.2":0,"5.1":0.1373,"6.1":0,"7.1":0,"9.1":0.0028,"10.1":0.01681,"11.1":0,"12.1":0.04203,"13.1":0.06445},I:{"3":0.00099,"4":0.00895,_:"81","2.1":0,"2.2":0.00298,"2.3":0.00099,"4.1":0.01988,"4.2-4.3":0.04175,"4.4":0,"4.4.3-4.4.4":0.2873},B:{"12":0.01401,"13":0.0056,"14":0.0028,"15":0.0056,"16":0.01121,"17":0.01681,"18":0.26899,_:"79 80 81"},P:{"4":0.63228,"5.0-5.4":0.04079,"6.2-6.4":0.13258,"7.2-7.4":0.78526,"8.2":0.06119,"9.2":0.5609,"10.1":0.79545,"11.1":3.3042},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03082,"5.5":0},N:{"10":0.0096,"11":0.01919},J:{"7":0,"10":0.0072},R:{_:"0"},M:{"0":0.10077},O:{"0":6.70134},Q:{"1.2":0},S:{"2.5":0},H:{"0":3.77529},L:{"0":64.20155}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SR.js b/website/www/node_modules/caniuse-lite/data/regions/SR.js new file mode 100644 index 000000000000..b781f1a8a3d3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0038,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0038,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01899,"35":0,"36":0.01139,"37":0,"38":0.0038,"39":0,"40":0.01519,"41":0.0038,"42":0.0038,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.10634,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0038,"56":0,"57":0,"58":0.0076,"59":0,"60":0,"61":0,"62":0,"63":0.01139,"64":0.0038,"65":0.02279,"66":0.0076,"67":0.0076,"68":0.0038,"69":0.0038,"70":0.14053,"71":0.01899,"72":0.01519,"73":0.0038,"74":0.0076,"75":0.01899,"76":0.01519,"77":0.01139,"78":0.12913,"79":0.07216,"80":5.55647,"81":3.51315,"83":0.01139,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0038,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.0038,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.0038,"63":0,"64":0.01519,"65":0,"66":0.01519,"67":0,"68":0.04937,"69":0,"70":0,"71":0,"72":0.01139,"73":0.0038,"74":0.31144,"75":0.44057,"76":0.01139,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0038,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.0038,"64":0,"65":0.0038,"66":0.0038,"67":0.26586,"68":0.0038,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00138,"3.2":0.00138,"4.0-4.1":0,"4.2-4.3":0.00276,"5.0-5.1":0.01381,"6.0-6.1":0.00414,"7.0-7.1":0.01381,"8.1-8.4":0.01933,"9.0-9.2":0.01657,"9.3":0.19882,"10.0-10.2":0.05109,"10.3":0.17535,"11.0-11.2":0.11322,"11.3-11.4":0.19192,"12.0-12.1":0.23748,"12.2-12.4":1.55604,"13.0-13.1":0.33137,"13.2":0.16154,"13.3":9.04629,"13.4":1.67616},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0038,"12":0.0038,"13":0.29245,_:"0","3.1":0,"3.2":0,"5.1":0.03798,"6.1":0,"7.1":0,"9.1":0.0038,"10.1":0.01899,"11.1":0.0076,"12.1":0.04558,"13.1":0.17471},I:{"3":0.00204,"4":0.01835,_:"81","2.1":0,"2.2":0.00612,"2.3":0.00204,"4.1":0.04077,"4.2-4.3":0.08562,"4.4":0,"4.4.3-4.4.4":0.58915},B:{"12":0.01139,"13":0.0076,"14":0.0038,"15":0.01139,"16":0.01519,"17":0.07976,"18":1.1356,_:"79 80 81"},P:{"4":0.65147,"5.0-5.4":0.03102,"6.2-6.4":0.06204,"7.2-7.4":0.51704,"8.2":0.06204,"9.2":0.44465,"10.1":1.2926,"11.1":7.3833},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00449,"10":0.00449,"11":0.5797,"5.5":0},N:{"10":0,"11":0.0124},J:{"7":0,"10":0.0062},R:{_:"0"},M:{"0":0.10543},O:{"0":0.52717},Q:{"1.2":0.09923},S:{"2.5":0},H:{"0":0.13505},L:{"0":56.08134}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ST.js b/website/www/node_modules/caniuse-lite/data/regions/ST.js new file mode 100644 index 000000000000..f200f2253535 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ST.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.01917,"33":0.00479,"34":0,"35":0,"36":0.00479,"37":0,"38":0.00959,"39":0,"40":0.01917,"41":0,"42":0.05272,"43":0.26841,"44":0,"45":0,"46":0.04793,"47":0,"48":0,"49":0.05752,"50":0,"51":0,"52":0,"53":0.00959,"54":0,"55":0.00959,"56":0.00479,"57":0,"58":0.04314,"59":0,"60":0,"61":0,"62":0.00959,"63":0.139,"64":0,"65":0,"66":0,"67":0,"68":0.0671,"69":0.11503,"70":0.01917,"71":0.00479,"72":0.04314,"73":0.04793,"74":0,"75":0.01917,"76":0.01917,"77":0.01917,"78":0.03355,"79":0.14858,"80":8.10496,"81":7.41477,"83":0,"84":0.00479,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00479,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00959,"37":0,"38":0,"39":0,"40":0.00959,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01917,"53":0.00959,"54":0,"55":0,"56":0.00959,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.11024,"69":0,"70":0.00479,"71":0,"72":0.00479,"73":0.06231,"74":0.57516,"75":0.77647,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0.00479,"20":0,"21":0,"22":0,"23":0,"24":0.00479,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00959,"37":0.02876,"38":0,"39":0,"40":0,"41":0,"42":0.00479,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00479,"66":0,"67":0.46013,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00479},G:{"8":0.00091,"3.2":0.00091,"4.0-4.1":0,"4.2-4.3":0.00182,"5.0-5.1":0.00908,"6.0-6.1":0.00272,"7.0-7.1":0.00908,"8.1-8.4":0.01272,"9.0-9.2":0.0109,"9.3":0.13079,"10.0-10.2":0.03361,"10.3":0.11535,"11.0-11.2":0.07448,"11.3-11.4":0.12625,"12.0-12.1":0.15623,"12.2-12.4":1.02365,"13.0-13.1":0.21799,"13.2":0.10627,"13.3":5.95115,"13.4":1.10267},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.26362,_:"0","3.1":0,"3.2":0,"5.1":0.19651,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00959,"11.1":0.04793,"12.1":0.00959,"13.1":0.08148},I:{"3":0.00136,"4":0.0122,_:"81","2.1":0,"2.2":0.00407,"2.3":0.00136,"4.1":0.0271,"4.2-4.3":0.05691,"4.4":0,"4.4.3-4.4.4":0.39163},B:{"12":0.00479,"13":0.00479,"14":0.01917,"15":0.00479,"16":0.00479,"17":0.01917,"18":0.66623,_:"79 80 81"},P:{"4":0.09194,"5.0-5.4":0.05108,"6.2-6.4":0.16345,"7.2-7.4":0.02043,"8.2":0,"9.2":0.05108,"10.1":0.17367,"11.1":0.521},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":1.52417,"5.5":0},N:{"10":0,"11":0.04686},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2239},O:{"0":4.02501},Q:{"1.2":0.04166},S:{"2.5":0.00521},H:{"0":0.42395},L:{"0":59.65928}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SV.js b/website/www/node_modules/caniuse-lite/data/regions/SV.js new file mode 100644 index 000000000000..2defd616e472 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SV.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00575,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00575,"35":0,"36":0,"37":0,"38":0.02298,"39":0,"40":0.00575,"41":0,"42":0,"43":0.00575,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.12065,"50":0,"51":0,"52":0,"53":0.03447,"54":0,"55":0.00575,"56":0.00575,"57":0.00575,"58":0.00575,"59":0,"60":0.00575,"61":0.00575,"62":0,"63":0.02298,"64":0.00575,"65":0.01724,"66":0.00575,"67":0.01149,"68":0.01149,"69":0.01149,"70":0.04596,"71":0.08043,"72":0.06894,"73":0.03447,"74":0.0632,"75":0.0632,"76":0.04596,"77":0.07469,"78":0.09192,"79":0.14363,"80":14.54634,"81":8.9105,"83":0.00575,"84":0.00575,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00575,"44":0,"45":0,"46":0,"47":0,"48":0.01149,"49":0,"50":0.00575,"51":0,"52":0.01724,"53":0,"54":0,"55":0,"56":0.00575,"57":0,"58":0,"59":0,"60":0.00575,"61":0,"62":0,"63":0.00575,"64":0.00575,"65":0.00575,"66":0.17235,"67":0,"68":0.20108,"69":0.01149,"70":0,"71":0.00575,"72":0.02873,"73":0.04596,"74":0.7526,"75":1.41902,"76":0.01724,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00575,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00575,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00575,"66":0,"67":0.69515,"68":0.01724,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00064,"3.2":0.00064,"4.0-4.1":0,"4.2-4.3":0.00127,"5.0-5.1":0.00637,"6.0-6.1":0.00191,"7.0-7.1":0.00637,"8.1-8.4":0.00892,"9.0-9.2":0.00764,"9.3":0.09171,"10.0-10.2":0.02356,"10.3":0.08088,"11.0-11.2":0.05222,"11.3-11.4":0.08852,"12.0-12.1":0.10954,"12.2-12.4":0.71774,"13.0-13.1":0.15285,"13.2":0.07451,"13.3":4.1727,"13.4":0.77315},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02873,"12":0.06894,"13":0.58025,_:"0","3.1":0,"3.2":0,"5.1":0.64344,"6.1":0,"7.1":0,"9.1":0.00575,"10.1":0.02298,"11.1":0.05745,"12.1":0.18384,"13.1":0.55152},I:{"3":0.0011,"4":0.00987,_:"81","2.1":0,"2.2":0.00329,"2.3":0.0011,"4.1":0.02193,"4.2-4.3":0.04605,"4.4":0,"4.4.3-4.4.4":0.31688},B:{"12":0.00575,"13":0.00575,"14":0.00575,"15":0.00575,"16":0.01149,"17":0.05745,"18":0.41364,_:"79 80 81"},P:{"4":0.25234,"5.0-5.4":0.02019,"6.2-6.4":0.03028,"7.2-7.4":0.13122,"8.2":0.04037,"9.2":0.20187,"10.1":0.29272,"11.1":1.71592},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00606,"9":0,"10":0,"11":0.10309,"5.5":0},N:{"10":0,"11":0.01277},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2936},O:{"0":0.19999},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.10474},L:{"0":56.85792}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SY.js b/website/www/node_modules/caniuse-lite/data/regions/SY.js new file mode 100644 index 000000000000..737cfeed8931 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00329,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00329,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00988,"34":0,"35":0,"36":0.00658,"37":0.00329,"38":0.00658,"39":0,"40":0.01646,"41":0,"42":0.00658,"43":0.03292,"44":0,"45":0.00329,"46":0.00329,"47":0.00329,"48":0,"49":0.06255,"50":0,"51":0,"52":0,"53":0.00988,"54":0,"55":0.00988,"56":0.00658,"57":0.00329,"58":0.00988,"59":0.00329,"60":0.00658,"61":0,"62":0.00329,"63":0.05926,"64":0.00329,"65":0.01317,"66":0.00329,"67":0.00658,"68":0.01317,"69":0.01646,"70":0.00988,"71":0.02963,"72":0.02304,"73":0.03292,"74":0.0395,"75":0.02963,"76":0.05267,"77":0.03292,"78":0.09218,"79":0.11522,"80":4.46066,"81":2.17272,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00658,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00329,"42":0,"43":0.00329,"44":0,"45":0,"46":0,"47":0.01317,"48":0.00988,"49":0,"50":0,"51":0.00329,"52":0.0428,"53":0.00988,"54":0,"55":0.00329,"56":0.01317,"57":0.00329,"58":0.00329,"59":0.00329,"60":0.00329,"61":0.00329,"62":0.00329,"63":0,"64":0.00329,"65":0.00988,"66":0.00329,"67":0.00658,"68":0.09547,"69":0.00658,"70":0.00658,"71":0.01646,"72":0.06255,"73":0.03621,"74":0.60244,"75":0.89213,"76":0.01975,"77":0,"78":0,"3.5":0,"3.6":0.00329},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00329,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00658,"47":0.00658,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00329,"54":0.00329,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00329,"65":0.00329,"66":0.00658,"67":0.3292,"68":0.00329,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00329},G:{"8":0.00044,"3.2":0.00044,"4.0-4.1":0,"4.2-4.3":0.00087,"5.0-5.1":0.00436,"6.0-6.1":0.00131,"7.0-7.1":0.00436,"8.1-8.4":0.0061,"9.0-9.2":0.00523,"9.3":0.06273,"10.0-10.2":0.01612,"10.3":0.05532,"11.0-11.2":0.03572,"11.3-11.4":0.06055,"12.0-12.1":0.07492,"12.2-12.4":0.49092,"13.0-13.1":0.10454,"13.2":0.05097,"13.3":2.85406,"13.4":0.52882},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00329,"12":0.00988,"13":0.10205,_:"0","3.1":0,"3.2":0,"5.1":0.22386,"6.1":0,"7.1":0,"9.1":0.00329,"10.1":0.00329,"11.1":0.01317,"12.1":0.0395,"13.1":0.06584},I:{"3":0.00599,"4":0.05387,_:"81","2.1":0,"2.2":0.01796,"2.3":0.00599,"4.1":0.11972,"4.2-4.3":0.25141,"4.4":0,"4.4.3-4.4.4":1.72997},B:{"12":0.00329,"13":0.00329,"14":0.00329,"15":0.01317,"16":0.01317,"17":0.02304,"18":0.21398,_:"79 80 81"},P:{"4":1.4236,"5.0-5.4":0.07118,"6.2-6.4":0.17287,"7.2-7.4":0.44742,"8.2":0.14236,"9.2":0.84399,"10.1":1.63714,"11.1":4.86059},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03719,"9":0.01352,"10":0,"11":0.07438,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.27503},O:{"0":1.64346},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.80654},L:{"0":66.22584}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/SZ.js b/website/www/node_modules/caniuse-lite/data/regions/SZ.js new file mode 100644 index 000000000000..7047e7f8fd81 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/SZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00318,"19":0,"20":0.00318,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00636,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00318,"37":0,"38":0,"39":0,"40":0.01272,"41":0,"42":0,"43":0.00318,"44":0,"45":0,"46":0.01272,"47":0,"48":0,"49":0.00954,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00318,"56":0,"57":0,"58":0.00636,"59":0,"60":0,"61":0,"62":0.00318,"63":0,"64":0,"65":0.00318,"66":0.01907,"67":0.00318,"68":0.01907,"69":0.0159,"70":0.01907,"71":0.06994,"72":0.00636,"73":0.00318,"74":0.01907,"75":0.00954,"76":0.00954,"77":0.02543,"78":0.02225,"79":0.04451,"80":3.33477,"81":1.67215,"83":0.00636,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0.00318,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00318,"28":0.00318,"29":0,"30":0,"31":0.00318,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00318,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00318,"46":0,"47":0.00954,"48":0,"49":0.00318,"50":0,"51":0,"52":0.00318,"53":0,"54":0,"55":0,"56":0.00318,"57":0.00318,"58":0,"59":0,"60":0.0159,"61":0,"62":0.00318,"63":0,"64":0.00318,"65":0,"66":0.00318,"67":0.00318,"68":0.06358,"69":0.00318,"70":0.00636,"71":0.00318,"72":0.00954,"73":0.01272,"74":0.34015,"75":0.37512,"76":0.03497,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0.00318,"16":0,"17":0.00318,"18":0.00636,"19":0.00636,"20":0.00636,"21":0.00318,"22":0.00318,"23":0,"24":0,"25":0,"26":0.00954,"27":0,"28":0.02225,"29":0.00318,"30":0.00954,"31":0.00318,"32":0.0159,"33":0.00318,"34":0,"35":0.03179,"36":0.00318,"37":0.00636,"38":0.00636,"39":0,"40":0,"41":0,"42":0.00636,"43":0,"44":0,"45":0.00636,"46":0.03497,"47":0.07312,"48":0,"49":0.00318,"50":0,"51":0.00636,"52":0.00318,"53":0.00636,"54":0,"55":0,"56":0.00954,"57":0.00636,"58":0.00318,"60":0.01272,"62":0,"63":0.00318,"64":0.00636,"65":0.02543,"66":0.0159,"67":0.55633,"68":0.00636,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.30201},G:{"8":0.00046,"3.2":0.00046,"4.0-4.1":0,"4.2-4.3":0.00091,"5.0-5.1":0.00457,"6.0-6.1":0.00137,"7.0-7.1":0.00457,"8.1-8.4":0.0064,"9.0-9.2":0.00549,"9.3":0.06586,"10.0-10.2":0.01692,"10.3":0.05808,"11.0-11.2":0.0375,"11.3-11.4":0.06357,"12.0-12.1":0.07866,"12.2-12.4":0.51541,"13.0-13.1":0.10976,"13.2":0.05351,"13.3":2.99644,"13.4":0.5552},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0159,"13":0.13034,_:"0","3.1":0,"3.2":0,"5.1":0.37512,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00318,"11.1":0.00636,"12.1":0.08583,"13.1":0.05722},I:{"3":0.00158,"4":0.01418,_:"81","2.1":0,"2.2":0.00473,"2.3":0.00158,"4.1":0.03151,"4.2-4.3":0.06616,"4.4":0,"4.4.3-4.4.4":0.45525},B:{"12":0.05722,"13":0.02225,"14":0.02543,"15":0.02543,"16":0.02861,"17":0.06358,"18":0.60083,_:"79 80 81"},P:{"4":0.63373,"5.0-5.4":0,"6.2-6.4":0.02044,"7.2-7.4":0.34753,"8.2":0.03066,"9.2":0.21465,"10.1":0.53152,"11.1":1.70699},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00954,"9":0.00318,"10":0.00636,"11":0.23207,"5.5":0},N:{"10":0.01137,"11":0.05684},J:{"7":0,"10":0.5184},R:{_:"0"},M:{"0":0.17053},O:{"0":1.40513},Q:{"1.2":0},S:{"2.5":0.2592},H:{"0":16.89975},L:{"0":54.55916}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TC.js b/website/www/node_modules/caniuse-lite/data/regions/TC.js new file mode 100644 index 000000000000..ce16e3b0c5d6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.02006,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.02006,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.05016,"50":0,"51":0.00502,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.02508,"64":0,"65":0.01003,"66":0,"67":0,"68":0.01505,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.14546,"76":0.00502,"77":0.02508,"78":0.05518,"79":0.0953,"80":6.46562,"81":3.24034,"83":0.01003,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00502,"53":0.00502,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00502,"67":0,"68":0.07022,"69":0,"70":0,"71":0.00502,"72":0.00502,"73":0.00502,"74":0.46649,"75":1.10854,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00502,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":3.75698,"68":0.01003,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00327,"3.2":0.00327,"4.0-4.1":0,"4.2-4.3":0.00654,"5.0-5.1":0.03268,"6.0-6.1":0.0098,"7.0-7.1":0.03268,"8.1-8.4":0.04575,"9.0-9.2":0.03921,"9.3":0.47057,"10.0-10.2":0.12091,"10.3":0.41502,"11.0-11.2":0.26797,"11.3-11.4":0.45423,"12.0-12.1":0.56207,"12.2-12.4":3.6829,"13.0-13.1":0.78429,"13.2":0.38234,"13.3":21.41113,"13.4":3.9672},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0301,"13":2.56819,_:"0","3.1":0,"3.2":0,"5.1":0.00502,"6.1":0,"7.1":0,"9.1":0,"10.1":0.03511,"11.1":0.10032,"12.1":0.23575,"13.1":1.27908},I:{"3":0.00229,"4":0.02065,_:"81","2.1":0,"2.2":0.00688,"2.3":0.00229,"4.1":0.04588,"4.2-4.3":0.09636,"4.4":0,"4.4.3-4.4.4":0.66302},B:{"12":0.00502,"13":0.10534,"14":0.01003,"15":0.02006,"16":0.02006,"17":0.13042,"18":2.41771,_:"79 80 81"},P:{"4":0.07435,"5.0-5.4":0,"6.2-6.4":0.02124,"7.2-7.4":0.07435,"8.2":0.07435,"9.2":0.11684,"10.1":0.20181,"11.1":3.5688},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.42636,"5.5":0},N:{"10":0,"11":0.01495},J:{"7":0,"10":0.01495},R:{_:"0"},M:{"0":0.20434},O:{"0":0.09968},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.08965},L:{"0":36.39926}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TD.js b/website/www/node_modules/caniuse-lite/data/regions/TD.js new file mode 100644 index 000000000000..2b807fd95750 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TD.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00279,"39":0,"40":0.00279,"41":0,"42":0.00279,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00279,"49":0.08091,"50":0.00279,"51":0,"52":0,"53":0,"54":0,"55":0.00837,"56":0,"57":0.01953,"58":0,"59":0,"60":0,"61":0,"62":0.00279,"63":0.01953,"64":0,"65":0.00837,"66":0,"67":0.01674,"68":0.00558,"69":0.01116,"70":0.00279,"71":0,"72":0,"73":0.00558,"74":0.23436,"75":0.06138,"76":0.36549,"77":0.00558,"78":0.03906,"79":0.05301,"80":1.02393,"81":0.558,"83":0,"84":0,_:"85"},C:{"2":0,"3":0.03069,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00279,"16":0,"17":0,"18":0.00279,"19":0,"20":0,"21":0,"22":0,"23":0.00279,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00279,"30":0,"31":0.00558,"32":0,"33":0,"34":0,"35":0.00279,"36":0,"37":0,"38":0,"39":0.00279,"40":0,"41":0.00279,"42":0,"43":0.00558,"44":0.00279,"45":0.00279,"46":0,"47":0.00279,"48":0.00837,"49":0.00279,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00279,"56":0.00279,"57":0,"58":0,"59":0,"60":0.00558,"61":0,"62":0,"63":0,"64":0.00279,"65":0,"66":0,"67":0,"68":0.15345,"69":0.00837,"70":0,"71":0.03627,"72":0.01395,"73":0.1116,"74":0.26784,"75":0.41013,"76":0.11439,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00279,"15":0,"16":0.00279,"17":0,"18":0,"19":0.00279,"20":0.00558,"21":0,"22":0,"23":0.00279,"24":0,"25":0,"26":0,"27":0,"28":0.01116,"29":0.00279,"30":0.01116,"31":0,"32":0,"33":0,"34":0.00558,"35":0,"36":0,"37":0.01116,"38":0.01953,"39":0,"40":0,"41":0,"42":0.04464,"43":0,"44":0,"45":0.02511,"46":0.09765,"47":0.18693,"48":0.00279,"49":0,"50":0,"51":0.01674,"52":0,"53":0.00837,"54":0.00558,"55":0,"56":0.00279,"57":0.01395,"58":0,"60":0,"62":0,"63":0.01116,"64":0.01953,"65":0.02232,"66":0.01674,"67":0.14508,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01395},G:{"8":0.00064,"3.2":0.00064,"4.0-4.1":0,"4.2-4.3":0.00128,"5.0-5.1":0.00642,"6.0-6.1":0.00193,"7.0-7.1":0.00642,"8.1-8.4":0.00899,"9.0-9.2":0.0077,"9.3":0.09246,"10.0-10.2":0.02376,"10.3":0.08154,"11.0-11.2":0.05265,"11.3-11.4":0.08925,"12.0-12.1":0.11043,"12.2-12.4":0.7236,"13.0-13.1":0.15409,"13.2":0.07512,"13.3":4.20675,"13.4":0.77946},E:{"4":0,"5":0.00279,"6":0,"7":0,"8":0,"9":0,"10":0.00279,"11":0.07812,"12":0,"13":0.30969,_:"0","3.1":0,"3.2":0,"5.1":0.00279,"6.1":0,"7.1":0,"9.1":0,"10.1":0.05022,"11.1":0.14508,"12.1":0.04743,"13.1":0.02232},I:{"3":0.00722,"4":0.06502,_:"81","2.1":0,"2.2":0.02167,"2.3":0.00722,"4.1":0.14449,"4.2-4.3":0.30344,"4.4":0,"4.4.3-4.4.4":2.08794},B:{"12":0.02232,"13":0.01395,"14":0.00558,"15":0.00279,"16":0.09207,"17":0.01395,"18":0.6975,_:"79 80 81"},P:{"4":0.51629,"5.0-5.4":0.07086,"6.2-6.4":0.06074,"7.2-7.4":0.24296,"8.2":0.02025,"9.2":0.73901,"10.1":0.38469,"11.1":0.44543},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.18759,"9":0,"10":0.0469,"11":1.73525,"5.5":0},N:{"10":0,"11":0.05047},J:{"7":0,"10":0.03605},R:{_:"0"},M:{"0":0.31003},O:{"0":5.73195},Q:{"1.2":0.54796},S:{"2.5":0.05047},H:{"0":4.65531},L:{"0":65.28671}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TG.js b/website/www/node_modules/caniuse-lite/data/regions/TG.js new file mode 100644 index 000000000000..2a42002c9159 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00552,"10":0,"11":0.00552,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00552,"27":0,"28":0,"29":0.00552,"30":0,"31":0.00552,"32":0,"33":0.00552,"34":0.00552,"35":0,"36":0.01104,"37":0,"38":0,"39":0,"40":0.00552,"41":0,"42":0.00552,"43":0.03863,"44":0,"45":0,"46":0.00552,"47":0,"48":0,"49":0.04966,"50":0.01655,"51":0,"52":0.01655,"53":0,"54":0,"55":0.00552,"56":0,"57":0,"58":0.01104,"59":0,"60":0.01655,"61":0.00552,"62":0.00552,"63":0.16554,"64":0.01104,"65":0.00552,"66":0.00552,"67":0.00552,"68":0.00552,"69":0.08829,"70":0.01655,"71":0.07725,"72":0.05518,"73":0.11588,"74":0.12691,"75":0.0607,"76":0.08829,"77":0.07725,"78":0.11036,"79":0.41937,"80":7.5707,"81":4.70134,"83":0.00552,"84":0.00552,_:"85"},C:{"2":0,"3":0.00552,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00552,"22":0,"23":0.00552,"24":0,"25":0,"26":0,"27":0.00552,"28":0,"29":0.00552,"30":0.00552,"31":0,"32":0,"33":0,"34":0.00552,"35":0.00552,"36":0,"37":0,"38":0.00552,"39":0,"40":0.00552,"41":0.00552,"42":0.01655,"43":0.02207,"44":0.00552,"45":0.01104,"46":0.01104,"47":0.01655,"48":0.01104,"49":0.01655,"50":0.00552,"51":0.00552,"52":0.08277,"53":0.00552,"54":0.00552,"55":0.06622,"56":0.01104,"57":0.01104,"58":0,"59":0.00552,"60":0.01104,"61":0.01104,"62":0.2152,"63":0.02207,"64":0.01104,"65":0.00552,"66":0.01655,"67":0.04414,"68":0.60146,"69":0.02759,"70":0.01655,"71":0.03863,"72":0.1545,"73":0.11588,"74":2.64312,"75":4.14402,"76":0.18761,"77":0.02207,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00552,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.01104,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01104,"39":0,"40":0.01104,"41":0,"42":0.00552,"43":0,"44":0,"45":0.01104,"46":0.02207,"47":0.04414,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.11036,"58":0,"60":0.00552,"62":0,"63":0,"64":0.00552,"65":0.03311,"66":0.04966,"67":2.17409,"68":0.02759,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02759},G:{"8":0.00048,"3.2":0.00048,"4.0-4.1":0,"4.2-4.3":0.00097,"5.0-5.1":0.00484,"6.0-6.1":0.00145,"7.0-7.1":0.00484,"8.1-8.4":0.00678,"9.0-9.2":0.00581,"9.3":0.06972,"10.0-10.2":0.01791,"10.3":0.06149,"11.0-11.2":0.0397,"11.3-11.4":0.0673,"12.0-12.1":0.08328,"12.2-12.4":0.54565,"13.0-13.1":0.1162,"13.2":0.05665,"13.3":3.17222,"13.4":0.58777},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00552,"11":0.01104,"12":0.01104,"13":0.37522,_:"0","3.1":0,"3.2":0,"5.1":1.34087,"6.1":0,"7.1":0,"9.1":0.00552,"10.1":0.03311,"11.1":0.06622,"12.1":0.0607,"13.1":0.23727},I:{"3":0.00314,"4":0.02824,_:"81","2.1":0,"2.2":0.00941,"2.3":0.00314,"4.1":0.06275,"4.2-4.3":0.13177,"4.4":0,"4.4.3-4.4.4":0.9067},B:{"12":0.03311,"13":0.02207,"14":0.01104,"15":0.04414,"16":0.01655,"17":0.11036,"18":0.97117,_:"79 80 81"},P:{"4":0.10389,"5.0-5.4":0.01039,"6.2-6.4":0.05194,"7.2-7.4":0.02078,"8.2":0,"9.2":0.35321,"10.1":0.11427,"11.1":0.68564},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01017,"7":0,"8":0.03052,"9":0,"10":0.02035,"11":0.26452,"5.5":0},N:{"10":0.06275,"11":0.15687},J:{"7":0,"10":0.03137},R:{_:"0"},M:{"0":0.3496},O:{"0":1.90037},Q:{"1.2":0.01345},S:{"2.5":0},H:{"0":3.02121},L:{"0":53.5314}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TH.js b/website/www/node_modules/caniuse-lite/data/regions/TH.js new file mode 100644 index 000000000000..69195d03ab12 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TH.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00499,"35":0,"36":0.00499,"37":0,"38":0.00997,"39":0,"40":0.00499,"41":0,"42":0,"43":0.01496,"44":0,"45":0,"46":0.00499,"47":0.00499,"48":0.00499,"49":0.14958,"50":0,"51":0.00499,"52":0,"53":0.02493,"54":0,"55":0.00499,"56":0.00499,"57":0.00499,"58":0.01994,"59":0.00499,"60":0.00499,"61":0.00997,"62":0.00499,"63":0.01994,"64":0.00499,"65":0.00997,"66":0.00997,"67":0.01994,"68":0.00499,"69":0.01994,"70":0.03989,"71":0.06482,"72":0.0349,"73":0.11468,"74":0.06482,"75":0.07978,"76":0.04986,"77":0.04986,"78":0.05983,"79":0.09972,"80":11.79688,"81":6.46684,"83":0.0349,"84":0.00997,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00499,"48":0.00499,"49":0,"50":0.00499,"51":0,"52":0.01994,"53":0.00499,"54":0.00499,"55":0.02493,"56":0.08975,"57":0.00499,"58":0.00499,"59":0,"60":0.00499,"61":0,"62":0,"63":0.00499,"64":0.00499,"65":0.00499,"66":0.00499,"67":0.00499,"68":0.05485,"69":0.00499,"70":0.00499,"71":0.00499,"72":0.01994,"73":0.01496,"74":0.35899,"75":0.65317,"76":0.00997,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.02992,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.19944,"68":0.00499,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.0019,"3.2":0.0019,"4.0-4.1":0,"4.2-4.3":0.00381,"5.0-5.1":0.01903,"6.0-6.1":0.00571,"7.0-7.1":0.01903,"8.1-8.4":0.02664,"9.0-9.2":0.02283,"9.3":0.27397,"10.0-10.2":0.07039,"10.3":0.24162,"11.0-11.2":0.15601,"11.3-11.4":0.26445,"12.0-12.1":0.32724,"12.2-12.4":2.14416,"13.0-13.1":0.45661,"13.2":0.2226,"13.3":12.46543,"13.4":2.30968},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00997,"9":0,"10":0.00499,"11":0.01496,"12":0.06482,"13":1.02712,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00499,"10.1":0.03989,"11.1":0.07479,"12.1":0.18448,"13.1":0.64319},I:{"3":0.00038,"4":0.00345,_:"81","2.1":0,"2.2":0.00115,"2.3":0.00038,"4.1":0.00767,"4.2-4.3":0.01611,"4.4":0,"4.4.3-4.4.4":0.11083},B:{"12":0,"13":0.00499,"14":0.00499,"15":0.00499,"16":0.00499,"17":0.02493,"18":0.35401,_:"79 80 81"},P:{"4":0.19375,"5.0-5.4":0.02039,"6.2-6.4":0.02039,"7.2-7.4":0.09178,"8.2":0.04079,"9.2":0.21415,"10.1":0.34671,"11.1":2.09047},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02137,"9":0.02137,"10":0.01068,"11":0.24574,"5.5":0},N:{"10":0.01254,"11":0.01254},J:{"7":0,"10":0.00501},R:{_:"0"},M:{"0":0.09025},O:{"0":0.22563},Q:{"1.2":0.00501},S:{"2.5":0},H:{"0":0.32279},L:{"0":51.13413}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TJ.js b/website/www/node_modules/caniuse-lite/data/regions/TJ.js new file mode 100644 index 000000000000..41f11408946a --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TJ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0.00574,"9":0,"10":0,"11":0.00574,"12":0.00574,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00574,"24":0,"25":0,"26":0,"27":0,"28":0.00574,"29":0,"30":0,"31":0.01722,"32":0,"33":0,"34":0,"35":0.01148,"36":0,"37":0,"38":0,"39":0,"40":0.01722,"41":0,"42":0.00574,"43":0,"44":0.09186,"45":0,"46":0,"47":0.01148,"48":0,"49":0.30427,"50":0,"51":0.00574,"52":0,"53":0,"54":0.00574,"55":0.00574,"56":0.00574,"57":0.00574,"58":0.01148,"59":0.02871,"60":0.00574,"61":0,"62":0.00574,"63":0.03445,"64":0.01148,"65":0.00574,"66":0,"67":0.00574,"68":0.03445,"69":0.02871,"70":0.01722,"71":0.13778,"72":0.04593,"73":0.05167,"74":0.10908,"75":0.08037,"76":0.02871,"77":0.01722,"78":0.12056,"79":0.3215,"80":15.29402,"81":5.63192,"83":0.00574,"84":0.00574,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00574,"36":0,"37":0,"38":0.0976,"39":0,"40":0.00574,"41":0,"42":0.00574,"43":0.01148,"44":0,"45":0.00574,"46":0,"47":0.00574,"48":0,"49":0,"50":0,"51":0,"52":0.04593,"53":0,"54":0,"55":0,"56":0.02296,"57":0,"58":0,"59":0,"60":0.00574,"61":0,"62":0.00574,"63":0,"64":0.00574,"65":0,"66":0,"67":0,"68":0.14927,"69":0,"70":0,"71":0.00574,"72":0.02296,"73":0.01148,"74":0.40761,"75":0.63151,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00574,"15":0,"16":0,"17":0,"18":0,"19":0.01148,"20":0.00574,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00574,"29":0,"30":0.00574,"31":0,"32":0.00574,"33":0.00574,"34":0,"35":0,"36":0.02296,"37":0.00574,"38":0.00574,"39":0,"40":0,"41":0,"42":0.01148,"43":0,"44":0,"45":0.00574,"46":0.01722,"47":0.02296,"48":0.00574,"49":0,"50":0,"51":0,"52":0,"53":0.01148,"54":0.00574,"55":0.00574,"56":0,"57":0.00574,"58":0.13204,"60":0,"62":0,"63":0.00574,"64":0.00574,"65":0.02296,"66":0.00574,"67":2.70975,"68":0.01148,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0.00574,"11.6":0,"12.1":0.05741},G:{"8":0.00058,"3.2":0.00058,"4.0-4.1":0,"4.2-4.3":0.00117,"5.0-5.1":0.00583,"6.0-6.1":0.00175,"7.0-7.1":0.00583,"8.1-8.4":0.00816,"9.0-9.2":0.00699,"9.3":0.08394,"10.0-10.2":0.02157,"10.3":0.07403,"11.0-11.2":0.0478,"11.3-11.4":0.08102,"12.0-12.1":0.10026,"12.2-12.4":0.65691,"13.0-13.1":0.13989,"13.2":0.0682,"13.3":3.81906,"13.4":0.70762},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00574,"13":0.35594,_:"0","3.1":0,"3.2":0,"5.1":0.02871,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.01722,"12.1":0.15501,"13.1":0.13778},I:{"3":0.00222,"4":0.01997,_:"81","2.1":0,"2.2":0.00666,"2.3":0.00222,"4.1":0.04437,"4.2-4.3":0.09318,"4.4":0,"4.4.3-4.4.4":0.64118},B:{"12":0.01722,"13":0.01722,"14":0.02296,"15":0.02296,"16":0.00574,"17":0.02871,"18":0.28705,_:"79 80 81"},P:{"4":1.5428,"5.0-5.4":0.19159,"6.2-6.4":0.13109,"7.2-7.4":0.39326,"8.2":0.07059,"9.2":0.53443,"10.1":0.82686,"11.1":0.91761},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03935,"9":0.01574,"10":0.00787,"11":0.42502,"5.5":0},N:{"10":0,"11":0.01704},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.05537},O:{"0":2.44041},Q:{"1.2":0.0213},S:{"2.5":0},H:{"0":3.82651},L:{"0":42.43075}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TK.js b/website/www/node_modules/caniuse-lite/data/regions/TK.js new file mode 100644 index 000000000000..5e467e91110c --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TK.js @@ -0,0 +1 @@ +module.exports={D:{"56":0.92785,"66":1.85015,"68":3.70585,"80":13.89,"81":17.59585,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 67 69 70 71 72 73 74 75 76 77 78 79 83 84 85"},C:{"74":0.92785,"75":4.62815,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 76 77 78 3.5 3.6"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.0003,"3.2":0.0003,"4.0-4.1":0,"4.2-4.3":0.00059,"5.0-5.1":0.00296,"6.0-6.1":0.00089,"7.0-7.1":0.00296,"8.1-8.4":0.00415,"9.0-9.2":0.00356,"9.3":0.04268,"10.0-10.2":0.01097,"10.3":0.03764,"11.0-11.2":0.0243,"11.3-11.4":0.04119,"12.0-12.1":0.05097,"12.2-12.4":0.334,"13.0-13.1":0.07113,"13.2":0.03467,"13.3":1.94177,"13.4":0.35978},E:{"4":0,_:"0 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.92785},I:{"3":0,"4":0,_:"81","2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},B:{"13":0.92785,"14":3.70585,"17":2.778,"18":3.70585,_:"12 15 16 79 80 81"},P:{"4":0.10389,"5.0-5.4":0.01039,"6.2-6.4":2.96679,"7.2-7.4":0.02078,"8.2":0,"9.2":5.92321,"10.1":0.11427,"11.1":0.68564},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{"10":0.06275,"11":0.15687},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":32.59519}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TL.js b/website/www/node_modules/caniuse-lite/data/regions/TL.js new file mode 100644 index 000000000000..84adaf745678 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TL.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00144,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00144,"27":0,"28":0,"29":0,"30":0,"31":0.00288,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00433,"38":0,"39":0,"40":0.00433,"41":0,"42":0.00577,"43":0.01154,"44":0,"45":0,"46":0.00144,"47":0,"48":0,"49":0.01442,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00144,"56":0.00721,"57":0,"58":0.00288,"59":0,"60":0,"61":0,"62":0,"63":0.00433,"64":0,"65":0.00144,"66":0.00144,"67":0.00144,"68":0,"69":0.00144,"70":0.00144,"71":0.00433,"72":0.00288,"73":0.01586,"74":0.00144,"75":0.00144,"76":0.00288,"77":0.00288,"78":0.00577,"79":0.01009,"80":0.56671,"81":0.34752,"83":0.00144,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.00144,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00144,"19":0,"20":0.00144,"21":0.00144,"22":0,"23":0,"24":0.00144,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00144,"31":0,"32":0,"33":0,"34":0.00144,"35":0.00288,"36":0.00144,"37":0.00144,"38":0.00144,"39":0.00144,"40":0.00144,"41":0.00144,"42":0.00144,"43":0.00288,"44":0.00144,"45":0.00288,"46":0.00144,"47":0.01009,"48":0.01009,"49":0,"50":0,"51":0.00144,"52":0.00865,"53":0,"54":0.00144,"55":0,"56":0.00288,"57":0.00433,"58":0.00288,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00144,"66":0.00721,"67":0.00144,"68":0.01442,"69":0.00721,"70":0.00577,"71":0.00144,"72":0.0173,"73":0.00721,"74":0.11969,"75":0.22495,"76":0.0173,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00288,"31":0,"32":0,"33":0,"34":0.00144,"35":0,"36":0,"37":0.0548,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00144,"47":0.00433,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00144,"54":0,"55":0,"56":0,"57":0.00144,"58":0,"60":0.00144,"62":0,"63":0.00288,"64":0,"65":0.00144,"66":0.00144,"67":0.03028,"68":0.00144,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00288},G:{"8":0.00047,"3.2":0.00047,"4.0-4.1":0,"4.2-4.3":0.00093,"5.0-5.1":0.00467,"6.0-6.1":0.0014,"7.0-7.1":0.00467,"8.1-8.4":0.00654,"9.0-9.2":0.00561,"9.3":0.06727,"10.0-10.2":0.01729,"10.3":0.05933,"11.0-11.2":0.03831,"11.3-11.4":0.06494,"12.0-12.1":0.08035,"12.2-12.4":0.5265,"13.0-13.1":0.11212,"13.2":0.05466,"13.3":3.0609,"13.4":0.56715},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00433,"9":0,"10":0,"11":0.00144,"12":0.00144,"13":0.02307,_:"0","3.1":0,"3.2":0,"5.1":0.01586,"6.1":0,"7.1":0,"9.1":0.00288,"10.1":0.00288,"11.1":0.00433,"12.1":0.00144,"13.1":0.00721},I:{"3":0.00216,"4":0.01948,_:"81","2.1":0,"2.2":0.00649,"2.3":0.00216,"4.1":0.04329,"4.2-4.3":0.09091,"4.4":0,"4.4.3-4.4.4":0.62558},B:{"12":0.00288,"13":0.00144,"14":0,"15":0.01298,"16":0.00144,"17":0.00865,"18":0.04614,_:"79 80 81"},P:{"4":1.77665,"5.0-5.4":0.05047,"6.2-6.4":0.14132,"7.2-7.4":0.64605,"8.2":0.05047,"9.2":0.41388,"10.1":0.51482,"11.1":0.45426},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00592,"9":0,"10":0.00395,"11":0.06512,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.05135},O:{"0":1.24091},Q:{"1.2":0.05991},S:{"2.5":0},H:{"0":1.69335},L:{"0":84.43803}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TM.js b/website/www/node_modules/caniuse-lite/data/regions/TM.js new file mode 100644 index 000000000000..97330f5c61fc --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0.0103,"9":0.00343,"10":0,"11":0.00686,"12":0.00343,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00343,"35":0,"36":0,"37":0,"38":0.00343,"39":0.00343,"40":0.01373,"41":0,"42":0,"43":0,"44":0.00343,"45":0,"46":0.00686,"47":0,"48":0,"49":0.05834,"50":0,"51":0.00343,"52":0.12698,"53":0.0103,"54":0.00343,"55":0,"56":0.00343,"57":0.00686,"58":0.0103,"59":0,"60":0,"61":0.0103,"62":0,"63":0.0103,"64":0.00343,"65":0.01716,"66":0,"67":0.0103,"68":0.00343,"69":0.03089,"70":0.00686,"71":0.01716,"72":0.02059,"73":0.01716,"74":0.03432,"75":0.01716,"76":0.01716,"77":0.03775,"78":0.03432,"79":0.07207,"80":5.94079,"81":1.65766,"83":0.0103,"84":0.00343,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00686,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.06521,"39":0,"40":0.00343,"41":0.00343,"42":0,"43":0.00343,"44":0,"45":0,"46":0,"47":0.00343,"48":0.0103,"49":0,"50":0,"51":0,"52":0.00343,"53":0.00343,"54":0,"55":0,"56":0,"57":0.00343,"58":0,"59":0,"60":0.00343,"61":0,"62":0,"63":0,"64":0.00343,"65":0,"66":0,"67":0,"68":0.04805,"69":0.00343,"70":0.00343,"71":0.00343,"72":0.00686,"73":0.04462,"74":0.12355,"75":0.07894,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.0103,"34":0,"35":0.00686,"36":0.00343,"37":0.00343,"38":0.00343,"39":0.00343,"40":0,"41":0,"42":0,"43":0.00343,"44":0,"45":0,"46":0,"47":0.00686,"48":0,"49":0.00343,"50":0,"51":0.00343,"52":0,"53":0.00343,"54":0,"55":0,"56":0.08923,"57":0.00686,"58":0.01373,"60":0,"62":0,"63":0,"64":0.00343,"65":0.00343,"66":0.01373,"67":0.02059,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00062,"3.2":0.00062,"4.0-4.1":0,"4.2-4.3":0.00125,"5.0-5.1":0.00624,"6.0-6.1":0.00187,"7.0-7.1":0.00624,"8.1-8.4":0.00874,"9.0-9.2":0.00749,"9.3":0.08988,"10.0-10.2":0.02309,"10.3":0.07927,"11.0-11.2":0.05118,"11.3-11.4":0.08676,"12.0-12.1":0.10736,"12.2-12.4":0.70344,"13.0-13.1":0.1498,"13.2":0.07303,"13.3":4.08956,"13.4":0.75774},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.06864,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00343,"12.1":0.00343,"13.1":0.02402},I:{"3":0.0116,"4":0.10444,_:"81","2.1":0,"2.2":0.03481,"2.3":0.0116,"4.1":0.2321,"4.2-4.3":0.48741,"4.4":0,"4.4.3-4.4.4":3.35382},B:{"12":0.00343,"13":0.12355,"14":0.00343,"15":0.00343,"16":0,"17":0.01373,"18":0.05491,_:"79 80 81"},P:{"4":6.17326,"5.0-5.4":0.21393,"6.2-6.4":0.1528,"7.2-7.4":0.90663,"8.2":0.19355,"9.2":0.95757,"10.1":1.25299,"11.1":4.03401},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01865,"9":0.00373,"10":0.00746,"11":0.14176,"5.5":0},N:{"10":0,"11":0.13793},J:{"7":0,"10":0.04598},R:{_:"0"},M:{"0":0.15763},O:{"0":3.36938},Q:{"1.2":0.01314},S:{"2.5":0},H:{"0":1.08196},L:{"0":52.22239}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TN.js b/website/www/node_modules/caniuse-lite/data/regions/TN.js new file mode 100644 index 000000000000..340774ea6d82 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0.00596,"9":0,"10":0,"11":0.00596,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01192,"37":0,"38":0.00596,"39":0.00596,"40":0.00596,"41":0.00596,"42":0.00596,"43":0.01192,"44":0,"45":0,"46":0.00596,"47":0.00596,"48":0,"49":0.63751,"50":0,"51":0.00596,"52":0.00596,"53":0.00596,"54":0,"55":0,"56":0.01192,"57":0,"58":0.02979,"59":0.00596,"60":0.01192,"61":0.02979,"62":0.01787,"63":0.08341,"64":0.00596,"65":0.0715,"66":0.04171,"67":0.0715,"68":0.02383,"69":0.03575,"70":0.16087,"71":0.10129,"72":0.13108,"73":0.06554,"74":0.0715,"75":0.04766,"76":0.08341,"77":0.10129,"78":0.20257,"79":0.34556,"80":17.11138,"81":8.95487,"83":0.03575,"84":0.01192,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00596,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00596,"44":0,"45":0,"46":0,"47":0.01192,"48":0.00596,"49":0,"50":0.00596,"51":0,"52":0.03575,"53":0,"54":0,"55":0,"56":0.00596,"57":0,"58":0,"59":0,"60":0.00596,"61":0,"62":0,"63":0.01192,"64":0.02383,"65":0.02383,"66":0.00596,"67":0.00596,"68":0.08937,"69":0,"70":0,"71":0.00596,"72":0.02383,"73":0.01192,"74":0.60772,"75":1.03073,"76":0.02383,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00596,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01192,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00596,"58":0.01787,"60":0,"62":0,"63":0,"64":0,"65":0.01192,"66":0.01192,"67":1.66824,"68":0.01787,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00042,"3.2":0.00042,"4.0-4.1":0,"4.2-4.3":0.00084,"5.0-5.1":0.0042,"6.0-6.1":0.00126,"7.0-7.1":0.0042,"8.1-8.4":0.00587,"9.0-9.2":0.00504,"9.3":0.06043,"10.0-10.2":0.01553,"10.3":0.05329,"11.0-11.2":0.03441,"11.3-11.4":0.05833,"12.0-12.1":0.07218,"12.2-12.4":0.47292,"13.0-13.1":0.10071,"13.2":0.0491,"13.3":2.74938,"13.4":0.50942},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00596,"9":0,"10":0.00596,"11":0.02383,"12":0.0715,"13":0.30386,_:"0","3.1":0,"3.2":0,"5.1":0.00596,"6.1":0,"7.1":0,"9.1":0.00596,"10.1":0.05362,"11.1":0.09533,"12.1":0.11916,"13.1":0.16682},I:{"3":0.00158,"4":0.01421,_:"81","2.1":0,"2.2":0.00474,"2.3":0.00158,"4.1":0.03157,"4.2-4.3":0.0663,"4.4":0,"4.4.3-4.4.4":0.4562},B:{"12":0.00596,"13":0.00596,"14":0.01787,"15":0.01192,"16":0.00596,"17":0.06554,"18":0.47068,_:"79 80 81"},P:{"4":0.35699,"5.0-5.4":0,"6.2-6.4":0.0204,"7.2-7.4":0.1224,"8.2":0.0204,"9.2":0.1734,"10.1":0.35699,"11.1":1.77477},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03528,"9":0.01411,"10":0.00706,"11":0.21167,"5.5":0},N:{"10":0,"11":0.04446},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.0768},O:{"0":0.3274},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.18751},L:{"0":55.11428}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TO.js b/website/www/node_modules/caniuse-lite/data/regions/TO.js new file mode 100644 index 000000000000..f1299cb3aaf3 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TO.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01896,"50":0.00474,"51":0,"52":0,"53":0,"54":0,"55":0.01422,"56":0,"57":0,"58":0.00948,"59":0,"60":0,"61":0,"62":0,"63":0.02371,"64":0,"65":0.00474,"66":0,"67":0.00474,"68":0.00948,"69":0.04267,"70":0.00474,"71":0,"72":0.05689,"73":0.00474,"74":0.03793,"75":0.03319,"76":0.01896,"77":0.54047,"78":0.01896,"79":0.04267,"80":3.73117,"81":3.92555,"83":0.00474,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00474,"33":0,"34":0,"35":0,"36":0,"37":0.02845,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00948,"45":0,"46":0.00474,"47":0.00474,"48":0,"49":0,"50":0.01422,"51":0,"52":0.46462,"53":0,"54":0,"55":0,"56":0.00948,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00474,"68":0.00474,"69":0.00948,"70":0,"71":0.00474,"72":0.03319,"73":0.00474,"74":0.53099,"75":0.49781,"76":0.03319,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00474,"47":0.00948,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00948,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00474,"66":0,"67":0.2086,"68":0.00474,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00099,"3.2":0.00099,"4.0-4.1":0,"4.2-4.3":0.00198,"5.0-5.1":0.00989,"6.0-6.1":0.00297,"7.0-7.1":0.00989,"8.1-8.4":0.01385,"9.0-9.2":0.01187,"9.3":0.14248,"10.0-10.2":0.03661,"10.3":0.12566,"11.0-11.2":0.08114,"11.3-11.4":0.13754,"12.0-12.1":0.17019,"12.2-12.4":1.11514,"13.0-13.1":0.23747,"13.2":0.11577,"13.3":6.48304,"13.4":1.20122},E:{"4":0,"5":0,"6":0,"7":0.02371,"8":0,"9":0,"10":0.04741,"11":0.01422,"12":0.02371,"13":0.67322,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00474,"10.1":0.00474,"11.1":0.00948,"12.1":0.04267,"13.1":0.14697},I:{"3":0.01023,"4":0.09203,_:"81","2.1":0,"2.2":0.03068,"2.3":0.01023,"4.1":0.20451,"4.2-4.3":0.42946,"4.4":0,"4.4.3-4.4.4":2.95512},B:{"12":0.02845,"13":0.01422,"14":0.01422,"15":0.02371,"16":0.06163,"17":0.82968,"18":0.89131,_:"79 80 81"},P:{"4":0.46202,"5.0-5.4":0.05134,"6.2-6.4":0.15401,"7.2-7.4":0.26694,"8.2":0.0308,"9.2":0.40042,"10.1":3.03906,"11.1":0.97537},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0103,"9":0,"10":0,"11":1.3077,"5.5":0},N:{"10":0,"11":0.01578},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.03155},O:{"0":0.58901},Q:{"1.2":1.01499},S:{"2.5":0},H:{"0":0.0946},L:{"0":61.05931}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TR.js b/website/www/node_modules/caniuse-lite/data/regions/TR.js new file mode 100644 index 000000000000..a32993a5b499 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TR.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00611,"23":0,"24":0,"25":0,"26":0.00204,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00611,"35":0,"36":0,"37":0,"38":0.01223,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00204,"48":0.00204,"49":0.03261,"50":0,"51":0,"52":0,"53":0.00815,"54":0,"55":0.00204,"56":0.00204,"57":0,"58":0.00204,"59":0.00204,"60":0,"61":0.00204,"62":0.00204,"63":0.00611,"64":0.00204,"65":0.00204,"66":0.00204,"67":0.00408,"68":0.00204,"69":0.00408,"70":0.01834,"71":0.03057,"72":0.01834,"73":0.0163,"74":0.01019,"75":0.01223,"76":0.01019,"77":0.01019,"78":0.01834,"79":0.03057,"80":1.9361,"81":0.96397,"83":0.00204,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00204,"49":0,"50":0,"51":0,"52":0.00408,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00408,"64":0.00204,"65":0.00204,"66":0.00204,"67":0,"68":0.05706,"69":0,"70":0,"71":0,"72":0.00204,"73":0.00204,"74":0.0428,"75":0.07744,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00204,"32":0.00204,"33":0,"34":0,"35":0,"36":0.00204,"37":0,"38":0,"39":0,"40":0.00204,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00204,"57":0.00204,"58":0.00204,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.18953,"68":0.00408,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00144,"3.2":0.00144,"4.0-4.1":0,"4.2-4.3":0.00288,"5.0-5.1":0.01441,"6.0-6.1":0.00432,"7.0-7.1":0.01441,"8.1-8.4":0.02018,"9.0-9.2":0.0173,"9.3":0.20757,"10.0-10.2":0.05333,"10.3":0.18307,"11.0-11.2":0.1182,"11.3-11.4":0.20036,"12.0-12.1":0.24793,"12.2-12.4":1.62453,"13.0-13.1":0.34595,"13.2":0.16865,"13.3":9.44448,"13.4":1.74994},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00204,"12":0.00408,"13":0.05503,_:"0","3.1":0,"3.2":0,"5.1":0.02038,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00204,"11.1":0.00611,"12.1":0.0163,"13.1":0.05503},I:{"3":0.00043,"4":0.00385,_:"81","2.1":0,"2.2":0.00128,"2.3":0.00043,"4.1":0.00856,"4.2-4.3":0.01799,"4.4":0,"4.4.3-4.4.4":0.12376},B:{"12":0.00204,"13":0.00204,"14":0.00204,"15":0.00204,"16":0.00204,"17":0.00815,"18":0.10394,_:"79 80 81"},P:{"4":0.52423,"5.0-5.4":0.07057,"6.2-6.4":0.06049,"7.2-7.4":0.34276,"8.2":0.07057,"9.2":0.34276,"10.1":0.7561,"11.1":4.6878},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00624,"9":0.00208,"10":0.00208,"11":0.08742,"5.5":0},N:{"10":0,"11":0.02389},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.27071},O:{"0":0.19905},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.4975},L:{"0":71.18583}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TT.js b/website/www/node_modules/caniuse-lite/data/regions/TT.js new file mode 100644 index 000000000000..ce3c43f186ab --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00437,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00437,"35":0,"36":0.00437,"37":0,"38":0.0131,"39":0,"40":0.00437,"41":0,"42":0.00873,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.08295,"50":0,"51":0,"52":0,"53":0.0131,"54":0,"55":0,"56":0.00437,"57":0.00437,"58":0.0131,"59":0,"60":0.0131,"61":0.00437,"62":0.0131,"63":0.0131,"64":0,"65":0.03493,"66":0.00873,"67":0.00873,"68":0.00437,"69":0.0131,"70":0.01746,"71":0.0131,"72":0.0131,"73":0.0131,"74":0.01746,"75":0.03056,"76":0.04366,"77":0.01746,"78":0.03056,"79":0.08732,"80":7.57064,"81":3.61941,"83":0.00873,"84":0.00437,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00873,"49":0,"50":0,"51":0,"52":0.01746,"53":0,"54":0,"55":0,"56":0.00437,"57":0,"58":0,"59":0,"60":0.00437,"61":0,"62":0,"63":0,"64":0,"65":0.00437,"66":0.00437,"67":0,"68":0.07859,"69":0.00437,"70":0,"71":0,"72":0.00873,"73":0.00873,"74":0.41477,"75":0.65053,"76":0.00873,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00437,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.31435,"68":0.00873,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00147,"3.2":0.00147,"4.0-4.1":0,"4.2-4.3":0.00294,"5.0-5.1":0.01468,"6.0-6.1":0.0044,"7.0-7.1":0.01468,"8.1-8.4":0.02056,"9.0-9.2":0.01762,"9.3":0.21143,"10.0-10.2":0.05433,"10.3":0.18647,"11.0-11.2":0.1204,"11.3-11.4":0.20409,"12.0-12.1":0.25254,"12.2-12.4":1.65472,"13.0-13.1":0.35238,"13.2":0.17179,"13.3":9.62,"13.4":1.78246},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00437,"12":0.06112,"13":0.72476,_:"0","3.1":0,"3.2":0,"5.1":0.04366,"6.1":0,"7.1":0,"9.1":0,"10.1":0.03929,"11.1":0.11788,"12.1":0.11352,"13.1":0.66363},I:{"3":0.00369,"4":0.03317,_:"81","2.1":0,"2.2":0.01106,"2.3":0.00369,"4.1":0.07371,"4.2-4.3":0.15479,"4.4":0,"4.4.3-4.4.4":1.06507},B:{"12":0.00437,"13":0.00437,"14":0.00437,"15":0.00873,"16":0.01746,"17":0.06986,"18":1.19628,_:"79 80 81"},P:{"4":0.20532,"5.0-5.4":0.01081,"6.2-6.4":0,"7.2-7.4":0.27015,"8.2":0.01081,"9.2":0.59433,"10.1":0.49708,"11.1":5.79205},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00446,"10":0.00446,"11":0.20502,"5.5":0},N:{"10":0.00845,"11":0.00845},J:{"7":0,"10":0.01127},R:{_:"0"},M:{"0":0.14648},O:{"0":0.14648},Q:{"1.2":0.01127},S:{"2.5":0},H:{"0":0.40004},L:{"0":55.36523}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TV.js b/website/www/node_modules/caniuse-lite/data/regions/TV.js new file mode 100644 index 000000000000..0fb39b27c5d0 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TV.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.04805,"58":0,"59":0,"60":0.09979,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.71333,"69":0,"70":0,"71":0.02587,"72":0,"73":0,"74":0.02587,"75":0,"76":0,"77":0.51374,"78":0,"79":0.07392,"80":5.69554,"81":3.8771,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.02587,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02587,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.12197,"75":0.39178,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.07392,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00012,"3.2":0.00012,"4.0-4.1":0,"4.2-4.3":0.00024,"5.0-5.1":0.00118,"6.0-6.1":0.00035,"7.0-7.1":0.00118,"8.1-8.4":0.00165,"9.0-9.2":0.00141,"9.3":0.01693,"10.0-10.2":0.00435,"10.3":0.01494,"11.0-11.2":0.00964,"11.3-11.4":0.01635,"12.0-12.1":0.02023,"12.2-12.4":0.13254,"13.0-13.1":0.02822,"13.2":0.01376,"13.3":0.77054,"13.4":0.14277},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02587,"11.1":0.09979,"12.1":0.02587,"13.1":0.07392},I:{"3":0.00054,"4":0.00483,_:"81","2.1":0,"2.2":0.00161,"2.3":0.00054,"4.1":0.01073,"4.2-4.3":0.02254,"4.4":0,"4.4.3-4.4.4":0.1551},B:{"12":0,"13":0,"14":0,"15":0.17002,"16":0,"17":0.02587,"18":0.80942,_:"79 80 81"},P:{"4":0.2007,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.67234,"8.2":0,"9.2":0.33115,"10.1":0,"11.1":0.27094},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.22176,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.06934},O:{"0":0.4665},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.12533},L:{"0":82.52075}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TW.js b/website/www/node_modules/caniuse-lite/data/regions/TW.js new file mode 100644 index 000000000000..f5248b7d85be --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00473,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00473,"23":0,"24":0.0142,"25":0,"26":0.00473,"27":0,"28":0,"29":0,"30":0.00473,"31":0,"32":0,"33":0,"34":0.0142,"35":0,"36":0,"37":0,"38":0.06628,"39":0.00473,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00473,"47":0.00473,"48":0.00473,"49":0.20356,"50":0.00473,"51":0.00473,"52":0,"53":0.13729,"54":0.00473,"55":0.00947,"56":0.00473,"57":0.00473,"58":0.00947,"59":0.00473,"60":0.00473,"61":0.01894,"62":0.00473,"63":0.00947,"64":0.01894,"65":0.0142,"66":0.0142,"67":0.0284,"68":0.0142,"69":0.02367,"70":0.02367,"71":0.03787,"72":0.0284,"73":0.06154,"74":0.05207,"75":0.05681,"76":0.04734,"77":0.05207,"78":0.07574,"79":0.16096,"80":10.06922,"81":5.4583,"83":0.00947,"84":0.00473,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02367,"53":0,"54":0,"55":0,"56":0.00473,"57":0,"58":0,"59":0,"60":0.00473,"61":0,"62":0,"63":0,"64":0,"65":0.00473,"66":0.00473,"67":0.00473,"68":0.03787,"69":0.00473,"70":0.00473,"71":0.00473,"72":0.0142,"73":0.00947,"74":0.2225,"75":0.46867,"76":0.00473,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00473,"37":0.03787,"38":0,"39":0,"40":0.00473,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00473,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00473,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.08048,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00347,"3.2":0.00347,"4.0-4.1":0,"4.2-4.3":0.00694,"5.0-5.1":0.03471,"6.0-6.1":0.01041,"7.0-7.1":0.03471,"8.1-8.4":0.04859,"9.0-9.2":0.04165,"9.3":0.4998,"10.0-10.2":0.12842,"10.3":0.44079,"11.0-11.2":0.28461,"11.3-11.4":0.48244,"12.0-12.1":0.59698,"12.2-12.4":3.9116,"13.0-13.1":0.83299,"13.2":0.40608,"13.3":22.74071,"13.4":4.21356},E:{"4":0,"5":0,"6":0,"7":0.00473,"8":0.00473,"9":0,"10":0.00473,"11":0.00947,"12":0.03314,"13":1.09355,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00947,"10.1":0.0284,"11.1":0.04261,"12.1":0.11835,"13.1":0.27931},I:{"3":0.00064,"4":0.00575,_:"81","2.1":0,"2.2":0.00192,"2.3":0.00064,"4.1":0.01277,"4.2-4.3":0.02683,"4.4":0,"4.4.3-4.4.4":0.18459},B:{"12":0,"13":0,"14":0.00473,"15":0.00473,"16":0.00473,"17":0.0284,"18":0.61542,_:"79 80 81"},P:{"4":0.3969,"5.0-5.4":0.02145,"6.2-6.4":0.02145,"7.2-7.4":0.08582,"8.2":0.07509,"9.2":0.31108,"10.1":0.50417,"11.1":2.05959},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01587,"9":0.01058,"10":0.01058,"11":0.50264,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.08426},O:{"0":0.08952},Q:{"1.2":0.01053},S:{"2.5":0},H:{"0":0.61322},L:{"0":37.81782}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/TZ.js b/website/www/node_modules/caniuse-lite/data/regions/TZ.js new file mode 100644 index 000000000000..102c03892857 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/TZ.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.00338,"21":0.01353,"28":0.00677,"29":0.00338,"31":0.00338,"32":0.05413,"33":0.00677,"36":0.00677,"38":0.00338,"40":0.00677,"43":0.0203,"46":0.00338,"48":0.02706,"49":0.12517,"50":0.03721,"51":0.00338,"53":0.00677,"55":0.01692,"57":0.03383,"58":0.0406,"59":0.00338,"60":0.01692,"61":0.00338,"62":0.01015,"63":0.15224,"64":0.01015,"65":0.04398,"66":0.00338,"67":0.02706,"68":0.01015,"69":0.10149,"70":0.02368,"71":0.08796,"72":0.02706,"73":0.07781,"74":0.15562,"75":0.11502,"76":0.09134,"77":0.08458,"78":0.14885,"79":0.24696,"80":9.80393,"81":5.67329,"83":0.05075,"84":0.0406,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 30 34 35 37 39 41 42 44 45 47 52 54 56 85"},C:{"6":0.00677,"14":0.01015,"15":0.00677,"16":0.00338,"17":0.00677,"18":0.00677,"19":0.00677,"20":0.01015,"21":0.0203,"23":0.01692,"25":0.00677,"26":0.01015,"28":0.00338,"29":0.01015,"30":0.01692,"31":0.00677,"32":0.01353,"33":0.00677,"34":0.01015,"35":0.01353,"37":0.01015,"38":0.01015,"39":0.00677,"40":0.01015,"41":0.0203,"42":0.01353,"43":0.04736,"44":0.02706,"45":0.01353,"46":0.01692,"47":0.06089,"48":0.07443,"49":0.0203,"50":0.00677,"51":0.00338,"52":0.0406,"53":0.03045,"54":0.00677,"55":0.00677,"56":0.0406,"57":0.01015,"58":0.00677,"59":0.01015,"60":0.01353,"61":0.01015,"62":0.00338,"63":0.00677,"64":0.0203,"65":0.02706,"66":0.00677,"67":0.01015,"68":0.11502,"69":0.03721,"70":0.0203,"71":0.0406,"72":0.09472,"73":0.09811,"74":1.78284,"75":2.83157,"76":0.30447,_:"2 3 4 5 7 8 9 10 11 12 13 22 24 27 36 77 78 3.5 3.6"},F:{"15":0.00338,"36":0.01015,"42":0.00338,"57":0.00338,"58":0.00338,"62":0.00677,"63":0.00677,"64":0.01353,"65":0.08119,"66":0.08796,"67":1.9114,"68":0.08796,_:"9 11 12 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 60 9.5-9.6 10.5 10.6 11.1 11.5 12.1","10.0-10.1":0,"11.6":0.00338},G:{"8":0.00047,"3.2":0.00047,"4.0-4.1":0,"4.2-4.3":0.00095,"5.0-5.1":0.00474,"6.0-6.1":0.00142,"7.0-7.1":0.00474,"8.1-8.4":0.00664,"9.0-9.2":0.00569,"9.3":0.06829,"10.0-10.2":0.01755,"10.3":0.06023,"11.0-11.2":0.03889,"11.3-11.4":0.06592,"12.0-12.1":0.08157,"12.2-12.4":0.53448,"13.0-13.1":0.11382,"13.2":0.05549,"13.3":3.10728,"13.4":0.57574},E:{"4":0.00338,"8":0.04398,"9":0.11502,"10":0.00677,"11":0.07104,"12":0.11502,"13":0.6563,_:"0 5 6 7 3.1 3.2 6.1 7.1","5.1":0.01015,"9.1":0.02368,"10.1":0.08119,"11.1":0.16915,"12.1":0.30785,"13.1":0.52437},I:{"3":0.00111,"4":0.00995,_:"81","2.1":0,"2.2":0.00332,"2.3":0.00111,"4.1":0.02212,"4.2-4.3":0.04645,"4.4":0,"4.4.3-4.4.4":0.31959},B:{"12":0.11502,"13":0.08119,"14":0.02706,"15":0.03383,"16":0.05413,"17":0.12855,"18":1.30246,_:"79 80 81"},P:{"4":0.56416,"5.0-5.4":0.06154,"6.2-6.4":0.02051,"7.2-7.4":0.18463,"8.2":0.04103,"9.2":0.37953,"10.1":0.65648,"11.1":1.05652},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.12705,"10":0.06018,"11":0.66867,_:"6 7 9 5.5"},N:{"10":0,"11":0.07279},J:{"7":0,"10":0.01985},R:{_:"0"},M:{"0":0.2316},O:{"0":4.40692},Q:{"1.2":0.01985},S:{"2.5":0.20513},H:{"0":11.10704},L:{"0":42.8779}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/UA.js b/website/www/node_modules/caniuse-lite/data/regions/UA.js new file mode 100644 index 000000000000..2670f1f58f3b --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/UA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00722,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00722,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00722,"37":0,"38":0.01445,"39":0,"40":0.00722,"41":0.05779,"42":0.00722,"43":0,"44":0,"45":0.00722,"46":0.00722,"47":0.00722,"48":0,"49":0.67906,"50":0,"51":0.01445,"52":0.00722,"53":0.01445,"54":0,"55":0.00722,"56":0.02167,"57":0.02167,"58":0.0289,"59":0.05057,"60":0.01445,"61":0.15893,"62":0.01445,"63":0.0289,"64":0.02167,"65":0.02167,"66":0.0289,"67":0.03612,"68":0.03612,"69":0.10836,"70":0.23117,"71":0.24562,"72":0.2095,"73":0.21672,"74":0.14448,"75":0.13726,"76":0.12281,"77":0.1517,"78":0.2095,"79":0.38287,"80":21.45528,"81":10.33754,"83":0.0289,"84":0.02167,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.02167,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.01445,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00722,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0289,"46":0.00722,"47":0.02167,"48":0.00722,"49":0.01445,"50":0.00722,"51":0.01445,"52":0.1806,"53":0.01445,"54":0.01445,"55":0.01445,"56":0.02167,"57":0.03612,"58":0.00722,"59":0,"60":0.07224,"61":0.01445,"62":0.00722,"63":0.03612,"64":0.03612,"65":0.0289,"66":0.02167,"67":0.01445,"68":0.17338,"69":0.01445,"70":0.01445,"71":0.01445,"72":0.05779,"73":0.04334,"74":0.99691,"75":1.49537,"76":0.02167,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0.00722,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00722,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.07224,"37":0.00722,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00722,"44":0,"45":0,"46":0.00722,"47":0.00722,"48":0.00722,"49":0,"50":0,"51":0,"52":0,"53":0.00722,"54":0.00722,"55":0.00722,"56":0.02167,"57":0.01445,"58":0.01445,"60":0.02167,"62":0.00722,"63":0.00722,"64":0.00722,"65":0.0289,"66":0.03612,"67":4.61614,"68":0.13726,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.05779},G:{"8":0.00081,"3.2":0.00081,"4.0-4.1":0,"4.2-4.3":0.00162,"5.0-5.1":0.0081,"6.0-6.1":0.00243,"7.0-7.1":0.0081,"8.1-8.4":0.01134,"9.0-9.2":0.00972,"9.3":0.11659,"10.0-10.2":0.02996,"10.3":0.10283,"11.0-11.2":0.06639,"11.3-11.4":0.11254,"12.0-12.1":0.13926,"12.2-12.4":0.91249,"13.0-13.1":0.19432,"13.2":0.09473,"13.3":5.3049,"13.4":0.98293},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00722,"11":0.02167,"12":0.11558,"13":1.0547,_:"0","3.1":0,"3.2":0,"5.1":0.06502,"6.1":0,"7.1":0,"9.1":0.00722,"10.1":0.02167,"11.1":0.07946,"12.1":0.26006,"13.1":0.83798},I:{"3":0.00095,"4":0.00855,_:"81","2.1":0,"2.2":0.00285,"2.3":0.00095,"4.1":0.01899,"4.2-4.3":0.03989,"4.4":0,"4.4.3-4.4.4":0.27445},B:{"12":0,"13":0,"14":0.01445,"15":0.01445,"16":0.00722,"17":0.0289,"18":0.28174,_:"79 80 81"},P:{"4":0.07175,"5.0-5.4":0.01025,"6.2-6.4":0.01025,"7.2-7.4":0.0205,"8.2":0.01025,"9.2":0.07175,"10.1":0.123,"11.1":0.74824},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00727,"7":0,"8":0.02181,"9":0.00727,"10":0.00727,"11":2.31141,"5.5":0},N:{"10":0,"11":0.02221},J:{"7":0,"10":0.00833},R:{_:"0"},M:{"0":0.09994},O:{"0":0.53299},Q:{"1.2":0.00833},S:{"2.5":0},H:{"0":0.71485},L:{"0":35.38163}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/UG.js b/website/www/node_modules/caniuse-lite/data/regions/UG.js new file mode 100644 index 000000000000..a3be950ceee7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/UG.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00422,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.01265,"20":0,"21":0,"22":0,"23":0,"24":0.00844,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00422,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00422,"40":0.00844,"41":0,"42":0.00422,"43":0.00422,"44":0,"45":0,"46":0.00422,"47":0.01265,"48":0,"49":0.03796,"50":0.00422,"51":0,"52":0.00422,"53":0.00422,"54":0,"55":0.00422,"56":0.00844,"57":0.00422,"58":0.01687,"59":0,"60":0,"61":0,"62":0.00422,"63":0.04218,"64":0.01687,"65":0.01687,"66":0.00422,"67":0.00844,"68":0.00844,"69":0.01265,"70":0.01687,"71":0.02953,"72":0.02109,"73":0.01687,"74":0.0464,"75":0.05483,"76":0.03796,"77":0.05905,"78":0.10967,"79":0.11389,"80":5.27672,"81":3.29426,"83":0.01265,"84":0.00422,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00422,"11":0,"12":0,"13":0.00422,"14":0,"15":0.00844,"16":0,"17":0.00422,"18":0,"19":0,"20":0,"21":0.00422,"22":0,"23":0.00422,"24":0.00422,"25":0,"26":0,"27":0.00422,"28":0.00422,"29":0.00422,"30":0.00422,"31":0.00422,"32":0.00422,"33":0.00422,"34":0.00422,"35":0.00422,"36":0.00844,"37":0.00422,"38":0.00422,"39":0.00422,"40":0.00422,"41":0.00422,"42":0.00422,"43":0.02109,"44":0.01687,"45":0.01265,"46":0.00422,"47":0.02953,"48":0.01687,"49":0.00844,"50":0.01265,"51":0,"52":0.02531,"53":0,"54":0.00844,"55":0.01265,"56":0.01265,"57":0.00844,"58":0.00844,"59":0.01265,"60":0.01265,"61":0.00844,"62":0.00422,"63":0.00844,"64":0.00844,"65":0.01687,"66":0.00844,"67":0.01687,"68":0.1181,"69":0.02109,"70":0.01265,"71":0.05905,"72":0.08436,"73":0.06327,"74":1.09246,"75":1.73782,"76":0.21512,"77":0.00422,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00422,"15":0,"16":0.00422,"17":0,"18":0,"19":0.00422,"20":0.01265,"21":0,"22":0,"23":0.01687,"24":0,"25":0,"26":0,"27":0,"28":0.00422,"29":0,"30":0.00422,"31":0,"32":0,"33":0,"34":0.00844,"35":0,"36":0,"37":0.00422,"38":0.01265,"39":0,"40":0,"41":0,"42":0.01265,"43":0,"44":0,"45":0.01687,"46":0.08014,"47":0.14763,"48":0.00422,"49":0,"50":0,"51":0,"52":0,"53":0.01265,"54":0.00422,"55":0,"56":0.01265,"57":0.02953,"58":0.00422,"60":0,"62":0,"63":0,"64":0,"65":0.02109,"66":0.02531,"67":0.59896,"68":0.01687,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.05483},G:{"8":0.00068,"3.2":0.00068,"4.0-4.1":0,"4.2-4.3":0.00135,"5.0-5.1":0.00676,"6.0-6.1":0.00203,"7.0-7.1":0.00676,"8.1-8.4":0.00946,"9.0-9.2":0.00811,"9.3":0.0973,"10.0-10.2":0.025,"10.3":0.08581,"11.0-11.2":0.05541,"11.3-11.4":0.09392,"12.0-12.1":0.11622,"12.2-12.4":0.76152,"13.0-13.1":0.16217,"13.2":0.07906,"13.3":4.4272,"13.4":0.8203},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00422,"9":0,"10":0.02109,"11":0.02109,"12":0.05062,"13":0.2573,_:"0","3.1":0,"3.2":0,"5.1":0.24464,"6.1":0,"7.1":0,"9.1":0.02531,"10.1":0.01265,"11.1":0.06327,"12.1":0.09701,"13.1":0.25308},I:{"3":0.00178,"4":0.01603,_:"81","2.1":0,"2.2":0.00534,"2.3":0.00178,"4.1":0.03562,"4.2-4.3":0.07479,"4.4":0,"4.4.3-4.4.4":0.51466},B:{"12":0.70862,"13":0.02109,"14":0.03374,"15":0.02953,"16":0.0464,"17":0.05062,"18":0.47663,_:"79 80 81"},P:{"4":0.30819,"5.0-5.4":0.04109,"6.2-6.4":0.02055,"7.2-7.4":0.12327,"8.2":0.03082,"9.2":0.20546,"10.1":0.53419,"11.1":0.85265},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0225,"9":0,"10":0.0225,"11":0.29245,"5.5":0},N:{"10":0.01253,"11":0.1378},J:{"7":0,"10":0.05204},R:{_:"0"},M:{"0":0.23706},O:{"0":3.28418},Q:{"1.2":0.08673},S:{"2.5":0.26019},H:{"0":8.26578},L:{"0":54.34666}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/US.js b/website/www/node_modules/caniuse-lite/data/regions/US.js new file mode 100644 index 000000000000..446244b1a774 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/US.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00454,"36":0,"37":0.00454,"38":0.00454,"39":0,"40":0.00909,"41":0.01817,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00454,"48":0.01817,"49":0.14538,"50":0,"51":0.00454,"52":0,"53":0.00454,"54":0.00454,"55":0,"56":0.02272,"57":0.00454,"58":0.00909,"59":0.00454,"60":0.01363,"61":0.00909,"62":0.00454,"63":0.02272,"64":0.01363,"65":0.02272,"66":0.01817,"67":0.02272,"68":0.01817,"69":0.02272,"70":0.04543,"71":0.04997,"72":0.07723,"73":0.03634,"74":0.03634,"75":0.0954,"76":0.13629,"77":0.05906,"78":0.13629,"79":0.31347,"80":6.7827,"81":3.26642,"83":0.00909,"84":0.01363,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00454,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00454,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00454,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00454,"44":0.00454,"45":0.00454,"46":0,"47":0.00454,"48":0.00909,"49":0,"50":0.00454,"51":0,"52":0.03634,"53":0,"54":0.01363,"55":0,"56":0.00454,"57":0.00909,"58":0.01363,"59":0.00454,"60":0.00909,"61":0.00454,"62":0,"63":0.00909,"64":0.00909,"65":0.01363,"66":0.00909,"67":0.00454,"68":0.14083,"69":0.00454,"70":0.00454,"71":0.00909,"72":0.02726,"73":0.02726,"74":0.48156,"75":0.80865,"76":0.00454,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00454,"58":0.00454,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.13175,"68":0.00454,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00472,"3.2":0.00472,"4.0-4.1":0,"4.2-4.3":0.00944,"5.0-5.1":0.0472,"6.0-6.1":0.01416,"7.0-7.1":0.0472,"8.1-8.4":0.06608,"9.0-9.2":0.05664,"9.3":0.67963,"10.0-10.2":0.17463,"10.3":0.5994,"11.0-11.2":0.38701,"11.3-11.4":0.65604,"12.0-12.1":0.81179,"12.2-12.4":5.31908,"13.0-13.1":1.13272,"13.2":0.5522,"13.3":30.92336,"13.4":5.72969},E:{"4":0,"5":0,"6":0,"7":0,"8":0.02272,"9":0.00454,"10":0.00454,"11":0.01817,"12":0.04543,"13":1.62185,_:"0","3.1":0,"3.2":0,"5.1":0.00454,"6.1":0,"7.1":0,"9.1":0.0636,"10.1":0.05452,"11.1":0.12266,"12.1":0.19989,"13.1":0.90406},I:{"3":0.00146,"4":0.01313,_:"81","2.1":0,"2.2":0.00438,"2.3":0.00146,"4.1":0.02918,"4.2-4.3":0.06128,"4.4":0,"4.4.3-4.4.4":0.42167},B:{"12":0.00454,"13":0.00454,"14":0.00454,"15":0.00909,"16":0.02272,"17":0.05452,"18":1.55371,_:"79 80 81"},P:{"4":0.0423,"5.0-5.4":0.01058,"6.2-6.4":0,"7.2-7.4":0.03173,"8.2":0.01058,"9.2":0.09518,"10.1":0.14806,"11.1":2.22091},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00476,"8":0.04761,"9":0.33804,"10":0.00952,"11":0.79034,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00546},R:{_:"0"},M:{"0":0.32196},O:{"0":0.13643},Q:{"1.2":0.01637},S:{"2.5":0.00546},H:{"0":0.11366},L:{"0":27.70991}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/UY.js b/website/www/node_modules/caniuse-lite/data/regions/UY.js new file mode 100644 index 000000000000..c0e727143bcd --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/UY.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00546,"39":0,"40":0,"41":0,"42":0.00546,"43":0.00546,"44":0,"45":0,"46":0.02184,"47":0,"48":0.01638,"49":0.26754,"50":0,"51":0,"52":0,"53":0.00546,"54":0,"55":0.00546,"56":0.00546,"57":0,"58":0.00546,"59":0.00546,"60":0.00546,"61":0,"62":0.04914,"63":0.0273,"64":0.01092,"65":0.01638,"66":0.00546,"67":0.02184,"68":0.01638,"69":0.04368,"70":0.03276,"71":0.04914,"72":0.06006,"73":0.03822,"74":0.06006,"75":0.03822,"76":0.56784,"77":0.71526,"78":0.0819,"79":0.18018,"80":13.58994,"81":7.6713,"83":0.01638,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00546,"26":0,"27":0,"28":0.00546,"29":0,"30":0,"31":0,"32":0,"33":0.00546,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00546,"44":0,"45":0.01638,"46":0,"47":0,"48":0.00546,"49":0,"50":0,"51":0,"52":0.06006,"53":0.00546,"54":0.02184,"55":0.06006,"56":0.00546,"57":0.0273,"58":0,"59":0.00546,"60":0.00546,"61":0.00546,"62":0.00546,"63":0.00546,"64":0,"65":0.01638,"66":0.02184,"67":0,"68":0.12558,"69":0.00546,"70":0.00546,"71":0.01092,"72":0.02184,"73":0.04368,"74":0.63882,"75":1.27764,"76":0.00546,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00546,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00546,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00546,"67":0.5733,"68":0.01092,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00094,"3.2":0.00094,"4.0-4.1":0,"4.2-4.3":0.00189,"5.0-5.1":0.00944,"6.0-6.1":0.00283,"7.0-7.1":0.00944,"8.1-8.4":0.01321,"9.0-9.2":0.01132,"9.3":0.13588,"10.0-10.2":0.03491,"10.3":0.11983,"11.0-11.2":0.07737,"11.3-11.4":0.13116,"12.0-12.1":0.1623,"12.2-12.4":1.06342,"13.0-13.1":0.22646,"13.2":0.1104,"13.3":6.18234,"13.4":1.14551},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.01092,"11":0.01638,"12":0.04914,"13":0.41496,_:"0","3.1":0,"3.2":0,"5.1":0.14742,"6.1":0,"7.1":0,"9.1":0,"10.1":0.02184,"11.1":0.09282,"12.1":0.12012,"13.1":0.45864},I:{"3":0.0005,"4":0.00449,_:"81","2.1":0,"2.2":0.0015,"2.3":0.0005,"4.1":0.00997,"4.2-4.3":0.02093,"4.4":0,"4.4.3-4.4.4":0.14402},B:{"12":0.01092,"13":0.00546,"14":0.00546,"15":0.00546,"16":0.01092,"17":0.0273,"18":0.52962,_:"79 80 81"},P:{"4":0.1232,"5.0-5.4":0,"6.2-6.4":0.01027,"7.2-7.4":0.08213,"8.2":0.01027,"9.2":0.14373,"10.1":0.22586,"11.1":1.44755},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00546,"9":0,"10":0.00546,"11":0.21294,"5.5":0},N:{"10":0,"11":0.05448},J:{"7":0,"10":0.00454},R:{_:"0"},M:{"0":0.14528},O:{"0":0.01816},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.06877},L:{"0":57.32006}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/UZ.js b/website/www/node_modules/caniuse-lite/data/regions/UZ.js new file mode 100644 index 000000000000..9eb1f3d93cb7 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/UZ.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00455,"12":0.00455,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00455,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00455,"36":0.00455,"37":0,"38":0.00455,"39":0.01364,"40":0.01364,"41":0.05001,"42":0,"43":0.00455,"44":0,"45":0,"46":0.00455,"47":0,"48":0.01818,"49":0.2273,"50":0,"51":0,"52":0,"53":0.00455,"54":0,"55":0.00455,"56":0.04091,"57":0.00455,"58":0.00455,"59":0.00909,"60":0,"61":0.00455,"62":0.00455,"63":0.02273,"64":0.00455,"65":0.01364,"66":0.02728,"67":0.01364,"68":0.01364,"69":0.01364,"70":0.02728,"71":0.05001,"72":0.02728,"73":0.04091,"74":0.01818,"75":0.01818,"76":0.05001,"77":0.04091,"78":0.07274,"79":0.1682,"80":9.16019,"81":4.8824,"83":0.01364,"84":0.00909,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.02728,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00455,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00455,"48":0.00455,"49":0,"50":0,"51":0,"52":0.05455,"53":0,"54":0,"55":0,"56":0.00909,"57":0,"58":0,"59":0.00455,"60":0,"61":0,"62":0,"63":0.00455,"64":0.00455,"65":0,"66":0.02273,"67":0.00455,"68":0.05455,"69":0.00455,"70":0.00455,"71":0.00455,"72":0.00909,"73":0.00909,"74":0.33186,"75":0.70918,"76":0.00909,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0.00455,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00455,"31":0,"32":0,"33":0,"34":0.00455,"35":0,"36":0.00909,"37":0.00455,"38":0,"39":0,"40":0,"41":0,"42":0.00909,"43":0.00455,"44":0,"45":0.01818,"46":0.00909,"47":0.00455,"48":0.00455,"49":0.00455,"50":0.00909,"51":0.02728,"52":0.00455,"53":0.1182,"54":0.01818,"55":0.07728,"56":0.01818,"57":0.06364,"58":0.01364,"60":0.0591,"62":0.10001,"63":0.01818,"64":0.03182,"65":0.11365,"66":0.06819,"67":0.1182,"68":0.00455,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.04546},G:{"8":0.0007,"3.2":0.0007,"4.0-4.1":0,"4.2-4.3":0.0014,"5.0-5.1":0.007,"6.0-6.1":0.0021,"7.0-7.1":0.007,"8.1-8.4":0.0098,"9.0-9.2":0.0084,"9.3":0.10077,"10.0-10.2":0.02589,"10.3":0.08887,"11.0-11.2":0.05738,"11.3-11.4":0.09727,"12.0-12.1":0.12036,"12.2-12.4":0.78867,"13.0-13.1":0.16795,"13.2":0.08188,"13.3":4.58504,"13.4":0.84955},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.02273,"13":0.1682,_:"0","3.1":0,"3.2":0,"5.1":0.01818,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00455,"11.1":0.01364,"12.1":0.0591,"13.1":0.17729},I:{"3":0.00183,"4":0.01645,_:"81","2.1":0,"2.2":0.00548,"2.3":0.00183,"4.1":0.03656,"4.2-4.3":0.07678,"4.4":0,"4.4.3-4.4.4":0.52832},B:{"12":0.00455,"13":0.00455,"14":0.00455,"15":0.00455,"16":0.00455,"17":0.01364,"18":0.20457,_:"79 80 81"},P:{"4":2.14645,"5.0-5.4":0.17131,"6.2-6.4":0.40309,"7.2-7.4":0.68525,"8.2":0.11085,"9.2":0.80618,"10.1":0.74571,"11.1":2.0759},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01394,"9":0.00697,"10":0.00697,"11":0.18123,"5.5":0},N:{"10":0.01091,"11":0.02182},J:{"7":0,"10":0.00545},R:{_:"0"},M:{"0":0.08181},O:{"0":5.92304},Q:{"1.2":0.0709},S:{"2.5":0},H:{"0":0.3253},L:{"0":51.09478}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VA.js b/website/www/node_modules/caniuse-lite/data/regions/VA.js new file mode 100644 index 000000000000..e362c6130b9e --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.01814,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00907,"65":0.04536,"66":0,"67":0.09978,"68":0.19049,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.01814,"75":0.39005,"76":0.01814,"77":0.09071,"78":0,"79":0,"80":34.07975,"81":15.23021,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.05443,"20":0,"21":0,"22":0,"23":0.00907,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.01814,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.01814,"64":0,"65":0,"66":0,"67":0.01814,"68":0.15421,"69":0,"70":0,"71":0,"72":0,"73":0,"74":5.26118,"75":4.95277,"76":0.02721,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.14514,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00095,"3.2":0.00095,"4.0-4.1":0,"4.2-4.3":0.00191,"5.0-5.1":0.00954,"6.0-6.1":0.00286,"7.0-7.1":0.00954,"8.1-8.4":0.01336,"9.0-9.2":0.01145,"9.3":0.13738,"10.0-10.2":0.0353,"10.3":0.12116,"11.0-11.2":0.07823,"11.3-11.4":0.13261,"12.0-12.1":0.1641,"12.2-12.4":1.07521,"13.0-13.1":0.22897,"13.2":0.11162,"13.3":6.25092,"13.4":1.15821},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01814,"10":0,"11":0,"12":0.00907,"13":1.74163,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.09071,"11.1":0.30841,"12.1":0.91617,"13.1":2.29496},I:{"3":0.00017,"4":0.00157,_:"81","2.1":0,"2.2":0.00052,"2.3":0.00017,"4.1":0.00348,"4.2-4.3":0.00731,"4.4":0,"4.4.3-4.4.4":0.05028},B:{"12":0,"13":0,"14":0,"15":0.04536,"16":0,"17":0.44448,"18":5.1614,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03218,"8.2":0,"9.2":0.04291,"10.1":0.02146,"11.1":0.35402},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":6.50391,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.02415},O:{"0":0.0353},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":10.81935}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VC.js b/website/www/node_modules/caniuse-lite/data/regions/VC.js new file mode 100644 index 000000000000..0ae0490d36c5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VC.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00977,"34":0,"35":0,"36":0.03418,"37":0,"38":0,"39":0,"40":0.00488,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00488,"48":0,"49":1.2647,"50":0.00977,"51":0,"52":0.00488,"53":0,"54":0,"55":0.00488,"56":0.00488,"57":0,"58":0.00977,"59":0,"60":0.00488,"61":0,"62":0.00488,"63":0.00977,"64":0,"65":0.00488,"66":0,"67":0.00977,"68":0.00488,"69":0.04883,"70":0.01465,"71":0.03418,"72":0.42482,"73":0.01465,"74":0.00977,"75":0.13672,"76":0.03906,"77":0.08301,"78":0.03906,"79":0.08301,"80":7.89581,"81":3.82827,"83":0,"84":0.01465,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00488,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00488,"39":0,"40":0,"41":0,"42":0,"43":0.00488,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00488,"52":0.00488,"53":0.00488,"54":0,"55":0.00488,"56":0,"57":0,"58":0.00488,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.08789,"69":0.00488,"70":0,"71":0,"72":0,"73":0.00488,"74":0.39552,"75":0.54201,"76":0.00977,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00488,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00488,"66":0.00488,"67":0.83988,"68":0.00488,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00129,"3.2":0.00129,"4.0-4.1":0,"4.2-4.3":0.00259,"5.0-5.1":0.01293,"6.0-6.1":0.00388,"7.0-7.1":0.01293,"8.1-8.4":0.0181,"9.0-9.2":0.01552,"9.3":0.18619,"10.0-10.2":0.04784,"10.3":0.16421,"11.0-11.2":0.10603,"11.3-11.4":0.17973,"12.0-12.1":0.2224,"12.2-12.4":1.45721,"13.0-13.1":0.31032,"13.2":0.15128,"13.3":8.47171,"13.4":1.5697},E:{"4":0,"5":0,"6":0.00488,"7":0,"8":0,"9":0,"10":0,"11":0.00488,"12":0.00977,"13":0.62502,_:"0","3.1":0,"3.2":0,"5.1":0.17091,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00977,"11.1":0.0293,"12.1":0.01465,"13.1":0.53713},I:{"3":0.00598,"4":0.05382,_:"81","2.1":0,"2.2":0.01794,"2.3":0.00598,"4.1":0.11959,"4.2-4.3":0.25114,"4.4":0,"4.4.3-4.4.4":1.72808},B:{"12":0,"13":0.01465,"14":0.00488,"15":0.00977,"16":0.00977,"17":0.15137,"18":1.92879,_:"79 80 81"},P:{"4":0.14512,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.16745,"8.2":0.01116,"9.2":0.10047,"10.1":0.18977,"11.1":3.38241},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00488,"9":0,"10":0.00977,"11":0.23927,"5.5":0},N:{"10":0.01535,"11":0.04605},J:{"7":0,"10":0.00512},R:{_:"0"},M:{"0":0.16374},O:{"0":0.38378},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.0872},L:{"0":57.78331}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VE.js b/website/www/node_modules/caniuse-lite/data/regions/VE.js new file mode 100644 index 000000000000..709e741e6fa1 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00685,"37":0.0137,"38":0,"39":0,"40":0.00685,"41":0,"42":0.02055,"43":0.00685,"44":0,"45":0.00685,"46":0.00685,"47":0.00685,"48":0.0137,"49":0.9179,"50":0.00685,"51":0.0137,"52":0.00685,"53":0.00685,"54":0.00685,"55":0.00685,"56":0.00685,"57":0.00685,"58":0.0411,"59":0.02055,"60":0.0137,"61":0.0411,"62":0.0137,"63":0.08905,"64":0.0137,"65":0.0685,"66":0.02055,"67":0.07535,"68":0.04795,"69":0.0959,"70":0.18495,"71":0.28085,"72":0.2192,"73":0.1918,"74":0.1781,"75":0.18495,"76":0.2055,"77":0.2329,"78":0.25345,"79":0.51375,"80":18.65255,"81":11.66555,"83":0.02055,"84":0.0137,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0.0137,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.04795,"28":0.00685,"29":0.00685,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00685,"40":0,"41":0,"42":0,"43":0.00685,"44":0,"45":0.0137,"46":0,"47":0.0137,"48":0.04795,"49":0,"50":0.00685,"51":0,"52":0.36305,"53":0,"54":0.00685,"55":0.00685,"56":0.0137,"57":0.00685,"58":0.00685,"59":0.0137,"60":0.02055,"61":0.02055,"62":0.00685,"63":0.02055,"64":0.03425,"65":0.0274,"66":0.02055,"67":0.00685,"68":0.21235,"69":0.0137,"70":0.02055,"71":0.0274,"72":0.08905,"73":0.0411,"74":1.1508,"75":2.25365,"76":0.0548,"77":0.0274,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0137,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.0137,"46":0,"47":0.00685,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00685,"57":0.0137,"58":0.0274,"60":0,"62":0.00685,"63":0.00685,"64":0,"65":0.02055,"66":0.02055,"67":1.3563,"68":0.02055,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00685},G:{"8":0.00049,"3.2":0.00049,"4.0-4.1":0,"4.2-4.3":0.00097,"5.0-5.1":0.00485,"6.0-6.1":0.00146,"7.0-7.1":0.00485,"8.1-8.4":0.00679,"9.0-9.2":0.00582,"9.3":0.06984,"10.0-10.2":0.01795,"10.3":0.0616,"11.0-11.2":0.03977,"11.3-11.4":0.06742,"12.0-12.1":0.08343,"12.2-12.4":0.54663,"13.0-13.1":0.11641,"13.2":0.05675,"13.3":3.17792,"13.4":0.58883},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.0137,"11":0.0274,"12":0.04795,"13":0.3014,_:"0","3.1":0,"3.2":0,"5.1":0.274,"6.1":0,"7.1":0,"9.1":0.00685,"10.1":0.0274,"11.1":0.0959,"12.1":0.15755,"13.1":0.2877},I:{"3":0.00271,"4":0.0244,_:"81","2.1":0,"2.2":0.00813,"2.3":0.00271,"4.1":0.05423,"4.2-4.3":0.11388,"4.4":0,"4.4.3-4.4.4":0.78359},B:{"12":0.0137,"13":0.00685,"14":0.00685,"15":0.02055,"16":0.00685,"17":0.02055,"18":0.2603,_:"79 80 81"},P:{"4":0.07241,"5.0-5.4":0,"6.2-6.4":0.01034,"7.2-7.4":0.07241,"8.2":0.02069,"9.2":0.0931,"10.1":0.2586,"11.1":1.00336},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.17346,"9":0.03017,"10":0.01508,"11":0.52793,"5.5":0},N:{"10":0.01221,"11":0.08544},J:{"7":0,"10":0.04095},R:{_:"0"},M:{"0":0.1764},O:{"0":0.09765},Q:{"1.2":0.0252},S:{"2.5":0.00315},H:{"0":0.33103},L:{"0":46.77755}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VG.js b/website/www/node_modules/caniuse-lite/data/regions/VG.js new file mode 100644 index 000000000000..5ad0b3783d22 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VG.js @@ -0,0 +1 @@ +module.exports={D:{"49":0.03787,"50":0.01894,"53":0.03787,"56":0.00947,"58":0.01894,"63":0.06154,"65":0.01894,"67":0.06154,"68":0.17042,"69":0.90419,"70":0.40712,"71":0.03787,"72":0.01894,"73":0.46393,"74":0.00473,"75":0.01894,"76":0.02367,"77":0.0142,"78":0.88052,"79":0.07574,"80":14.13099,"81":9.83252,"84":0.00473,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 52 54 55 57 59 60 61 62 64 66 83 85"},C:{"20":0.00473,"22":0.0142,"52":0.00473,"63":0.05207,"64":0.00473,"65":0.46867,"66":0.0284,"68":0.03314,"70":0.00947,"71":0.00473,"72":0.02367,"73":0.00473,"74":0.9326,"75":1.98828,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 67 69 76 77 78 3.5 3.6"},F:{"67":0.35978,"68":0.01894,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00157,"3.2":0.00157,"4.0-4.1":0,"4.2-4.3":0.00314,"5.0-5.1":0.01568,"6.0-6.1":0.0047,"7.0-7.1":0.01568,"8.1-8.4":0.02195,"9.0-9.2":0.01881,"9.3":0.22573,"10.0-10.2":0.058,"10.3":0.19908,"11.0-11.2":0.12854,"11.3-11.4":0.21789,"12.0-12.1":0.26963,"12.2-12.4":1.76667,"13.0-13.1":0.37622,"13.2":0.18341,"13.3":10.27084,"13.4":1.90305},E:{"4":0,"10":0.00947,"11":0.00947,"12":0.13729,"13":5.02277,_:"0 5 6 7 8 9 3.1 3.2 5.1 6.1 7.1","9.1":0.0142,"10.1":0.05207,"11.1":0.0284,"12.1":0.43079,"13.1":0.95153},I:{"3":0.00036,"4":0.00325,_:"81","2.1":0,"2.2":0.00108,"2.3":0.00036,"4.1":0.00721,"4.2-4.3":0.01515,"4.4":0,"4.4.3-4.4.4":0.10424},B:{"12":0.00947,"15":0.00473,"16":0.04734,"17":0.08521,"18":3.86294,_:"13 14 79 80 81"},P:{"4":0.1358,"5.0-5.4":0.03134,"6.2-6.4":0.01045,"7.2-7.4":0.50142,"8.2":0.03134,"9.2":0.34472,"10.1":0.59543,"11.1":5.40068},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.03797,"10":0.00949,"11":3.64506,_:"6 7 9 5.5"},N:{"10":0,"11":0.02684},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.2317},O:{"0":0.11585},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.67304},L:{"0":29.2115}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VI.js b/website/www/node_modules/caniuse-lite/data/regions/VI.js new file mode 100644 index 000000000000..cedb7e485586 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VI.js @@ -0,0 +1 @@ +module.exports={D:{"49":0.02331,"53":0.12121,"55":0.00466,"57":0.04196,"63":0.00932,"65":0.00932,"67":0.03263,"68":0.01865,"69":0.01865,"71":0.00466,"73":0.00932,"74":0.02331,"75":0.07925,"76":0.04196,"77":0.01865,"78":0.29371,"79":0.24709,"80":13.06292,"81":8.13985,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 54 56 58 59 60 61 62 64 66 70 72 83 84 85"},C:{"23":0.00932,"52":0.00932,"61":0.00932,"68":0.01399,"72":0.00466,"73":0.02331,"74":0.83916,"75":1.97203,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 62 63 64 65 66 67 69 70 71 76 77 78 3.5 3.6"},F:{"66":0.07459,"67":0.49883,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 68 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00257,"3.2":0.00257,"4.0-4.1":0,"4.2-4.3":0.00514,"5.0-5.1":0.02571,"6.0-6.1":0.00771,"7.0-7.1":0.02571,"8.1-8.4":0.03599,"9.0-9.2":0.03085,"9.3":0.3702,"10.0-10.2":0.09512,"10.3":0.32649,"11.0-11.2":0.21081,"11.3-11.4":0.35734,"12.0-12.1":0.44218,"12.2-12.4":2.89731,"13.0-13.1":0.617,"13.2":0.30079,"13.3":16.84401,"13.4":3.12098},E:{"4":0,"10":0.04196,"11":0.01865,"12":0.02797,"13":6.27039,_:"0 5 6 7 8 9 3.1 3.2 5.1 6.1 7.1 9.1","10.1":0.05128,"11.1":0.09324,"12.1":1.1655,"13.1":1.669},I:{"3":0.00032,"4":0.0029,_:"81","2.1":0,"2.2":0.00097,"2.3":0.00032,"4.1":0.00643,"4.2-4.3":0.01351,"4.4":0,"4.4.3-4.4.4":0.09298},B:{"13":0.00466,"14":0.22378,"15":0.00932,"16":0.06061,"17":0.25175,"18":7.48251,_:"12 79 80 81"},P:{"4":0.20091,"5.0-5.4":0.01026,"6.2-6.4":0.02052,"7.2-7.4":0.01057,"8.2":0.02052,"9.2":0.01057,"10.1":0.08459,"11.1":6.89431},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"10":0.00466,"11":2.43823,_:"6 7 8 9 5.5"},N:{"10":0.02388,"11":0.0427},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.25622},O:{"0":0.26156},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.11118},L:{"0":19.79829}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VN.js b/website/www/node_modules/caniuse-lite/data/regions/VN.js new file mode 100644 index 000000000000..05569cbf4ee5 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VN.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.0075,"22":0.0075,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0075,"35":0,"36":0.0225,"37":0,"38":0.015,"39":0.0075,"40":0,"41":0.07501,"42":0.0075,"43":0.0075,"44":0,"45":0,"46":0.0075,"47":0.0075,"48":0.015,"49":1.13265,"50":0.0075,"51":0.0075,"52":0.0075,"53":0.015,"54":0.0075,"55":0.0075,"56":0.015,"57":0.05251,"58":0.015,"59":0.0075,"60":0.015,"61":0.0225,"62":0.015,"63":0.06001,"64":0.015,"65":0.03,"66":0.0225,"67":0.03751,"68":0.0225,"69":0.03751,"70":0.29254,"71":0.40505,"72":0.23253,"73":0.87762,"74":0.10501,"75":0.09001,"76":0.08251,"77":0.08251,"78":0.13502,"79":0.24753,"80":22.5105,"81":11.19149,"83":0.03751,"84":0.015,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.0075,"34":0.0075,"35":0,"36":0.0075,"37":0,"38":0.0075,"39":0,"40":0.0075,"41":0.0075,"42":0.0075,"43":0.0075,"44":0.0075,"45":0.0075,"46":0,"47":0.0075,"48":0.0075,"49":0.0075,"50":0.0075,"51":0.0075,"52":0.05251,"53":0.0075,"54":0.015,"55":0.0075,"56":0.0075,"57":0.0075,"58":0.0075,"59":0.0075,"60":0.015,"61":0.0075,"62":0.0075,"63":0.03,"64":0.0225,"65":0.03751,"66":0.015,"67":0.0075,"68":0.18753,"69":0.0075,"70":0.0075,"71":0.0075,"72":0.03,"73":0.03751,"74":0.56258,"75":0.89262,"76":0.0225,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0075,"37":0.03,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.03751,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.015,"57":0.03,"58":0.03751,"60":0,"62":0,"63":0,"64":0,"65":0.015,"66":0,"67":0.54007,"68":0.0075,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0075},G:{"8":0.00149,"3.2":0.00149,"4.0-4.1":0,"4.2-4.3":0.00298,"5.0-5.1":0.01492,"6.0-6.1":0.00448,"7.0-7.1":0.01492,"8.1-8.4":0.02089,"9.0-9.2":0.01791,"9.3":0.21488,"10.0-10.2":0.05521,"10.3":0.18951,"11.0-11.2":0.12236,"11.3-11.4":0.20741,"12.0-12.1":0.25666,"12.2-12.4":1.6817,"13.0-13.1":0.35813,"13.2":0.17459,"13.3":9.77684,"13.4":1.81152},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0075,"9":0.0075,"10":0.015,"11":0.015,"12":0.09751,"13":0.80261,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0075,"10.1":0.05251,"11.1":0.09001,"12.1":0.36005,"13.1":0.66759},I:{"3":0.00084,"4":0.00752,_:"81","2.1":0,"2.2":0.00251,"2.3":0.00084,"4.1":0.01671,"4.2-4.3":0.03509,"4.4":0,"4.4.3-4.4.4":0.24147},B:{"12":0.0075,"13":0.0075,"14":0.03,"15":0.015,"16":0.0075,"17":0.06001,"18":0.35255,_:"79 80 81"},P:{"4":0.23596,"5.0-5.4":0.01026,"6.2-6.4":0.02052,"7.2-7.4":0.0513,"8.2":0.02052,"9.2":0.11285,"10.1":0.16414,"11.1":1.13875},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00854,"7":0.00854,"8":0.0598,"9":0.02563,"10":0.02563,"11":0.1794,"5.5":0},N:{"10":0.02388,"11":0.08358},J:{"7":0,"10":0.01749},R:{_:"0"},M:{"0":0.06747},O:{"0":0.55228},Q:{"1.2":0.0125},S:{"2.5":0},H:{"0":0.194},L:{"0":24.27592}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/VU.js b/website/www/node_modules/caniuse-lite/data/regions/VU.js new file mode 100644 index 000000000000..5e377171384d --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/VU.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00418,"40":0.34702,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02927,"50":0.01672,"51":0,"52":0,"53":0,"54":0,"55":0.02091,"56":0,"57":0.77767,"58":0.00836,"59":0.01254,"60":0,"61":0,"62":0,"63":0.00836,"64":0,"65":0,"66":0,"67":0.01254,"68":0.01254,"69":0.07526,"70":0.01254,"71":0,"72":0.00418,"73":0.02091,"74":0.00836,"75":0,"76":0.02091,"77":0.00418,"78":0.01254,"79":0.32194,"80":5.51056,"81":2.98942,"83":0.01254,"84":0.00418,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0.00418,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.05435,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.02091,"35":0,"36":0,"37":0,"38":0.02091,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00418,"48":0,"49":0,"50":0,"51":0,"52":0.00418,"53":0,"54":0,"55":0,"56":0.00418,"57":0.00836,"58":0,"59":0.00418,"60":0,"61":0.00836,"62":0,"63":0,"64":0.00418,"65":0,"66":0.00418,"67":0,"68":0.07108,"69":0.02091,"70":0.05017,"71":0,"72":0.02509,"73":0.11289,"74":0.45573,"75":0.71077,"76":0.00418,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00418,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.0878,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00093,"3.2":0.00093,"4.0-4.1":0,"4.2-4.3":0.00186,"5.0-5.1":0.00931,"6.0-6.1":0.00279,"7.0-7.1":0.00931,"8.1-8.4":0.01303,"9.0-9.2":0.01117,"9.3":0.13406,"10.0-10.2":0.03445,"10.3":0.11824,"11.0-11.2":0.07634,"11.3-11.4":0.12941,"12.0-12.1":0.16013,"12.2-12.4":1.04924,"13.0-13.1":0.22344,"13.2":0.10893,"13.3":6.09994,"13.4":1.13024},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03345,"12":0.00418,"13":0.47245,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00418,"10.1":0.00418,"11.1":0.01672,"12.1":0.0669,"13.1":0.47663},I:{"3":0.00371,"4":0.03337,_:"81","2.1":0,"2.2":0.01112,"2.3":0.00371,"4.1":0.07417,"4.2-4.3":0.15575,"4.4":0,"4.4.3-4.4.4":1.0717},B:{"12":0.03345,"13":0.01672,"14":0.02091,"15":0.05435,"16":0.03763,"17":0.05853,"18":1.68494,_:"79 80 81"},P:{"4":0.37123,"5.0-5.4":0.04125,"6.2-6.4":0.03094,"7.2-7.4":0.56715,"8.2":0.13405,"9.2":0.39185,"10.1":0.28873,"11.1":1.20649},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.05895,"11":0.33406,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.09892},O:{"0":0.74483},Q:{"1.2":0.18039},S:{"2.5":0},H:{"0":0.88145},L:{"0":66.84761}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/WF.js b/website/www/node_modules/caniuse-lite/data/regions/WF.js new file mode 100644 index 000000000000..34851cb2cf51 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/WF.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0363,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01815,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.01815,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.04992,"71":0,"72":0.01815,"73":0.0363,"74":0,"75":0.01815,"76":0.10437,"77":0.01815,"78":0.18606,"79":0,"80":2.01487,"81":2.11925,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.0363,"60":0.06807,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":3.55325,"69":0,"70":0,"71":0,"72":0.01815,"73":0.06807,"74":3.55325,"75":2.37337,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.24051,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00103,"3.2":0.00103,"4.0-4.1":0,"4.2-4.3":0.00206,"5.0-5.1":0.0103,"6.0-6.1":0.00309,"7.0-7.1":0.0103,"8.1-8.4":0.01442,"9.0-9.2":0.01236,"9.3":0.1483,"10.0-10.2":0.03811,"10.3":0.13079,"11.0-11.2":0.08445,"11.3-11.4":0.14315,"12.0-12.1":0.17714,"12.2-12.4":1.16066,"13.0-13.1":0.24717,"13.2":0.12049,"13.3":6.74772,"13.4":1.25026},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.01815,"13":3.07223,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":1.00744,"11.1":0.01815,"12.1":0.01815,"13.1":0.0363},I:{"3":0.00442,"4":0.03979,_:"81","2.1":0,"2.2":0.01326,"2.3":0.00442,"4.1":0.08843,"4.2-4.3":0.1857,"4.4":0,"4.4.3-4.4.4":1.27781},B:{"12":0,"13":0.01815,"14":0,"15":0.04992,"16":0,"17":0.06807,"18":0.27228,_:"79 80 81"},P:{"4":0,"5.0-5.4":0.09159,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":1.12195,"11.1":2.24391},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.58086,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.13109},O:{"0":3.45745},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":58.24104}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/WS.js b/website/www/node_modules/caniuse-lite/data/regions/WS.js new file mode 100644 index 000000000000..11f5ce106af6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/WS.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02869,"50":0.00359,"51":0,"52":0,"53":0,"54":0,"55":0.00359,"56":0.01793,"57":0.00359,"58":0.02152,"59":0,"60":0,"61":0,"62":0,"63":0.01076,"64":0,"65":0.00717,"66":0,"67":0.00359,"68":0.04662,"69":0.01793,"70":0.06455,"71":0.01076,"72":0.00717,"73":0.03945,"74":0.01793,"75":0.01793,"76":0.01076,"77":0.01434,"78":0.01434,"79":0.05379,"80":3.52145,"81":2.40979,"83":0.01076,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00359,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00359,"41":0,"42":0,"43":0,"44":0,"45":0.00359,"46":0,"47":0.00359,"48":0,"49":0,"50":0,"51":0,"52":0.00359,"53":0,"54":0,"55":0.00359,"56":0.00717,"57":0,"58":0,"59":0.00717,"60":0,"61":0.00359,"62":0,"63":0,"64":0,"65":0.01434,"66":0.00359,"67":0.00359,"68":0.07172,"69":0,"70":0.00359,"71":0,"72":0.00359,"73":0.00717,"74":0.53431,"75":0.59528,"76":0.00717,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01076,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00717,"60":0,"62":0,"63":0.00359,"64":0,"65":0,"66":0,"67":0.08606,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00077,"3.2":0.00077,"4.0-4.1":0,"4.2-4.3":0.00154,"5.0-5.1":0.00769,"6.0-6.1":0.00231,"7.0-7.1":0.00769,"8.1-8.4":0.01076,"9.0-9.2":0.00923,"9.3":0.11072,"10.0-10.2":0.02845,"10.3":0.09765,"11.0-11.2":0.06305,"11.3-11.4":0.10687,"12.0-12.1":0.13225,"12.2-12.4":0.86653,"13.0-13.1":0.18453,"13.2":0.08996,"13.3":5.03772,"13.4":0.93342},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00717,"9":0,"10":0,"11":0.02152,"12":0.00717,"13":0.04662,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.01076,"12.1":0.01434,"13.1":0.0251},I:{"3":0.00071,"4":0.0064,_:"81","2.1":0,"2.2":0.00213,"2.3":0.00071,"4.1":0.01423,"4.2-4.3":0.02988,"4.4":0,"4.4.3-4.4.4":0.20559},B:{"12":0.02152,"13":0.02869,"14":0.01434,"15":0.04303,"16":0.05379,"17":0.10758,"18":0.4877,_:"79 80 81"},P:{"4":0.31796,"5.0-5.4":0.06154,"6.2-6.4":0.16411,"7.2-7.4":0.70772,"8.2":0.05128,"9.2":0.51284,"10.1":0.80004,"11.1":2.14369},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0759,"9":0,"10":0.01265,"11":0.82229,"5.5":0},N:{"10":0,"11":0.00641},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.20525},O:{"0":2.014},Q:{"1.2":0.28863},S:{"2.5":0.00641},H:{"0":0.64367},L:{"0":71.68208}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/YE.js b/website/www/node_modules/caniuse-lite/data/regions/YE.js new file mode 100644 index 000000000000..75cd6880eb23 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/YE.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0026,"32":0.0026,"33":0.00521,"34":0,"35":0,"36":0.0026,"37":0.0026,"38":0,"39":0.0026,"40":0.0026,"41":0,"42":0,"43":0.01041,"44":0.0026,"45":0,"46":0,"47":0.0026,"48":0.00521,"49":0.01302,"50":0,"51":0.0026,"52":0,"53":0.0026,"54":0.0026,"55":0.00781,"56":0.00521,"57":0,"58":0.0026,"59":0.0026,"60":0.0026,"61":0.0026,"62":0.0026,"63":0.02082,"64":0.01041,"65":0.0026,"66":0.00781,"67":0.00521,"68":0.01041,"69":0.01302,"70":0.01302,"71":0.01822,"72":0.01562,"73":0.01822,"74":0.04946,"75":0.03905,"76":0.03644,"77":0.03384,"78":0.06768,"79":0.11974,"80":2.23077,"81":1.3041,"83":0.0026,"84":0,_:"85"},C:{"2":0,"3":0.01562,"4":0,"5":0,"6":0.0026,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0026,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.0026,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.0026,"40":0.0026,"41":0,"42":0,"43":0.00521,"44":0.00781,"45":0,"46":0,"47":0.01041,"48":0.0026,"49":0.0026,"50":0.0026,"51":0.0026,"52":0.01562,"53":0,"54":0.0026,"55":0.0026,"56":0.00521,"57":0.00521,"58":0,"59":0.0026,"60":0.00521,"61":0.00781,"62":0.00521,"63":0.0026,"64":0.0026,"65":0.0026,"66":0.00781,"67":0.00521,"68":0.07809,"69":0.01041,"70":0.00781,"71":0.00781,"72":0.02082,"73":0.01041,"74":0.22126,"75":0.37223,"76":0.00781,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.0026,"28":0,"29":0.0026,"30":0.0026,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0026,"37":0.0026,"38":0.01041,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.07809,"46":0.0026,"47":0.00521,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00781,"54":0.0026,"55":0,"56":0,"57":0.0026,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.0026,"67":0.05987,"68":0.0026,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01041},G:{"8":0.00026,"3.2":0.00026,"4.0-4.1":0,"4.2-4.3":0.00052,"5.0-5.1":0.00262,"6.0-6.1":0.00079,"7.0-7.1":0.00262,"8.1-8.4":0.00367,"9.0-9.2":0.00315,"9.3":0.03774,"10.0-10.2":0.0097,"10.3":0.03329,"11.0-11.2":0.02149,"11.3-11.4":0.03643,"12.0-12.1":0.04508,"12.2-12.4":0.29539,"13.0-13.1":0.0629,"13.2":0.03067,"13.3":1.71727,"13.4":0.31819},E:{"4":0,"5":0,"6":0,"7":0.0026,"8":0,"9":0,"10":0.0026,"11":0.0026,"12":0.0026,"13":0.01041,_:"0","3.1":0,"3.2":0,"5.1":0.05727,"6.1":0,"7.1":0,"9.1":0.00521,"10.1":0.00521,"11.1":0.0026,"12.1":0.02343,"13.1":0.01041},I:{"3":0.01174,"4":0.10562,_:"81","2.1":0,"2.2":0.03521,"2.3":0.01174,"4.1":0.23471,"4.2-4.3":0.49289,"4.4":0,"4.4.3-4.4.4":3.39152},B:{"12":0.0026,"13":0.00521,"14":0.0026,"15":0.0026,"16":0.01822,"17":0.02082,"18":0.10412,_:"79 80 81"},P:{"4":0.83101,"5.0-5.4":0.19255,"6.2-6.4":0.08107,"7.2-7.4":0.19255,"8.2":0.09121,"9.2":0.50671,"10.1":0.71953,"11.1":1.98631},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00827,"9":0.00276,"10":0.00276,"11":0.03307,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.32547},O:{"0":4.00178},Q:{"1.2":0},S:{"2.5":0},H:{"0":1.95384},L:{"0":73.72891}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/YT.js b/website/www/node_modules/caniuse-lite/data/regions/YT.js new file mode 100644 index 000000000000..dfb48c8967ce --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/YT.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00519,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00519,"40":0,"41":0,"42":0,"43":0.02077,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.05711,"50":0,"51":0,"52":0,"53":0.21806,"54":0,"55":0,"56":0,"57":0,"58":0.00519,"59":0,"60":0,"61":0,"62":0,"63":0.00519,"64":0,"65":0.0623,"66":0,"67":0.02077,"68":0,"69":0.00519,"70":0,"71":0.13499,"72":0.00519,"73":0.00519,"74":0.01038,"75":0.01038,"76":0.01558,"77":0.04673,"78":0.04154,"79":0.41536,"80":4.3457,"81":6.83786,"83":0.02077,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.03634,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.04673,"45":0.01038,"46":0,"47":0,"48":0.01038,"49":0,"50":0,"51":0,"52":0.25441,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00519,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.09346,"69":0,"70":0.03634,"71":0,"72":0.52958,"73":0.02077,"74":0.37382,"75":6.89498,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01558,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.29594,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00121,"3.2":0.00121,"4.0-4.1":0,"4.2-4.3":0.00242,"5.0-5.1":0.01212,"6.0-6.1":0.00364,"7.0-7.1":0.01212,"8.1-8.4":0.01697,"9.0-9.2":0.01454,"9.3":0.17453,"10.0-10.2":0.04485,"10.3":0.15393,"11.0-11.2":0.09939,"11.3-11.4":0.16847,"12.0-12.1":0.20847,"12.2-12.4":1.36597,"13.0-13.1":0.29089,"13.2":0.14181,"13.3":7.94128,"13.4":1.47141},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00519,"11":0.04154,"12":0.02077,"13":0.47247,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00519,"10.1":0.03115,"11.1":0.2596,"12.1":0.22845,"13.1":0.78918},I:{"3":0.00086,"4":0.00771,_:"81","2.1":0,"2.2":0.00257,"2.3":0.00086,"4.1":0.01714,"4.2-4.3":0.036,"4.4":0,"4.4.3-4.4.4":0.24773},B:{"12":0,"13":0.00519,"14":0,"15":0.01038,"16":0.01038,"17":0.05192,"18":2.05084,_:"79 80 81"},P:{"4":0.13463,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.11392,"8.2":0,"9.2":0.10356,"10.1":0.13463,"11.1":8.46095},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.10903,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0.00962},R:{_:"0"},M:{"0":0.11539},O:{"0":0.11058},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.34594},L:{"0":47.57866}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ZA.js b/website/www/node_modules/caniuse-lite/data/regions/ZA.js new file mode 100644 index 000000000000..a97025f1acd6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ZA.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00858,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00286,"27":0,"28":0.00286,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00286,"39":0,"40":0.0143,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00286,"47":0,"48":0,"49":0.03718,"50":0.00286,"51":0,"52":0,"53":0.00286,"54":0,"55":0.01144,"56":0.00286,"57":0.00286,"58":0.00572,"59":0.00286,"60":0.00572,"61":0.00286,"62":0.00572,"63":0.00858,"64":0.00286,"65":0.00858,"66":0.00858,"67":0.00858,"68":0.00286,"69":0.01144,"70":0.01144,"71":0.0143,"72":0.01144,"73":0.01144,"74":0.0143,"75":0.01716,"76":0.0143,"77":0.02288,"78":0.04576,"79":0.04862,"80":2.94294,"81":1.56156,"83":0.00572,"84":0.00286,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00286,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00286,"49":0,"50":0.00286,"51":0,"52":0.01144,"53":0,"54":0,"55":0.00286,"56":0.00286,"57":0.00286,"58":0,"59":0.00286,"60":0.00286,"61":0,"62":0,"63":0,"64":0,"65":0.00286,"66":0.00286,"67":0.00286,"68":0.07436,"69":0.00286,"70":0.00286,"71":0.00286,"72":0.00858,"73":0.00572,"74":0.18304,"75":0.3003,"76":0.01144,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00286,"25":0.00286,"26":0.02288,"27":0,"28":0.01716,"29":0.00286,"30":0.00286,"31":0.00286,"32":0.01144,"33":0.00572,"34":0,"35":0.04576,"36":0.00286,"37":0.00286,"38":0.00858,"39":0,"40":0,"41":0,"42":0.00572,"43":0,"44":0.00286,"45":0.01144,"46":0.08294,"47":0.17446,"48":0.00286,"49":0.00286,"50":0,"51":0,"52":0,"53":0.00858,"54":0.00286,"55":0,"56":0.00286,"57":0.00572,"58":0.00286,"60":0,"62":0,"63":0,"64":0,"65":0.00286,"66":0.00286,"67":0.1573,"68":0.00572,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01716},G:{"8":0.00132,"3.2":0.00132,"4.0-4.1":0,"4.2-4.3":0.00264,"5.0-5.1":0.01319,"6.0-6.1":0.00396,"7.0-7.1":0.01319,"8.1-8.4":0.01847,"9.0-9.2":0.01583,"9.3":0.18995,"10.0-10.2":0.04881,"10.3":0.16753,"11.0-11.2":0.10817,"11.3-11.4":0.18336,"12.0-12.1":0.22689,"12.2-12.4":1.48665,"13.0-13.1":0.31659,"13.2":0.15434,"13.3":8.64288,"13.4":1.60141},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00286,"9":0.00286,"10":0.00286,"11":0.00572,"12":0.0286,"13":0.31746,_:"0","3.1":0,"3.2":0,"5.1":0.02002,"6.1":0,"7.1":0,"9.1":0.00286,"10.1":0.0143,"11.1":0.03146,"12.1":0.06292,"13.1":0.23166},I:{"3":0.00069,"4":0.0062,_:"81","2.1":0,"2.2":0.00207,"2.3":0.00069,"4.1":0.01378,"4.2-4.3":0.02894,"4.4":0,"4.4.3-4.4.4":0.1991},B:{"12":0.00858,"13":0.00858,"14":0.00858,"15":0.01144,"16":0.01716,"17":0.03718,"18":0.46046,_:"79 80 81"},P:{"4":0.92444,"5.0-5.4":0.06163,"6.2-6.4":0.09244,"7.2-7.4":0.52385,"8.2":0.12326,"9.2":0.50331,"10.1":1.06824,"11.1":5.48502},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00898,"9":0.00599,"10":0.00898,"11":0.36216,"5.5":0},N:{"10":0,"11":0.04284},J:{"7":0,"10":0.02856},R:{_:"0"},M:{"0":0.25704},O:{"0":0.79254},Q:{"1.2":0.0357},S:{"2.5":0.00714},H:{"0":3.81923},L:{"0":61.0634}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ZM.js b/website/www/node_modules/caniuse-lite/data/regions/ZM.js new file mode 100644 index 000000000000..b378ce5e0a24 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ZM.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00624,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00312,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00624,"37":0,"38":0,"39":0,"40":0.01249,"41":0,"42":0.00312,"43":0.00624,"44":0,"45":0,"46":0.00312,"47":0,"48":0.00312,"49":0.01249,"50":0.00624,"51":0.00624,"52":0,"53":0,"54":0,"55":0.00624,"56":0,"57":0,"58":0.01873,"59":0.00312,"60":0.00312,"61":0.00312,"62":0.00312,"63":0.04683,"64":0.01249,"65":0.00937,"66":0.00312,"67":0.00937,"68":0.01249,"69":0.00937,"70":0.00937,"71":0.00937,"72":0.00624,"73":0.04371,"74":0.01873,"75":0.01561,"76":0.03434,"77":0.02185,"78":0.08429,"79":0.06244,"80":2.4414,"81":1.40178,"83":0.00624,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00312,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00312,"34":0.00312,"35":0,"36":0,"37":0.00312,"38":0.00312,"39":0.00312,"40":0,"41":0.00312,"42":0,"43":0.00937,"44":0.00312,"45":0.00624,"46":0,"47":0.00937,"48":0.00312,"49":0.00312,"50":0,"51":0,"52":0.01561,"53":0,"54":0,"55":0,"56":0.00312,"57":0.00312,"58":0,"59":0,"60":0.01561,"61":0.00312,"62":0,"63":0.00312,"64":0,"65":0,"66":0.00624,"67":0.00312,"68":0.07181,"69":0.00312,"70":0.00312,"71":0.00312,"72":0.01873,"73":0.01873,"74":0.25913,"75":0.47142,"76":0.05307,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0.00312,"15":0,"16":0.00312,"17":0.24039,"18":0.00312,"19":0.00312,"20":0.02185,"21":0.00312,"22":0.00312,"23":0.01249,"24":0,"25":0,"26":0,"27":0,"28":0.00937,"29":0,"30":0.00624,"31":0,"32":0.00312,"33":0.00312,"34":0.00312,"35":0.00312,"36":0.00624,"37":0.00312,"38":0.00624,"39":0,"40":0,"41":0,"42":0.00937,"43":0,"44":0,"45":0.01249,"46":0.03746,"47":0.07181,"48":0.00624,"49":0,"50":0,"51":0.00312,"52":0,"53":0.01249,"54":0.00624,"55":0.00312,"56":0.01249,"57":0.03434,"58":0.00624,"60":0.00312,"62":0.00312,"63":0.00312,"64":0.00312,"65":0.04995,"66":0.04683,"67":0.7243,"68":0.0281,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.12176},G:{"8":0.00057,"3.2":0.00057,"4.0-4.1":0,"4.2-4.3":0.00113,"5.0-5.1":0.00565,"6.0-6.1":0.0017,"7.0-7.1":0.00565,"8.1-8.4":0.00791,"9.0-9.2":0.00678,"9.3":0.08137,"10.0-10.2":0.02091,"10.3":0.07176,"11.0-11.2":0.04633,"11.3-11.4":0.07854,"12.0-12.1":0.09719,"12.2-12.4":0.63682,"13.0-13.1":0.13561,"13.2":0.06611,"13.3":3.70225,"13.4":0.68598},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.02498,"10":0.00937,"11":0.03434,"12":0.00624,"13":0.17171,_:"0","3.1":0,"3.2":0,"5.1":0.0562,"6.1":0,"7.1":0.00312,"9.1":0.00312,"10.1":0.01873,"11.1":0.03122,"12.1":0.04683,"13.1":0.12176},I:{"3":0.00282,"4":0.0254,_:"81","2.1":0,"2.2":0.00847,"2.3":0.00282,"4.1":0.05644,"4.2-4.3":0.11852,"4.4":0,"4.4.3-4.4.4":0.81553},B:{"12":0.06556,"13":0.0562,"14":0.03434,"15":0.05307,"16":0.03746,"17":0.10303,"18":0.48079,_:"79 80 81"},P:{"4":0.75155,"5.0-5.4":0.16472,"6.2-6.4":0.07207,"7.2-7.4":0.25738,"8.2":0.05148,"9.2":0.35004,"10.1":0.4324,"11.1":1.17366},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00508,"7":0,"8":0.04571,"9":0.00508,"10":0.04063,"11":0.28439,"5.5":0},N:{"10":0.05612,"11":0.29465},J:{"7":0,"10":0.19946},R:{_:"0"},M:{"0":0.17195},O:{"0":4.46382},Q:{"1.2":0.13068},S:{"2.5":0.07566},H:{"0":15.08097},L:{"0":52.23637}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/ZW.js b/website/www/node_modules/caniuse-lite/data/regions/ZW.js new file mode 100644 index 000000000000..4995330b7cc8 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/ZW.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00468,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00468,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01403,"37":0,"38":0,"39":0.00468,"40":0.02806,"41":0,"42":0.00468,"43":0.00468,"44":0,"45":0,"46":0.02339,"47":0,"48":0.00468,"49":0.04209,"50":0.00468,"51":0,"52":0,"53":0.00468,"54":0.00468,"55":0.03742,"56":0.00468,"57":0.00468,"58":0.02806,"59":0.00468,"60":0.00935,"61":0.00468,"62":0.00468,"63":0.07483,"64":0.00468,"65":0.01871,"66":0.00468,"67":0.00935,"68":0.01403,"69":0.07016,"70":0.02339,"71":0.02806,"72":0.01871,"73":0.02806,"74":0.05612,"75":0.04677,"76":0.06548,"77":0.05145,"78":0.08419,"79":0.20579,"80":6.44958,"81":3.84449,"83":0.01403,"84":0.00468,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00468,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00468,"35":0,"36":0.00468,"37":0,"38":0.00468,"39":0,"40":0.00468,"41":0,"42":0,"43":0.00468,"44":0.00468,"45":0.00468,"46":0.00468,"47":0.01403,"48":0.01871,"49":0,"50":0.00468,"51":0,"52":0.01403,"53":0,"54":0,"55":0,"56":0.00935,"57":0,"58":0.00468,"59":0.00468,"60":0.01871,"61":0.00468,"62":0,"63":0,"64":0.00468,"65":0.00468,"66":0.00935,"67":0.00468,"68":0.1216,"69":0.00935,"70":0.00935,"71":0.00935,"72":0.04209,"73":0.02339,"74":0.63607,"75":1.15522,"76":0.14966,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.00468,"21":0.00468,"22":0,"23":0,"24":0,"25":0,"26":0.00468,"27":0,"28":0.01403,"29":0,"30":0.00468,"31":0,"32":0.00468,"33":0,"34":0.00468,"35":0.00935,"36":0.01403,"37":0.00468,"38":0.00935,"39":0,"40":0.00468,"41":0.00468,"42":0.00935,"43":0,"44":0,"45":0.01403,"46":0.03274,"47":0.06548,"48":0.00468,"49":0,"50":0,"51":0.00468,"52":0,"53":0.00935,"54":0.01403,"55":0,"56":0.00468,"57":0.02339,"58":0.00935,"60":0.00935,"62":0.00468,"63":0.00935,"64":0.00935,"65":0.05612,"66":0.06548,"67":1.47326,"68":0.04209,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.00935,"12.1":0.21514},G:{"8":0.00089,"3.2":0.00089,"4.0-4.1":0,"4.2-4.3":0.00179,"5.0-5.1":0.00894,"6.0-6.1":0.00268,"7.0-7.1":0.00894,"8.1-8.4":0.01251,"9.0-9.2":0.01072,"9.3":0.12869,"10.0-10.2":0.03307,"10.3":0.11349,"11.0-11.2":0.07328,"11.3-11.4":0.12422,"12.0-12.1":0.15371,"12.2-12.4":1.00715,"13.0-13.1":0.21448,"13.2":0.10456,"13.3":5.85523,"13.4":1.0849},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00468,"11":0.01403,"12":0.02339,"13":0.61269,_:"0","3.1":0,"3.2":0,"5.1":0.6501,"6.1":0,"7.1":0,"9.1":0.00468,"10.1":0.01403,"11.1":0.02806,"12.1":0.10289,"13.1":0.43028},I:{"3":0.00276,"4":0.02484,_:"81","2.1":0,"2.2":0.00828,"2.3":0.00276,"4.1":0.05519,"4.2-4.3":0.1159,"4.4":0,"4.4.3-4.4.4":0.79753},B:{"12":0.14966,"13":0.04677,"14":0.05145,"15":0.07016,"16":0.05612,"17":0.13563,"18":1.33762,_:"79 80 81"},P:{"4":0.67193,"5.0-5.4":0.02067,"6.2-6.4":0.03101,"7.2-7.4":0.25844,"8.2":0.03101,"9.2":0.21709,"10.1":0.56856,"11.1":2.48098},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01828,"9":0.00609,"10":0.02437,"11":0.41428,"5.5":0},N:{"10":0.02442,"11":0.18317},J:{"7":0,"10":0.03726},R:{_:"0"},M:{"0":0.23954},O:{"0":2.64021},Q:{"1.2":0.02129},S:{"2.5":0},H:{"0":5.57366},L:{"0":50.10086}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-af.js b/website/www/node_modules/caniuse-lite/data/regions/alt-af.js new file mode 100644 index 000000000000..147f4c2b8384 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-af.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.00701,"19":0.02454,"22":0.00351,"24":0.07012,"26":0.02805,"28":0.00351,"29":0.00351,"30":0.10167,"31":0.00351,"33":0.04558,"34":0.00351,"35":0.04558,"36":0.01052,"37":0.00351,"38":0.01052,"39":0.00351,"40":0.02104,"43":0.16478,"46":0.00701,"47":0.01402,"48":0.01052,"49":0.26295,"50":0.01052,"51":0.01052,"53":0.01402,"54":0.02805,"55":0.04908,"56":0.12622,"57":0.01052,"58":0.02454,"59":0.00701,"60":0.01402,"61":0.02454,"62":0.01753,"63":0.09116,"64":0.01402,"65":0.03155,"66":0.02104,"67":0.08765,"68":0.01753,"69":0.05259,"70":0.07713,"71":0.10518,"72":0.08414,"73":0.09466,"74":0.14375,"75":0.08765,"76":0.12271,"77":0.1192,"78":0.15777,"79":0.30502,"80":13.71197,"81":6.73152,"83":0.02805,"84":0.01402,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 20 21 23 25 27 32 41 42 44 45 52 85"},C:{"2":0.02104,"15":0.02454,"18":0.02104,"21":0.02454,"23":0.02454,"25":0.04908,"30":0.02805,"34":0.00351,"38":0.00351,"40":0.00351,"41":0.00351,"42":0.00351,"43":0.02104,"44":0.00701,"45":0.00701,"47":0.02454,"48":0.02454,"49":0.00701,"50":0.00701,"51":0.02805,"52":0.15076,"55":0.00701,"56":0.01753,"57":0.01052,"58":0.00351,"59":0.00701,"60":0.01402,"61":0.00701,"62":0.00701,"63":0.01052,"64":0.01753,"65":0.01753,"66":0.01402,"67":0.01052,"68":0.08414,"69":0.01402,"70":0.01402,"71":0.01753,"72":0.07363,"73":0.04207,"74":1.23411,"75":1.95985,"76":0.09116,_:"3 4 5 6 7 8 9 10 11 12 13 14 16 17 19 20 22 24 26 27 28 29 31 32 33 35 36 37 39 46 53 54 77 78 3.5 3.6"},F:{"36":0.00351,"42":0.00351,"43":0.02454,"56":0.01052,"57":0.00701,"58":0.00351,"62":0.01052,"63":0.01402,"64":0.01052,"65":0.05259,"66":0.09817,"67":1.19204,"68":0.02454,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 44 45 46 47 48 49 50 51 52 53 54 55 60 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0.02805,"12.1":0.01052},G:{"8":0.00079,"3.2":0.00079,"4.0-4.1":0,"4.2-4.3":0.00157,"5.0-5.1":0.00786,"6.0-6.1":0.00236,"7.0-7.1":0.00786,"8.1-8.4":0.011,"9.0-9.2":0.00943,"9.3":0.11318,"10.0-10.2":0.02908,"10.3":0.09982,"11.0-11.2":0.06445,"11.3-11.4":0.10925,"12.0-12.1":0.13519,"12.2-12.4":0.88581,"13.0-13.1":0.18864,"13.2":0.09196,"13.3":5.14979,"13.4":0.95419},E:{"4":0,"5":0.02454,"8":0.01052,"9":0.01402,"10":0.01052,"11":0.02805,"12":0.06661,"13":0.56797,_:"0 6 7 3.1 3.2 6.1 7.1","5.1":0.32255,"9.1":0.01052,"10.1":0.04558,"11.1":0.12972,"12.1":0.17881,"13.1":0.43124},I:{"3":0.0011,"4":0.00993,_:"81","2.1":0,"2.2":0.00331,"2.3":0.0011,"4.1":0.02206,"4.2-4.3":0.04632,"4.4":0,"4.4.3-4.4.4":0.31874},B:{"12":0.04558,"13":0.02454,"14":0.02104,"15":0.02104,"16":0.03857,"17":0.09116,"18":0.86248,_:"79 80 81"},P:{"4":0.48357,"5.0-5.4":0.04115,"6.2-6.4":0.05144,"7.2-7.4":0.25722,"8.2":0.04115,"9.2":0.31895,"10.1":0.53501,"11.1":2.40755},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.12562,"9":0.06889,"10":0.07699,"11":0.53083,_:"6 7 5.5"},N:{"10":0.02442,"11":0.07792},J:{"7":0,"10":0.02597},R:{_:"0"},M:{"0":0.19479},O:{"0":1.36353},Q:{"1.2":0.02597},S:{"2.5":0.01299},H:{"0":4.23539},L:{"0":47.82383}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-an.js b/website/www/node_modules/caniuse-lite/data/regions/alt-an.js new file mode 100644 index 000000000000..a30c5799efc6 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-an.js @@ -0,0 +1 @@ +module.exports={D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":10.88349,"81":13.26743,"83":0,"84":0,_:"85"},C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":6.80399,"73":0,"74":2.7245,"75":9.52849,"76":0,"77":0,"78":0,"3.5":0,"3.6":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},G:{"8":0.00218,"3.2":0.00218,"4.0-4.1":0,"4.2-4.3":0.00436,"5.0-5.1":0.0218,"6.0-6.1":0.00654,"7.0-7.1":0.0218,"8.1-8.4":0.03052,"9.0-9.2":0.02616,"9.3":0.31389,"10.0-10.2":0.08065,"10.3":0.27683,"11.0-11.2":0.17874,"11.3-11.4":0.30299,"12.0-12.1":0.37493,"12.2-12.4":2.45663,"13.0-13.1":0.52315,"13.2":0.25504,"13.3":14.28204,"13.4":2.64628},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.34056,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.34056,"13.1":0},I:{"3":0,"4":0,_:"81","2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},B:{"12":0,"13":0,"14":3.06506,"15":0,"16":0,"17":0,"18":1.36225,_:"79 80 81"},P:{"4":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1":0.96665},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":2.7245,"5.5":0},N:{"10":0,"11":0},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0},O:{"0":0},Q:{"1.2":0},S:{"2.5":0},H:{"0":0},L:{"0":25.52194}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-as.js b/website/www/node_modules/caniuse-lite/data/regions/alt-as.js new file mode 100644 index 000000000000..a51f8bd571de --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-as.js @@ -0,0 +1 @@ +module.exports={D:{"11":0.00358,"13":0.01792,"22":0.00717,"26":0.00358,"31":0.01792,"33":0.00358,"34":0.01433,"36":0.00717,"38":0.043,"40":0.00717,"41":0.00717,"42":0.00358,"43":0.00717,"45":0.01792,"47":0.0215,"48":0.043,"49":0.24364,"50":0.00358,"51":0.00717,"53":0.06091,"54":0.00717,"55":0.02866,"56":0.01433,"57":0.03941,"58":0.02508,"59":0.00717,"60":0.01075,"61":0.01792,"62":0.02866,"63":0.06449,"64":0.01075,"65":0.03225,"66":0.01792,"67":0.043,"68":0.0215,"69":0.13257,"70":0.09316,"71":0.13974,"72":0.16482,"73":0.13257,"74":0.1899,"75":0.11466,"76":0.09316,"77":0.11107,"78":0.17557,"79":0.27231,"80":15.03069,"81":7.85752,"83":0.03225,"84":0.01433,_:"4 5 6 7 8 9 10 12 14 15 16 17 18 19 20 21 23 24 25 27 28 29 30 32 35 37 39 44 46 52 85"},C:{"4":0.00358,"17":0.00358,"33":0.05016,"36":0.00717,"43":0.03583,"45":0.00358,"47":0.01075,"48":0.01075,"49":0.00358,"50":0.00358,"51":0.00358,"52":0.09316,"53":0.00717,"54":0.00717,"55":0.01075,"56":0.02508,"57":0.01075,"58":0.00717,"59":0.00717,"60":0.01433,"61":0.00717,"62":0.00717,"63":0.01433,"64":0.01075,"65":0.01433,"66":0.01433,"67":0.00717,"68":0.04658,"69":0.01075,"70":0.01433,"71":0.01433,"72":0.04658,"73":0.02866,"74":0.73093,"75":1.29705,"76":0.06449,_:"2 3 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 37 38 39 40 41 42 44 46 77 78 3.5 3.6"},F:{"36":0.00717,"57":0.00358,"58":0.00717,"65":0.00358,"66":0.00717,"67":0.53028,"68":0.01075,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00094,"3.2":0.00094,"4.0-4.1":0,"4.2-4.3":0.00187,"5.0-5.1":0.00935,"6.0-6.1":0.00281,"7.0-7.1":0.00935,"8.1-8.4":0.0131,"9.0-9.2":0.01122,"9.3":0.13469,"10.0-10.2":0.03461,"10.3":0.11879,"11.0-11.2":0.0767,"11.3-11.4":0.13002,"12.0-12.1":0.16088,"12.2-12.4":1.05416,"13.0-13.1":0.22449,"13.2":0.10944,"13.3":6.12855,"13.4":1.13554},E:{"4":0,"6":0.02508,"8":0.00717,"9":0.00358,"10":0.00717,"11":0.0215,"12":0.06091,"13":0.96741,_:"0 5 7 3.1 3.2 6.1 7.1","5.1":0.15765,"9.1":0.01075,"10.1":0.043,"11.1":0.07883,"12.1":0.19348,"13.1":0.5482},I:{"3":0.00093,"4":0.00839,_:"81","2.1":0,"2.2":0.0028,"2.3":0.00093,"4.1":0.01864,"4.2-4.3":0.03914,"4.4":0,"4.4.3-4.4.4":0.26933},B:{"12":0.01075,"13":0.01075,"14":0.01075,"15":0.00717,"16":0.01792,"17":0.06449,"18":0.93516,_:"79 80 81"},P:{"4":0.43968,"5.0-5.4":0.03068,"6.2-6.4":0.02045,"7.2-7.4":0.15338,"8.2":0.0409,"9.2":0.27608,"10.1":0.47035,"11.1":2.46423},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.12678,"9":0.07848,"10":0.0483,"11":1.62394,_:"6 7 5.5"},N:{"10":0,"11":0.01925},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.15403},O:{"0":4.69156},Q:{"1.2":0.51986},S:{"2.5":0.16687},H:{"0":1.0694},L:{"0":43.96794}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-eu.js b/website/www/node_modules/caniuse-lite/data/regions/alt-eu.js new file mode 100644 index 000000000000..4694e1b69e98 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-eu.js @@ -0,0 +1 @@ +module.exports={D:{"22":0.0051,"33":0.0204,"34":0.0051,"38":0.0153,"40":0.02551,"41":0.0102,"43":0.0102,"48":0.0153,"49":0.56111,"51":0.0102,"53":0.02551,"54":0.03571,"55":0.0051,"56":0.0153,"57":0.0102,"58":0.0204,"59":0.0204,"60":0.0204,"61":0.04081,"62":0.0102,"63":0.04591,"64":0.0102,"65":0.05611,"66":0.04081,"67":0.04591,"68":0.02551,"69":0.06631,"70":0.15303,"71":0.18874,"72":0.16833,"73":0.17343,"74":0.07141,"75":0.09692,"76":0.10202,"77":0.09692,"78":0.15813,"79":0.33157,"80":18.54214,"81":9.60518,"83":0.02551,"84":0.0102,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 35 36 37 39 42 44 45 46 47 50 52 85"},C:{"38":0.03061,"44":0.0051,"45":0.0153,"47":0.0102,"48":0.03571,"49":0.0051,"50":0.0153,"51":0.0102,"52":0.19384,"54":0.0051,"55":0.0102,"56":0.02551,"57":0.0102,"58":0.0204,"59":0.0102,"60":0.03571,"61":0.0051,"62":0.0102,"63":0.02551,"64":0.02551,"65":0.03061,"66":0.02551,"67":0.0153,"68":0.19384,"69":0.02551,"70":0.03061,"71":0.0204,"72":0.08162,"73":0.05611,"74":1.94858,"75":3.49419,"76":0.02551,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 46 53 77 78 3.5 3.6"},F:{"36":0.0204,"56":0.0102,"57":0.0102,"58":0.0102,"65":0.0102,"66":0.0153,"67":1.66803,"68":0.03061,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.0102},G:{"8":0.00135,"3.2":0.00135,"4.0-4.1":0,"4.2-4.3":0.0027,"5.0-5.1":0.01349,"6.0-6.1":0.00405,"7.0-7.1":0.01349,"8.1-8.4":0.01889,"9.0-9.2":0.01619,"9.3":0.19428,"10.0-10.2":0.04992,"10.3":0.17134,"11.0-11.2":0.11063,"11.3-11.4":0.18753,"12.0-12.1":0.23205,"12.2-12.4":1.52047,"13.0-13.1":0.32379,"13.2":0.15785,"13.3":8.83953,"13.4":1.63785},E:{"4":0,"8":0.0051,"9":0.0102,"10":0.0102,"11":0.03061,"12":0.11222,"13":2.61171,_:"0 5 6 7 3.1 3.2 6.1 7.1","5.1":0.0153,"9.1":0.02551,"10.1":0.09182,"11.1":0.21424,"12.1":0.39278,"13.1":1.75474},I:{"3":0.00043,"4":0.00387,_:"81","2.1":0,"2.2":0.00129,"2.3":0.00043,"4.1":0.00859,"4.2-4.3":0.01804,"4.4":0,"4.4.3-4.4.4":0.12413},B:{"12":0.0102,"13":0.0102,"14":0.0153,"15":0.0153,"16":0.03571,"17":0.12753,"18":2.71373,_:"79 80 81"},P:{"4":0.13659,"5.0-5.4":0.01051,"6.2-6.4":0.02045,"7.2-7.4":0.04203,"8.2":0.02101,"9.2":0.16811,"10.1":0.3152,"11.1":3.51971},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01092,"7":0.00546,"8":0.0546,"9":0.0273,"10":0.02184,"11":1.35407,_:"5.5"},N:{"10":0,"11":0.03429},J:{"7":0,"10":0.0098},R:{_:"0"},M:{"0":0.29394},O:{"0":0.20576},Q:{"1.2":0.0147},S:{"2.5":0},H:{"0":0.30611},L:{"0":30.51158}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-na.js b/website/www/node_modules/caniuse-lite/data/regions/alt-na.js new file mode 100644 index 000000000000..6400a71e5309 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-na.js @@ -0,0 +1 @@ +module.exports={D:{"35":0.00898,"37":0.00449,"38":0.00898,"40":0.01796,"41":0.03142,"47":0.00449,"48":0.02693,"49":0.33219,"51":0.00449,"53":0.01347,"54":0.00898,"55":0.00449,"56":0.0404,"57":0.00898,"58":0.01796,"59":0.01347,"60":0.02693,"61":0.01796,"62":0.00898,"63":0.04938,"64":0.02693,"65":0.04938,"66":0.03142,"67":0.05836,"68":0.03591,"69":0.04938,"70":0.10774,"71":0.10325,"72":0.14814,"73":0.08978,"74":0.07631,"75":0.19303,"76":0.25587,"77":0.13018,"78":0.26934,"79":0.62846,"80":15.89555,"81":7.85575,"83":0.02245,"84":0.03142,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 39 42 43 44 45 46 50 52 85"},C:{"11":0.00449,"30":0.00449,"43":0.00449,"44":0.00898,"45":0.01347,"47":0.01347,"48":0.02245,"50":0.00449,"52":0.07631,"54":0.02693,"56":0.00898,"57":0.01347,"58":0.02245,"59":0.00449,"60":0.01347,"61":0.00449,"63":0.02693,"64":0.01796,"65":0.02245,"66":0.01347,"67":0.00898,"68":0.08529,"69":0.01347,"70":0.01347,"71":0.01347,"72":0.05836,"73":0.05836,"74":1.08185,"75":1.82253,"76":0.01347,_:"2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 46 49 51 53 55 62 77 78 3.5 3.6"},F:{"58":0.00449,"66":0.00449,"67":0.3681,"68":0.00898,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 60 62 63 64 65 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00288,"3.2":0.00288,"4.0-4.1":0,"4.2-4.3":0.00576,"5.0-5.1":0.02881,"6.0-6.1":0.00864,"7.0-7.1":0.02881,"8.1-8.4":0.04034,"9.0-9.2":0.03457,"9.3":0.41488,"10.0-10.2":0.1066,"10.3":0.3659,"11.0-11.2":0.23625,"11.3-11.4":0.40047,"12.0-12.1":0.49555,"12.2-12.4":3.247,"13.0-13.1":0.69146,"13.2":0.33709,"13.3":18.87697,"13.4":3.49766},E:{"4":0,"8":0.05836,"9":0.00898,"10":0.01347,"11":0.03591,"12":0.10325,"13":3.42511,_:"0 5 6 7 3.1 3.2 6.1 7.1","5.1":0.05387,"9.1":0.11671,"10.1":0.13018,"11.1":0.26934,"12.1":0.45788,"13.1":1.96618},I:{"3":0.00033,"4":0.00299,_:"81","2.1":0,"2.2":0.001,"2.3":0.00033,"4.1":0.00664,"4.2-4.3":0.01395,"4.4":0,"4.4.3-4.4.4":0.096},B:{"12":0.00898,"13":0.00898,"14":0.01347,"15":0.01347,"16":0.04489,"17":0.12569,"18":3.3039,_:"79 80 81"},P:{"4":0.03223,"5.0-5.4":0.01051,"6.2-6.4":0.02045,"7.2-7.4":0.01074,"8.2":0.01074,"9.2":0.09668,"10.1":0.16113,"11.1":2.43847},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01423,"7":0.00474,"8":0.0901,"9":0.59748,"10":0.01897,"11":1.63121,_:"5.5"},N:{"10":0,"11":0.03429},J:{"7":0,"10":0.00551},R:{_:"0"},M:{"0":0.30862},O:{"0":0.14329},Q:{"1.2":0.01653},S:{"2.5":0},H:{"0":0.11478},L:{"0":23.06075}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-oc.js b/website/www/node_modules/caniuse-lite/data/regions/alt-oc.js new file mode 100644 index 000000000000..3457edf7ec27 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-oc.js @@ -0,0 +1 @@ +module.exports={D:{"26":0.00972,"34":0.00972,"38":0.03401,"40":0.02915,"41":0.00486,"48":0.00486,"49":0.28668,"53":0.04373,"54":0.00486,"55":0.01944,"56":0.01458,"57":0.02915,"58":0.01458,"59":0.0243,"60":0.01944,"61":0.00972,"62":0.01458,"63":0.03887,"64":0.0243,"65":0.07289,"66":0.02915,"67":0.07289,"68":0.05345,"69":0.0826,"70":0.08746,"71":0.09718,"72":0.1069,"73":0.22837,"74":0.17007,"75":0.16521,"76":0.18464,"77":0.17978,"78":0.30126,"79":0.60252,"80":18.70229,"81":8.32347,"83":0.01944,"84":0.00972,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 36 37 39 42 43 44 45 46 47 50 51 52 85"},C:{"45":0.00486,"47":0.00486,"48":0.01944,"50":0.00972,"52":0.05831,"54":0.00486,"56":0.00972,"58":0.01944,"60":0.01458,"63":0.00972,"64":0.01458,"65":0.01458,"66":0.0243,"67":0.00486,"68":0.06803,"69":0.00972,"70":0.00972,"71":0.01458,"72":0.05831,"73":0.05345,"74":1.10785,"75":1.77839,"76":0.01944,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 49 51 53 55 57 59 61 62 77 78 3.5 3.6"},F:{"58":0.00486,"66":0.00486,"67":0.31098,"68":0.00486,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 60 62 63 64 65 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00245,"3.2":0.00245,"4.0-4.1":0,"4.2-4.3":0.0049,"5.0-5.1":0.02448,"6.0-6.1":0.00734,"7.0-7.1":0.02448,"8.1-8.4":0.03427,"9.0-9.2":0.02937,"9.3":0.35247,"10.0-10.2":0.09056,"10.3":0.31086,"11.0-11.2":0.20071,"11.3-11.4":0.34023,"12.0-12.1":0.421,"12.2-12.4":2.75853,"13.0-13.1":0.58744,"13.2":0.28638,"13.3":16.03719,"13.4":2.97148},E:{"4":0,"8":0.0243,"9":0.00972,"10":0.0243,"11":0.05345,"12":0.14091,"13":4.63063,_:"0 5 6 7 3.1 3.2 6.1 7.1","5.1":0.00972,"9.1":0.04859,"10.1":0.15063,"11.1":0.30126,"12.1":0.52963,"13.1":2.01649},I:{"3":0.00055,"4":0.00494,_:"81","2.1":0,"2.2":0.00165,"2.3":0.00055,"4.1":0.01099,"4.2-4.3":0.02307,"4.4":0,"4.4.3-4.4.4":0.15875},B:{"12":0.00486,"13":0.00972,"14":0.01458,"15":0.01458,"16":0.03887,"17":0.11662,"18":2.9397,_:"79 80 81"},P:{"4":0.15099,"5.0-5.4":0.01078,"6.2-6.4":0.02045,"7.2-7.4":0.03235,"8.2":0.02157,"9.2":0.15099,"10.1":0.32355,"11.1":3.27862},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"9":0.03135,"10":0.00784,"11":1.90441,_:"6 7 8 5.5"},N:{"10":0,"11":0.03429},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.32388},O:{"0":0.26733},Q:{"1.2":0.09768},S:{"2.5":0},H:{"0":0.24336},L:{"0":22.17409}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-sa.js b/website/www/node_modules/caniuse-lite/data/regions/alt-sa.js new file mode 100644 index 000000000000..d46bac320609 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-sa.js @@ -0,0 +1 @@ +module.exports={D:{"22":0.01083,"26":0.00542,"34":0.01083,"36":0.01625,"38":0.04875,"41":0.01625,"43":0.00542,"48":0.00542,"49":0.39002,"51":0.01083,"53":0.04334,"54":0.01083,"55":0.00542,"56":0.00542,"57":0.00542,"58":0.02709,"59":0.00542,"60":0.00542,"61":0.02167,"62":0.01625,"63":0.04875,"64":0.01083,"65":0.04334,"66":0.02709,"67":0.05417,"68":0.01625,"69":0.03792,"70":0.10292,"71":0.14084,"72":0.11917,"73":0.10292,"74":0.08126,"75":0.09209,"76":0.10292,"77":0.11376,"78":0.18418,"79":0.31419,"80":26.66789,"81":15.73097,"83":0.04875,"84":0.02167,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 27 28 29 30 31 32 33 35 37 39 40 42 44 45 46 47 50 52 85"},C:{"47":0.00542,"48":0.01083,"52":0.05959,"56":0.01083,"60":0.01083,"63":0.01083,"64":0.01083,"65":0.01625,"66":0.01625,"67":0.00542,"68":0.05417,"69":0.01083,"70":0.01083,"71":0.01083,"72":0.03792,"73":0.02709,"74":0.94798,"75":1.65219,"76":0.02167,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 51 53 54 55 57 58 59 61 62 77 78 3.5 3.6"},F:{"36":0.00542,"57":0.00542,"58":0.00542,"66":0.00542,"67":1.35425,"68":0.0325,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 60 62 63 64 65 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},G:{"8":0.00042,"3.2":0.00042,"4.0-4.1":0,"4.2-4.3":0.00084,"5.0-5.1":0.00421,"6.0-6.1":0.00126,"7.0-7.1":0.00421,"8.1-8.4":0.00589,"9.0-9.2":0.00505,"9.3":0.06056,"10.0-10.2":0.01556,"10.3":0.05341,"11.0-11.2":0.03449,"11.3-11.4":0.05846,"12.0-12.1":0.07233,"12.2-12.4":0.47396,"13.0-13.1":0.10093,"13.2":0.0492,"13.3":2.75545,"13.4":0.51055},E:{"4":0,"10":0.00542,"11":0.02167,"12":0.07042,"13":0.75296,_:"0 5 6 7 8 9 3.1 3.2 6.1 7.1","5.1":0.1896,"9.1":0.00542,"10.1":0.05417,"11.1":0.11376,"12.1":0.2221,"13.1":0.83964},I:{"3":0.00035,"4":0.00316,_:"81","2.1":0,"2.2":0.00105,"2.3":0.00035,"4.1":0.00703,"4.2-4.3":0.01477,"4.4":0,"4.4.3-4.4.4":0.1016},B:{"12":0.00542,"13":0.00542,"14":0.01083,"15":0.01083,"16":0.01083,"17":0.04875,"18":0.80713,_:"79 80 81"},P:{"4":0.2491,"5.0-5.4":0.01078,"6.2-6.4":0.02045,"7.2-7.4":0.11417,"8.2":0.02076,"9.2":0.10379,"10.1":0.21796,"11.1":1.76446},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.04015,"9":0.01147,"10":0.01147,"11":0.32693,_:"6 7 5.5"},N:{"10":0,"11":0.04583},J:{"7":0,"10":0},R:{_:"0"},M:{"0":0.09166},O:{"0":0.07791},Q:{"1.2":0},S:{"2.5":0},H:{"0":0.11715},L:{"0":39.18348}}; diff --git a/website/www/node_modules/caniuse-lite/data/regions/alt-ww.js b/website/www/node_modules/caniuse-lite/data/regions/alt-ww.js new file mode 100644 index 000000000000..952607021056 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/data/regions/alt-ww.js @@ -0,0 +1 @@ +module.exports={D:{"13":0.00867,"22":0.00434,"26":0.00434,"30":0.00434,"31":0.00867,"33":0.00867,"34":0.00867,"35":0.00434,"36":0.00434,"38":0.02601,"40":0.01734,"41":0.02168,"43":0.01301,"45":0.00867,"47":0.01301,"48":0.03035,"49":0.35547,"50":0.00434,"51":0.00867,"53":0.03902,"54":0.01301,"55":0.01734,"56":0.02601,"57":0.02168,"58":0.02168,"59":0.01301,"60":0.01734,"61":0.02601,"62":0.01734,"63":0.05636,"64":0.01734,"65":0.04335,"66":0.02601,"67":0.05202,"68":0.02601,"69":0.0867,"70":0.11271,"71":0.14306,"72":0.15606,"73":0.13439,"74":0.12138,"75":0.13005,"76":0.14306,"77":0.11705,"78":0.19941,"79":0.39015,"80":16.89783,"81":8.70902,"83":0.02601,"84":0.01734,_:"4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 23 24 25 27 28 29 32 37 39 42 44 46 52 85"},C:{"33":0.02168,"38":0.00867,"43":0.01734,"44":0.00434,"45":0.00867,"47":0.01301,"48":0.02168,"50":0.00867,"51":0.00434,"52":0.11271,"53":0.00434,"54":0.01301,"55":0.00867,"56":0.02168,"57":0.00867,"58":0.01301,"59":0.00867,"60":0.02168,"61":0.00434,"62":0.00434,"63":0.02168,"64":0.01734,"65":0.02168,"66":0.01734,"67":0.01301,"68":0.10838,"69":0.01301,"70":0.01734,"71":0.01734,"72":0.06069,"73":0.04335,"74":1.16178,"75":2.01578,"76":0.03902,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 41 42 46 49 77 78 3.5 3.6"},F:{"36":0.00867,"56":0.00434,"57":0.00434,"58":0.00867,"65":0.00867,"66":0.01301,"67":0.90602,"68":0.01734,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 60 62 63 64 9.5-9.6 10.5 10.6 11.1 11.5 11.6","10.0-10.1":0,"12.1":0.00434},G:{"8":0.0015,"3.2":0.0015,"4.0-4.1":0,"4.2-4.3":0.00301,"5.0-5.1":0.01504,"6.0-6.1":0.00451,"7.0-7.1":0.01504,"8.1-8.4":0.02106,"9.0-9.2":0.01805,"9.3":0.21662,"10.0-10.2":0.05566,"10.3":0.19104,"11.0-11.2":0.12335,"11.3-11.4":0.2091,"12.0-12.1":0.25874,"12.2-12.4":1.69533,"13.0-13.1":0.36103,"13.2":0.176,"13.3":9.85609,"13.4":1.82621},E:{"4":0,"6":0.00867,"8":0.02168,"9":0.00867,"10":0.01301,"11":0.03035,"12":0.0867,"13":2.04179,_:"0 5 7 3.1 3.2 6.1 7.1","5.1":0.09971,"9.1":0.04335,"10.1":0.08237,"11.1":0.16907,"12.1":0.31646,"13.1":1.24848},I:{"3":0.00062,"4":0.00559,_:"81","2.1":0,"2.2":0.00186,"2.3":0.00062,"4.1":0.01242,"4.2-4.3":0.02608,"4.4":0,"4.4.3-4.4.4":0.17945},B:{"12":0.00867,"13":0.00867,"14":0.01301,"15":0.01301,"16":0.03035,"17":0.09537,"18":2.00277,_:"79 80 81"},P:{"4":0.26873,"5.0-5.4":0.01034,"6.2-6.4":0.01034,"7.2-7.4":0.09302,"8.2":0.03101,"9.2":0.19638,"10.1":0.33075,"11.1":2.64601},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00546,"8":0.08734,"9":0.21836,"10":0.02729,"11":1.43023,_:"7 5.5"},N:{"10":0.02442,"11":0.02266},J:{"7":0,"10":0.00567},R:{_:"0"},M:{"0":0.22664},O:{"0":1.97743},Q:{"1.2":0.21531},S:{"2.5":0.06799},H:{"0":0.69198},L:{"0":34.79786}}; diff --git a/website/www/node_modules/caniuse-lite/package.json b/website/www/node_modules/caniuse-lite/package.json new file mode 100644 index 000000000000..cee05c2fe701 --- /dev/null +++ b/website/www/node_modules/caniuse-lite/package.json @@ -0,0 +1,27 @@ +{ + "name": "caniuse-lite", + "version": "1.0.30001055", + "description": "A smaller version of caniuse-db, with only the essentials!", + "main": "dist/unpacker/index.js", + "scripts": { + "prepublish": "del-cli dist && babel src/unpacker -d dist/unpacker && mkdir dist/lib && babel src/lib/statuses.js -o dist/lib/statuses.js && babel src/lib/supported.js -o dist/lib/supported.js" + }, + "files": [ + "data", + "dist" + ], + "keywords": [ + "support", + "css", + "js", + "html5", + "svg" + ], + "author": { + "name": "Ben Briggs", + "email": "beneb.info@gmail.com", + "url": "http://beneb.info" + }, + "repository": "ben-eb/caniuse-lite", + "license": "CC-BY-4.0" +} diff --git a/website/www/node_modules/chalk/index.js b/website/www/node_modules/chalk/index.js new file mode 100644 index 000000000000..1cc5fa89a951 --- /dev/null +++ b/website/www/node_modules/chalk/index.js @@ -0,0 +1,228 @@ +'use strict'; +const escapeStringRegexp = require('escape-string-regexp'); +const ansiStyles = require('ansi-styles'); +const stdoutColor = require('supports-color').stdout; + +const template = require('./templates.js'); + +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); + +const styles = Object.create(null); + +function applyOptions(obj, options) { + options = options || {}; + + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} + +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + + chalk.template.constructor = Chalk; + + return chalk.template; + } + + applyOptions(this, options); +} + +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} + +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; + +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, styles); + +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + + builder._styles = _styles; + builder._empty = _empty; + + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; +} + +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; + } + + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; + + return str; +} + +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript diff --git a/website/www/node_modules/chalk/index.js.flow b/website/www/node_modules/chalk/index.js.flow new file mode 100644 index 000000000000..622caaa2e803 --- /dev/null +++ b/website/www/node_modules/chalk/index.js.flow @@ -0,0 +1,93 @@ +// @flow strict + +type TemplateStringsArray = $ReadOnlyArray; + +export type Level = $Values<{ + None: 0, + Basic: 1, + Ansi256: 2, + TrueColor: 3 +}>; + +export type ChalkOptions = {| + enabled?: boolean, + level?: Level +|}; + +export type ColorSupport = {| + level: Level, + hasBasic: boolean, + has256: boolean, + has16m: boolean +|}; + +export interface Chalk { + (...text: string[]): string, + (text: TemplateStringsArray, ...placeholders: string[]): string, + constructor(options?: ChalkOptions): Chalk, + enabled: boolean, + level: Level, + rgb(r: number, g: number, b: number): Chalk, + hsl(h: number, s: number, l: number): Chalk, + hsv(h: number, s: number, v: number): Chalk, + hwb(h: number, w: number, b: number): Chalk, + bgHex(color: string): Chalk, + bgKeyword(color: string): Chalk, + bgRgb(r: number, g: number, b: number): Chalk, + bgHsl(h: number, s: number, l: number): Chalk, + bgHsv(h: number, s: number, v: number): Chalk, + bgHwb(h: number, w: number, b: number): Chalk, + hex(color: string): Chalk, + keyword(color: string): Chalk, + + +reset: Chalk, + +bold: Chalk, + +dim: Chalk, + +italic: Chalk, + +underline: Chalk, + +inverse: Chalk, + +hidden: Chalk, + +strikethrough: Chalk, + + +visible: Chalk, + + +black: Chalk, + +red: Chalk, + +green: Chalk, + +yellow: Chalk, + +blue: Chalk, + +magenta: Chalk, + +cyan: Chalk, + +white: Chalk, + +gray: Chalk, + +grey: Chalk, + +blackBright: Chalk, + +redBright: Chalk, + +greenBright: Chalk, + +yellowBright: Chalk, + +blueBright: Chalk, + +magentaBright: Chalk, + +cyanBright: Chalk, + +whiteBright: Chalk, + + +bgBlack: Chalk, + +bgRed: Chalk, + +bgGreen: Chalk, + +bgYellow: Chalk, + +bgBlue: Chalk, + +bgMagenta: Chalk, + +bgCyan: Chalk, + +bgWhite: Chalk, + +bgBlackBright: Chalk, + +bgRedBright: Chalk, + +bgGreenBright: Chalk, + +bgYellowBright: Chalk, + +bgBlueBright: Chalk, + +bgMagentaBright: Chalk, + +bgCyanBright: Chalk, + +bgWhiteBrigh: Chalk, + + supportsColor: ColorSupport +}; + +declare module.exports: Chalk; diff --git a/website/www/node_modules/chalk/license b/website/www/node_modules/chalk/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/chalk/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/chalk/node_modules/ansi-styles/index.js b/website/www/node_modules/chalk/node_modules/ansi-styles/index.js new file mode 100644 index 000000000000..90a871c4d78f --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/ansi-styles/index.js @@ -0,0 +1,165 @@ +'use strict'; +const colorConvert = require('color-convert'); + +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; + +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; + +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Fix humans + styles.color.grey = styles.color.gray; + + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; + + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; + + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; + + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } + + const suite = colorConvert[key]; + + if (key === 'ansi16') { + key = 'ansi'; + } + + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } + + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/website/www/node_modules/chalk/node_modules/ansi-styles/license b/website/www/node_modules/chalk/node_modules/ansi-styles/license new file mode 100644 index 000000000000..e7af2f77107d --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/ansi-styles/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/www/node_modules/chalk/node_modules/ansi-styles/package.json b/website/www/node_modules/chalk/node_modules/ansi-styles/package.json new file mode 100644 index 000000000000..65edb48c399c --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/ansi-styles/package.json @@ -0,0 +1,56 @@ +{ + "name": "ansi-styles", + "version": "3.2.1", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "color-convert": "^1.9.0" + }, + "devDependencies": { + "ava": "*", + "babel-polyfill": "^6.23.0", + "svg-term-cli": "^2.1.1", + "xo": "*" + }, + "ava": { + "require": "babel-polyfill" + } +} diff --git a/website/www/node_modules/chalk/node_modules/ansi-styles/readme.md b/website/www/node_modules/chalk/node_modules/ansi-styles/readme.md new file mode 100644 index 000000000000..3158e2df59ce --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/ansi-styles/readme.md @@ -0,0 +1,147 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + + +## Install + +``` +$ npm install ansi-styles +``` + + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 16/256/truecolor +// NOTE: If conversion goes to 16 colors or 256 colors, the original color +// may be degraded to fit that color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); +console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); +console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close); +``` + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `gray` ("bright black") +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code +style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code + +style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code +style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code + +style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code +style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code +``` + + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/website/www/node_modules/chalk/node_modules/color-convert/CHANGELOG.md b/website/www/node_modules/chalk/node_modules/color-convert/CHANGELOG.md new file mode 100644 index 000000000000..0a7bce4fd570 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/CHANGELOG.md @@ -0,0 +1,54 @@ +# 1.0.0 - 2016-01-07 + +- Removed: unused speed test +- Added: Automatic routing between previously unsupported conversions +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Removed: `convert()` class +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Changed: all functions to lookup dictionary +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Changed: `ansi` to `ansi256` +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Fixed: argument grouping for functions requiring only one argument +([#27](https://github.com/Qix-/color-convert/pull/27)) + +# 0.6.0 - 2015-07-23 + +- Added: methods to handle +[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors: + - rgb2ansi16 + - rgb2ansi + - hsl2ansi16 + - hsl2ansi + - hsv2ansi16 + - hsv2ansi + - hwb2ansi16 + - hwb2ansi + - cmyk2ansi16 + - cmyk2ansi + - keyword2ansi16 + - keyword2ansi + - ansi162rgb + - ansi162hsl + - ansi162hsv + - ansi162hwb + - ansi162cmyk + - ansi162keyword + - ansi2rgb + - ansi2hsl + - ansi2hsv + - ansi2hwb + - ansi2cmyk + - ansi2keyword +([#18](https://github.com/harthur/color-convert/pull/18)) + +# 0.5.3 - 2015-06-02 + +- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]` +([#15](https://github.com/harthur/color-convert/issues/15)) + +--- + +Check out commit logs for older releases diff --git a/website/www/node_modules/chalk/node_modules/color-convert/LICENSE b/website/www/node_modules/chalk/node_modules/color-convert/LICENSE new file mode 100644 index 000000000000..5b4c386f9269 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2016 Heather Arthur + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/website/www/node_modules/chalk/node_modules/color-convert/README.md b/website/www/node_modules/chalk/node_modules/color-convert/README.md new file mode 100644 index 000000000000..d4b08fc36994 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/README.md @@ -0,0 +1,68 @@ +# color-convert + +[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert) + +Color-convert is a color conversion library for JavaScript and node. +It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest): + +```js +var convert = require('color-convert'); + +convert.rgb.hsl(140, 200, 100); // [96, 48, 59] +convert.keyword.rgb('blue'); // [0, 0, 255] + +var rgbChannels = convert.rgb.channels; // 3 +var cmykChannels = convert.cmyk.channels; // 4 +var ansiChannels = convert.ansi16.channels; // 1 +``` + +# Install + +```console +$ npm install color-convert +``` + +# API + +Simply get the property of the _from_ and _to_ conversion that you're looking for. + +All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function. + +All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha). + +```js +var convert = require('color-convert'); + +// Hex to LAB +convert.hex.lab('DEADBF'); // [ 76, 21, -2 ] +convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ] + +// RGB to CMYK +convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ] +convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ] +``` + +### Arrays +All functions that accept multiple arguments also support passing an array. + +Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.) + +```js +var convert = require('color-convert'); + +convert.rgb.hex(123, 45, 67); // '7B2D43' +convert.rgb.hex([123, 45, 67]); // '7B2D43' +``` + +## Routing + +Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex). + +Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js). + +# Contribute + +If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request. + +# License +Copyright © 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE). diff --git a/website/www/node_modules/chalk/node_modules/color-convert/conversions.js b/website/www/node_modules/chalk/node_modules/color-convert/conversions.js new file mode 100644 index 000000000000..32172007ec0b --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/conversions.js @@ -0,0 +1,868 @@ +/* MIT license */ +var cssKeywords = require('color-name'); + +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; + } +} + +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; + +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } + + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } + + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } + + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } +} + +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + + h = Math.min(h * 60, 360); + + if (h < 0) { + h += 360; + } + + l = (min + max) / 2; + + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; +}; + +convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; + + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + + return [ + h * 360, + s * 100, + v * 100 + ]; +}; + +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); + + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +}; + +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + + return [c * 100, m * 100, y * 100, k * 100]; +}; + +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); +} + +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + + var currentClosestDistance = Infinity; + var currentClosestKeyword; + + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; + + // Compute comparative distance + var distance = comparativeDistance(rgb, value); + + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } + + return currentClosestKeyword; +}; + +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; + +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; +}; + +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; + + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } + + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + + rgb[i] = val * 255; + } + + return rgb; +}; + +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + + return [h, sv * 100, v * 100]; +}; + +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; + + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; + +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + + return [h, sl * 100, l * 100]; +}; + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + + if ((i & 0x01) !== 0) { + f = 1 - f; + } + + n = wh + f * (v - wh); // linear interpolation + + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +}; + +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; + + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; + + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + + x *= 95.047; + y *= 100; + z *= 108.883; + + return [x, y, z]; +}; + +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + + if (h < 0) { + h += 360; + } + + c = Math.sqrt(a * a + b * b); + + return [l, c, h]; +}; + +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + + return [l, a, b]; +}; + +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + + value = Math.round(value / 50); + + if (value === 0) { + return 30; + } + + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + + if (value === 2) { + ansi += 60; + } + + return ansi; +}; + +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; + +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } + + return Math.round(((r - 8) / 247) * 24) + 232; + } + + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); + + return ansi; +}; + +convert.ansi16.rgb = function (args) { + var color = args % 10; + + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + + color = color / 10.5 * 255; + + return [color, color, color]; + } + + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; + + return [r, g, b]; +}; + +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } + + args -= 16; + + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; + + return [r, g, b]; +}; + +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + + var colorString = match[0]; + + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } + + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; + + return [r, g, b]; +}; + +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; + + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } + + hue /= 6; + hue %= 1; + + return [hue * 360, chroma * 100, grayscale * 100]; +}; + +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; + + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } + + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } + + return [hsl[0], c * 100, f * 100]; +}; + +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; + + var c = s * v; + var f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); + } + + return [hsv[0], c * 100, f * 100]; +}; + +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } + + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; + + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + + mg = (1.0 - c) * g; + + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; + +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var v = c + g * (1.0 - c); + var f = 0; + + if (v > 0.0) { + f = c / v; + } + + return [hcg[0], f * 100, v * 100]; +}; + +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; + + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + + return [hcg[0], s * 100, l * 100]; +}; + +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; + +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; + + if (c < 1) { + g = (v - c) / (1 - c); + } + + return [hwb[0], c * 100, g * 100]; +}; + +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; + +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; + +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; + +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; + +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; + +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; + +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; + +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; diff --git a/website/www/node_modules/chalk/node_modules/color-convert/index.js b/website/www/node_modules/chalk/node_modules/color-convert/index.js new file mode 100644 index 000000000000..e65b5d775da3 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/index.js @@ -0,0 +1,78 @@ +var conversions = require('./conversions'); +var route = require('./route'); + +var convert = {}; + +var models = Object.keys(conversions); + +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + return fn(args); + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } + + var result = fn(args); + + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +models.forEach(function (fromModel) { + convert[fromModel] = {}; + + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); + + var routes = route(fromModel); + var routeModels = Object.keys(routes); + + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); + +module.exports = convert; diff --git a/website/www/node_modules/chalk/node_modules/color-convert/package.json b/website/www/node_modules/chalk/node_modules/color-convert/package.json new file mode 100644 index 000000000000..dfbc471407ff --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/package.json @@ -0,0 +1,46 @@ +{ + "name": "color-convert", + "description": "Plain color conversion functions", + "version": "1.9.3", + "author": "Heather Arthur ", + "license": "MIT", + "repository": "Qix-/color-convert", + "scripts": { + "pretest": "xo", + "test": "node test/basic.js" + }, + "keywords": [ + "color", + "colour", + "convert", + "converter", + "conversion", + "rgb", + "hsl", + "hsv", + "hwb", + "cmyk", + "ansi", + "ansi16" + ], + "files": [ + "index.js", + "conversions.js", + "css-keywords.js", + "route.js" + ], + "xo": { + "rules": { + "default-case": 0, + "no-inline-comments": 0, + "operator-linebreak": 0 + } + }, + "devDependencies": { + "chalk": "1.1.1", + "xo": "0.11.2" + }, + "dependencies": { + "color-name": "1.1.3" + } +} diff --git a/website/www/node_modules/chalk/node_modules/color-convert/route.js b/website/www/node_modules/chalk/node_modules/color-convert/route.js new file mode 100644 index 000000000000..0a1fdea689e2 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-convert/route.js @@ -0,0 +1,97 @@ +var conversions = require('./conversions'); + +/* + this function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. +*/ + +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; +} + +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop + + graph[fromModel].distance = 0; + + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); + + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; +} + +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} + +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; + + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + + fn.conversion = path; + return fn; +} + +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; + + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; + + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; + diff --git a/website/www/node_modules/chalk/node_modules/color-name/.eslintrc.json b/website/www/node_modules/chalk/node_modules/color-name/.eslintrc.json new file mode 100644 index 000000000000..c50c250446ee --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/.eslintrc.json @@ -0,0 +1,43 @@ +{ + "env": { + "browser": true, + "node": true, + "commonjs": true, + "es6": true + }, + "extends": "eslint:recommended", + "rules": { + "strict": 2, + "indent": 0, + "linebreak-style": 0, + "quotes": 0, + "semi": 0, + "no-cond-assign": 1, + "no-constant-condition": 1, + "no-duplicate-case": 1, + "no-empty": 1, + "no-ex-assign": 1, + "no-extra-boolean-cast": 1, + "no-extra-semi": 1, + "no-fallthrough": 1, + "no-func-assign": 1, + "no-global-assign": 1, + "no-implicit-globals": 2, + "no-inner-declarations": ["error", "functions"], + "no-irregular-whitespace": 2, + "no-loop-func": 1, + "no-multi-str": 1, + "no-mixed-spaces-and-tabs": 1, + "no-proto": 1, + "no-sequences": 1, + "no-throw-literal": 1, + "no-unmodified-loop-condition": 1, + "no-useless-call": 1, + "no-void": 1, + "no-with": 2, + "wrap-iife": 1, + "no-redeclare": 1, + "no-unused-vars": ["error", { "vars": "all", "args": "none" }], + "no-sparse-arrays": 1 + } +} diff --git a/website/www/node_modules/chalk/node_modules/color-name/.npmignore b/website/www/node_modules/chalk/node_modules/color-name/.npmignore new file mode 100644 index 000000000000..3854c07dc6e5 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/.npmignore @@ -0,0 +1,107 @@ +//this will affect all the git repos +git config --global core.excludesfile ~/.gitignore + + +//update files since .ignore won't if already tracked +git rm --cached + +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +# Icon? +ehthumbs.db +Thumbs.db +.cache +.project +.settings +.tmproj +*.esproj +nbproject + +# Numerous always-ignore extensions # +##################################### +*.diff +*.err +*.orig +*.rej +*.swn +*.swo +*.swp +*.vi +*~ +*.sass-cache +*.grunt +*.tmp + +# Dreamweaver added files # +########################### +_notes +dwsync.xml + +# Komodo # +########################### +*.komodoproject +.komodotools + +# Node # +##################### +node_modules + +# Bower # +##################### +bower_components + +# Folders to ignore # +##################### +.hg +.svn +.CVS +intermediate +publish +.idea +.graphics +_test +_archive +uploads +tmp + +# Vim files to ignore # +####################### +.VimballRecord +.netrwhist + +bundle.* + +_demo \ No newline at end of file diff --git a/website/www/node_modules/chalk/node_modules/color-name/LICENSE b/website/www/node_modules/chalk/node_modules/color-name/LICENSE new file mode 100644 index 000000000000..4d9802a89e29 --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/LICENSE @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/website/www/node_modules/chalk/node_modules/color-name/README.md b/website/www/node_modules/chalk/node_modules/color-name/README.md new file mode 100644 index 000000000000..3611a6b523fe --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/README.md @@ -0,0 +1,11 @@ +A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors. + +[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/) + + +```js +var colors = require('color-name'); +colors.red //[255,0,0] +``` + + diff --git a/website/www/node_modules/chalk/node_modules/color-name/index.js b/website/www/node_modules/chalk/node_modules/color-name/index.js new file mode 100644 index 000000000000..e42aa68a542d --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/index.js @@ -0,0 +1,152 @@ +'use strict' + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; diff --git a/website/www/node_modules/chalk/node_modules/color-name/package.json b/website/www/node_modules/chalk/node_modules/color-name/package.json new file mode 100644 index 000000000000..d061123ef02f --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/package.json @@ -0,0 +1,25 @@ +{ + "name": "color-name", + "version": "1.1.3", + "description": "A list of color names and its values", + "main": "index.js", + "scripts": { + "test": "node test.js" + }, + "repository": { + "type": "git", + "url": "git@github.com:dfcreative/color-name.git" + }, + "keywords": [ + "color-name", + "color", + "color-keyword", + "keyword" + ], + "author": "DY ", + "license": "MIT", + "bugs": { + "url": "https://github.com/dfcreative/color-name/issues" + }, + "homepage": "https://github.com/dfcreative/color-name" +} diff --git a/website/www/node_modules/chalk/node_modules/color-name/test.js b/website/www/node_modules/chalk/node_modules/color-name/test.js new file mode 100644 index 000000000000..7a08746215ed --- /dev/null +++ b/website/www/node_modules/chalk/node_modules/color-name/test.js @@ -0,0 +1,7 @@ +'use strict' + +var names = require('./'); +var assert = require('assert'); + +assert.deepEqual(names.red, [255,0,0]); +assert.deepEqual(names.aliceblue, [240,248,255]); diff --git a/website/www/node_modules/chalk/package.json b/website/www/node_modules/chalk/package.json new file mode 100644 index 000000000000..bc324685a762 --- /dev/null +++ b/website/www/node_modules/chalk/package.json @@ -0,0 +1,71 @@ +{ + "name": "chalk", + "version": "2.4.2", + "description": "Terminal string styling done right", + "license": "MIT", + "repository": "chalk/chalk", + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava", + "bench": "matcha benchmark.js", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "files": [ + "index.js", + "templates.js", + "types/index.d.ts", + "index.js.flow" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "str", + "ansi", + "style", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "devDependencies": { + "ava": "*", + "coveralls": "^3.0.0", + "execa": "^0.9.0", + "flow-bin": "^0.68.0", + "import-fresh": "^2.0.0", + "matcha": "^0.7.0", + "nyc": "^11.0.2", + "resolve-from": "^4.0.0", + "typescript": "^2.5.3", + "xo": "*" + }, + "types": "types/index.d.ts", + "xo": { + "envs": [ + "node", + "mocha" + ], + "ignores": [ + "test/_flow.js" + ] + } +} diff --git a/website/www/node_modules/chalk/readme.md b/website/www/node_modules/chalk/readme.md new file mode 100644 index 000000000000..d298e2c48d64 --- /dev/null +++ b/website/www/node_modules/chalk/readme.md @@ -0,0 +1,314 @@ +

    +
    +
    + Chalk +
    +
    +
    +

    + +> Terminal string styling done right + +[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs) + +### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0) + + + + +## Highlights + +- Expressive API +- Highly performant +- Ability to nest styles +- [256/Truecolor color support](#256-and-truecolor-color-support) +- Auto-detects color support +- Doesn't extend `String.prototype` +- Clean and focused +- Actively maintained +- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017 + + +## Install + +```console +$ npm install chalk +``` + + + + + + +## Usage + +```js +const chalk = require('chalk'); + +console.log(chalk.blue('Hello world!')); +``` + +Chalk comes with an easy to use composable API where you just chain and nest the styles you want. + +```js +const chalk = require('chalk'); +const log = console.log; + +// Combine styled and normal strings +log(chalk.blue('Hello') + ' World' + chalk.red('!')); + +// Compose multiple styles using the chainable API +log(chalk.blue.bgRed.bold('Hello world!')); + +// Pass in multiple arguments +log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')); + +// Nest styles +log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!')); + +// Nest styles of the same type even (color, underline, background) +log(chalk.green( + 'I am a green line ' + + chalk.blue.underline.bold('with a blue substring') + + ' that becomes green again!' +)); + +// ES2015 template literal +log(` +CPU: ${chalk.red('90%')} +RAM: ${chalk.green('40%')} +DISK: ${chalk.yellow('70%')} +`); + +// ES2015 tagged template literal +log(chalk` +CPU: {red ${cpu.totalPercent}%} +RAM: {green ${ram.used / ram.total * 100}%} +DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} +`); + +// Use RGB colors in terminal emulators that support it. +log(chalk.keyword('orange')('Yay for orange colored text!')); +log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); +log(chalk.hex('#DEADED').bold('Bold gray!')); +``` + +Easily define your own themes: + +```js +const chalk = require('chalk'); + +const error = chalk.bold.red; +const warning = chalk.keyword('orange'); + +console.log(error('Error!')); +console.log(warning('Warning!')); +``` + +Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args): + +```js +const name = 'Sindre'; +console.log(chalk.green('Hello %s'), name); +//=> 'Hello Sindre' +``` + + +## API + +### chalk.`